当我们使用“ redux-starter-kit”时,如何在另一个减速器中访问减速器状态?

时间:2019-07-07 22:40:38

标签: javascript reactjs redux

现在,我使用redux-starter-kit制作了两个减速器(学生减速器和考试减速器)。如何在学生减速器中访问考试减速器的状态?另外,我们可以在学生减速器中调用考试的调度功能来修改考试状态吗?

examReducer.js

const exam = createSlice({
 initialState: {
   mathScore: 0
 },
 reducer: {
   setMathScore: (state, action) => {
    state.mathScore = action.payload;
   }
 }
});

studentReducer.js

const student = createSlice({
 initialState: {
   pass: false
 },
 reducer: {
   setMathScore: (state, action) => {
    //try to get math score from exam reducer
    state.pass = /*TODO*/ > 70 ? true : false;
   }
 }
});

store.js

const store = configureStore({
  reducer: {
    exam: exam.reducer,
    student: student.reducer
  }
});

1 个答案:

答案 0 :(得分:0)

您不能“访问另一个reducer的状态”,因为那通常不是Redux的工作方式。在这方面,Redux入门套件没有什么特别的。

根据Redux FAQ entry on "sharing state between reducers"

  

许多用户后来想尝试在两个化简器之间共享数据,但是发现combineReducers不允许他们这样做。可以使用几种方法:

     
      
  • 如果精简器需要从另一个状态片中了解数据,则可能需要重新组织状态树的形状,以便单个精简器可以处理更多数据。
  •   
  • 您可能需要编写一些自定义函数来处理其中的某些操作。这可能需要用您自己的顶级reducer函数替换combineReducers。您还可以使用reduce-reducers之类的实用程序来运行combineReducers来处理大多数操作,还可以为跨状态片的特定操作运行更专业的化简器。
  •   
  • 诸如redux-thunk之类的异步操作创建者可以通过getState()访问整个状态。动作创建者可以从状态中检索其他数据并将其放入动作中,以便每个化简器具有足够的信息来更新其自己的状态片。
  •   

此外,您肯定不能在reducer内调度动作。禁止这样做,将引发错误。