【问题标题】:How to share a general state when using CombineReducers with Redux将 CombineReducers 与 Redux 一起使用时如何共享一般状态
【发布时间】:2017-03-14 09:14:01
【问题描述】:

我真的是 Redux 的新手,我想分享一个关于我应该如何实现它的问题。

我确实有一个用 React 编写的完整应用程序,其中每个页面代表一个 React 组件。 每个 React 组件都有自己的 Redux Reducer 和操作。

我们举一个非常简单的例子,HomePage 组件。

class HomePage extends React.Component {
    render() {
        return (
            <h1>Home Page</h1>
        )
    }
}

我确实有一个 reducer 可以修改当前状态,表明应用程序已完全引导。

export default function homePageReducer(state = {appBootstrapped: false}, action) {
    switch (action.type) {
        case 'APP_BOOTSTRAPPED':
            state = { appBootstrapped: true }
        default:
            return state;
    }
}

Redux 操作如下:

export function SetApplicationBootstrapped() {
    return { type: 'APP_BOOTSTRAPPED' }
}

我的组件适应了上面的 Redux 实现:

function mapStateToProps(state, ownProps) {
    return {
        homePage: state.homePageReducer
    }
}

export default connect(mapStateToProps)(HomePage);

现在,在我的组件中,我可以调用我的操作来通知 React 我的应用程序已完全引导。 但是,感觉不对,因为如果我有 10 个页面,每个页面由一个组件表示,并且每个组件都有自己的 reducer/actions,我需要实现调用以在每个 reducer 中引导应用程序?

这是正常的 Redux 方法吗?

如果没有,我该如何处理?

基本想法是我想要一个组件,代表一个加载屏幕,一旦应用程序启动,我想隐藏它。 但是由于每个组件只能访问它自己的操作,我无法更改另一个组件的状态。我对“共享”状态的想法有点迷茫,因为在我看来,即使使用 combineReducers,每个减速器都管理自己的状态,不允许访问另一个减速器的状态。

【问题讨论】:

    标签: reactjs redux react-redux


    【解决方案1】:

    不知道你为什么限制每个组件只能访问自己的reducer和action。例如,在您的情况下,我认为您仍然可以拥有共享状态

    {
      shared: { ... },
      pageA: { ... },
      pageB: { ... },
      pageC: { ... }
    }
    

    所以现在您可以将appBootstrapped 放入shared,并为此创建一个共享操作。


    你只需要创建一个顶级组件,所以你只能调度SetApplicationBootstrapped一次。

    另外,你不应该改变你的 reducer 中的状态:

    case 'APP_BOOTSTRAPPED':
        state = { appBootstrapped: true }
    

    在case语句中直接返回状态对象

    case 'APP_BOOTSTRAPPED':
        return { appBootstrapped: true }
    

    【讨论】:

    • 我觉得这里有个小误会。每个页面(组件)在渲染之前都会有一些逻辑,例如从 API 获取数据。每个页面都会执行另一个 API 调用。只有当 API 调用完成时,我才想调度应用程序已引导的操作设置。我看不出如何使用top-level-component 来做到这一点。那么,我怎样才能从每个组件中设置我的应用程序被引导而不在每个组件中实现加载屏幕的状态呢?所以组件 X 必须改变允许组件 Y 重新渲染的状态。
    • 我只用一个reducer就可以轻松解决这个问题。这样我只有一个状态,但我想知道这是否是正确的方法。
    • 感谢更新,这是否意味着在mapStateToProps中,每个组件都必须访问Shared状态,并调用action隐藏加载屏幕?
    • 是的,我不知道你的项目的结构,也许为共享的东西创建另一个文件夹,组件导入它
    猜你喜欢
    • 2019-03-28
    • 2023-03-17
    • 2023-03-21
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多