【问题标题】:redux-toolkit sharing state between slice reducerredux-toolkit 在 slice reducer 之间共享状态
【发布时间】:2021-05-12 07:44:37
【问题描述】:

我正在构建一个应用程序,其中“切片缩减器”需要访问另一个“切片缩减器”的状态。 redux 文档讨论了使用自定义组合减速器以将根状态传递给减速器 - Beyond combineReducers

到目前为止,我的根减速器有这个:

import cats from '../slices/cats'
import dogs from '../slices/dogs'
import status from '../slices/status'

function combinedReducer(state = {}, action) {
  return {
    status: status(state.status, action),
    dogs: dogs(state.dogs, action),
    cats: cats(state.cats, action, state),
  };
}

 export default configureStore({ reducer: combinedReducer });

我似乎无法获得我的猫减速器的根状态 - 作为上面的第三个参数传入。

const assetsSlice = createSlice({


name: 'cats',
  initialState,
  reducers: {
    setFetched: (state, { payload }, root) => {
      // root is undefined
      state.type = payload + root.dogs.legs;
    },
  },
});

这应该可行,不是吗?

如果我使用不是由 createSlice 创建的原版减速器,我可以获得根状态

export default (state = initialState, action, root) => {
// root - { status: {}, dogs: {}, cats: {} }
};

【问题讨论】:

    标签: redux redux-toolkit


    【解决方案1】:

    这不可能作为第三个参数,因为 RTK 的 reducer 只将前两个参数传递给 case reducer。

    可以只是将它添加到动作中(但授予,这很hacky):

    function combinedReducer(state = {}, action) {
      const actionWithFullState = { ...action, meta: {...action.meta, fullState: state }}
      return {
        status: status(state.status, action),
        dogs: dogs(state.dogs, action),
        cats: cats(state.cats, actionWithFullState),
      };
    }
    

    【讨论】:

    • 是的,我想过,但由于 hacky 的性质,我不想追求它。我最终通过使用extraReducers 并更新了我正在使用的“slice reducer”来监听另一个“slice reducer”的动作
    • 这听起来绝对是更清洁的解决方案 :)
    猜你喜欢
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 2021-04-22
    • 2021-05-05
    • 2019-04-24
    • 2016-04-15
    • 2018-11-20
    相关资源
    最近更新 更多