【问题标题】:Redux change multiple statesRedux 改变多种状态
【发布时间】:2019-02-16 03:25:46
【问题描述】:

假设我有一个具有这种形状的全局状态减速器:

全局减速器:

const globalInitialState = {
  userId: 0,
  year: 1900
}

然后我有一个基于这些全局参数的数据状态缩减器:

总结减速器:

2018 年用户 10 的数据

const summaryDataInitialState = [{data for user 10, 2018}, {data}, {data}]; 

要更新“摘要数据”,我有一个异步 redux-thunk 操作:

总结行动:

getSummary = (userId, year) => {
  return async dispatch => {
    let data = await api.getData(userid, year);
    dispatch(success(data));
  }
}

但是当您全局更改年份时,我应该如何触发更新摘要数据?

我应该从我的“updateYear”操作中调用摘要操作“getSummary”还是这是一个糟糕的模式/设计?我不喜欢这种将“summaryActions”与“globalActions”联系起来的方式。再往前走,当这些全局变量改变时,可能需要改变很多很多“子状态”。另外,我不希望 userId, year 的初始设置触发获取应用程序中的所有状态,我想根据需要检索它。

【问题讨论】:

    标签: reactjs design-patterns redux


    【解决方案1】:

    您可以直接调度reducer类型,然后reducer将直接接收它,而无需直接导入动作。

    getSummary = (userId, year) => {
      return async dispatch => {
        let data = await api.getData(userid, year);
        dispatch(success(data));
        dispatch({type: 'UPDATE_YEARLY', payload: year})
      }
    }
    

    或者当你调度成功时,全局reducer也可以捕获它调度的reducer类型。

    总结减速器:

    SET_SUCCESS: (state, action) => ({...state, year: action.payload.year, userid: action.payload.userid})
    

    然后在全局reducer中:

    SET_SUCCESS: (state, action) => ({...state, year: action.payload.year})
    

    如果他们都观看相同的类型 (SET_SUCCESS),那么他们都将使用有效负载发送该操作。

    【讨论】:

    • 你能详细说明你的最后一句话吗?
    • 查看我的编辑。如果您在减速器和成功操作周围添加更多细节,那么如果仍然不清楚,我可以添加一个更具体的示例
    • 我明白谢谢。这与我的想法相反-更改 YEAR 将触发更新摘要数据(对于 YEAR),但我明白了。但是,这是不好的形式吗?感觉就像是耦合。
    • 我认为在您尝试的情况下,它是最解耦的。您可以提出这样的论点,即如果数据存在于另一个 reducer 中,那么您也可以通过将值放入另一个 state 对象来复制数据。因此,您可以更新为仅在应用程序中使用其中一个值,或者您可以将这些值组合成一个状态对象,因为它们是绑定在一起的。这是一种设计方法,但我想说人们从其他文件/reducer 调用 action/reducer 是很常见的。
    • 是的,也许数据应该按用户 ID => 年份 => 数据进行散列。如果我更改年份,如果我不在包含可见数据的页面上,我只是不想检索整个应用程序数据
    猜你喜欢
    • 2019-03-19
    • 2019-01-30
    • 2021-12-30
    • 2019-02-20
    • 2019-03-16
    • 2020-01-26
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多