【问题标题】:How to call other reducers in createSlice to change state?如何在 createSlice 中调用其他 reducer 来改变状态?
【发布时间】:2021-12-28 05:39:52
【问题描述】:

我使用 redux 来创建切片,这是我的 createSlice 的样子:

export default createSlice({
    name:'testSlice',
    initialState,
    reducers:{
        setRecords: setRecordsReducer,
        setObjects: setObjectsReducer,
        setBoth:....
    }
});

这里是 setRecordsReducer 和 setObjectsReducer 的样子:

const setRecordsReducer = (state, {payload:{id,recordName}}) => {
    return {...state, items:{...state.items, records:{...state.items.records, [id]:{recordName}};
};

const setObjectsReducer = (state, {payload:{id,objectName}}) => {
    return {...state, objects:{...state.objects, records:{...state.objects.records, [id]:{objectName}};
};

setRecordReducer 和 setObjectsReducer 这两个reducer改变了状态的不同部分(实际上并不是改变状态,而是基于它构建新的状态)。 setRecordReducer 根据 state.items.records 返回新状态; setObjectReducer 根据 state.objects.records 返回新状态。

我试图创建一个新的动作 setBoth,当动作 setBoth 发生时,我可以同时调用 setRecordReducer 和 setObjectsReducer 吗?那么状态的两个部分可以改变并返回我新的状态吗?

【问题讨论】:

  • 要么状态更新依赖于先发生的另一个更新,还是这些真正独立的状态“块”?
  • 它们是真正独立的状态块。没有依赖。 @DrewReese

标签: reactjs redux react-redux redux-toolkit redux-reducers


【解决方案1】:

既然每个状态都在运行,那么是的,我看不出为什么你不能编写一个调用其他状态并传递适当参数的 reducer 函数。这个新的 reducer 函数还需要返回下一个计算的状态值,从每个调用的 reducer 函数返回组合的更新状态。

const setBothReducer = (state, action) => {
  return {
    ...state,
    ...setRecordsReducer(state, action),
    ...setObjectsReducer(state, action),
  };
}

export default createSlice({
  name:'testSlice',
  initialState,
  reducers:{
    setRecords: setRecordsReducer,
    setObjects: setObjectsReducer,
    setBoth: setBothReducer,
  }
});

【讨论】:

  • 谢谢!如果两个reducer在同一个chunk上 const setRecordsReducer = (state, {payload:{id,recordName}}) => { return {...state, items:{...state.items, records:{... state.items.records,[id]:{recordName}}; }; const setObjectsReducer = (state, {payload:{id,objectName}}) => { return {...state, items:{...state.items, objects:{...state.items.objects, [id ]:{对象名}}; };如果他们都更新state.items,一个更新state.items.records,一个更新state.items.objects,那么我们不能使用上面的对吗?似乎无法保留第一个减速器状态更改
  • @spspli 是的,我相信这是正确的。如果一个reducer 依赖于另一个reducer 的结果,那么您可能会从第一个计算下一个状态并将其传递给第二个而不是未更新的状态。
猜你喜欢
  • 2021-01-01
  • 2017-12-31
  • 2020-09-02
  • 2019-02-03
  • 1970-01-01
  • 2019-01-09
  • 1970-01-01
  • 2021-01-27
  • 1970-01-01
相关资源
最近更新 更多