【问题标题】:Redux accessing state from actionRedux 从动作中访问状态
【发布时间】:2018-03-27 20:52:22
【问题描述】:

我已经阅读了多个在线资源,建议在您的操作中尽可能避免访问状态,但是我想知道在发出另一个异步请求之前检查我的状态中是否已经存在数据时这样做是否可以接受?目前我的行动是这样的:

export const setCategory = (id) => {
    const state = store.getState();
    const categories = state.display.categories;
    const category = categories.find(category => category.id === id);
    const categoryVids = category ? category.videos : {};
    if(Object.keys(categoryVids).length <= 0) { 
        return dispatch => {
            //Do some async stuff
        }
    }
}

对我来说,在这里访问状态似乎更合乎逻辑。将此逻辑移至组件是否被认为是更好的做法?

【问题讨论】:

  • 只是一个警告,const categoryVids = categories.find(category =&gt; category.id === id).videos; 在找不到任何匹配的类别时会出错。你实际上是在打电话给undefined.videos
  • @ChaseDeAnda 啊,是的,感谢您指出这一点
  • 只有我的两分钱,我认为在这个例子中检查当前状态是有意义的。听起来您想在用户切换类别时预加载类别数据。

标签: javascript reactjs redux state


【解决方案1】:

您的代码在某种程度上是正确的,但您应该将整个内容编写为 thunk,因为这样它就可以直接访问 getState

export const setCategory = (id) => {
    return (dispatch, getState) => {
        const state = getState();
        const {categories} = state.display;
        const category = categories.find(category => category.id === id) || {};
        const {videos : categoryVids = {} } = category;

        if(Object.keys(categoryVids).length >= 0) {
            // dispatch here
        }
    }
}

【讨论】:

    【解决方案2】:

    您的动作创建者通常应该是不会产生副作用的纯函数。您不想在动作创建器中访问状态的原因是因为这意味着无法根据其参数预测 setCategory() 的结果。 Redux 的全部意义在于能够以一种直接的方式推断应用程序的状态。如果您不能轻松地跟踪由分派给定操作所导致的状态变化,那将变得更加困难。

    当您需要根据状态的某些部分是否存在来有条件地调度操作时,在“客户端”代码(即从 Redux 的角度来看的客户端)中执行此操作会更清楚,在这种情况下,这可能是零件。如果数据丢失,您可以进行检查,然后发送某种LOAD_DATA 操作。

    但是,如果您需要做一些异步操作,那么您应该研究 Redux 中 async operations 的常见模式,或者使用现有的库,例如 Redux Thunkredux-saga

    【讨论】:

    • 查看 Redux Thunk 主页上的 Motivation 部分,了解该库如何处理动作创建者内部检查状态的示例 - getState() 函数作为 thunk 的第二个参数提供。
    • 不,绝对允许动作创作者不纯并有副作用。 Reducers 必须是纯的。除此之外,请参阅我的帖子Idiomatic Redux: Thoughts on Thunks, Sagas, Abstraction, and Reusability,了解更多关于为什么可以在动作创建者中访问状态的想法。 Thunks 也是进行条件调度的最佳场所,特别是因为它们可以访问整个状态树(而组件只有在 mapState 中提取的特定道具)。
    猜你喜欢
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2020-10-26
    • 2017-04-02
    • 2016-01-02
    • 2018-06-26
    相关资源
    最近更新 更多