我正在开发一款小游戏。所以我第一次使用redux工具包。(我习惯于重复(
这个createSlice
方法非常棒,但我不知道如何在操作中调用操作。因此动作是自动生成的,因此在生成之前不可用。
示例:
const gameSlice = createSlice({
name: 'game',
initialState,
reducers: {
startNewGame: (state) => {
state.activeTeam = state.config.startTeam = random(0, 1)
state.winner = undefined
},
endRound: (state, action, dispatch) => { // last param not available
// ... code that handles the rounds inputs and counts points for each team ...
if(state.red >= 30) {
// HOW?! Here's something i tried
endGame(state, Team.Red)
dispatch({type: endGame, payload: Team.Red})
dispatch({type: gameSlice.endGame, payload: Team.Red})
}
if(state.blue >= 30) {
// HOW?! Here's something i tried
endGame(state, Team.Blue)
dispatch({type: endGame, payload: Team.Blue})
dispatch({type: gameSlice.endGame, payload: Team.Blue})
}
},
endGame: (state, action) => {
state.winner = action.payload
}
}
})
这只是一个小例子。没有async
,也没有后端调用。我只想嵌套行动调用。假设很简单。。。但我不知道如何用KISS的方式来做。
我读了一些关于extraReducers
和createAsyncThunk
的内容,但我不会对每个操作都这样做,因为这里没有异步的东西,而且使用redux工具包也没有任何好处。这只是一堆无用的代码。
我觉得我是瞎子,或者是愚蠢,或者只是困惑。。。但这让我现在快疯了。
没有redux工具包,这很容易。感谢您的帮助。
您可以never在Redux reducer内部调度更多操作
但是,可以编写额外的辅助函数来在reducers中执行常见的更新任务,并根据需要调用这些函数。这在RTK的createSlice
中使用Immer供电的减速器时尤其有用。
此外,可以根据需要调用其他大小写减少器,方法是引用slice.caseReducers
对象,如:
reducers: {
endRound(state, action) {
if (someCondition) {
// "Mutate" state using the `endGame` case reducer
mySlice.caseReducers.endGame(state)
}
},
endGame(state, action) {}
}