假设我有一个包含两个切片的 redux 状态。每片都有一个数字。
一个数字由动作
SET_NUMBER
控制,另一个数字由 SET_OTHER_NUMBER
控制。
此外,我有一个传奇,试图确保另一个数字始终与第一个数字匹配。像这样的东西:
function* changeOtherNumber(action) {
yield put(setOtherNumber(action.payload.number))
}
function* watchSetNumber() {
yield takeEvery('SET_NUMBER', changeOtherNumber)
}
我的问题:如果我调度一个
SET_NUMBER
动作,我是否会冒着(即使是暂时)渲染一个数字不彼此相等的组件的风险?或者,在任何重新渲染有机会运行之前,传奇是否会启动并更改另一个数字?换句话说,从 React 应用程序的角度来看,SET_OTHER_NUMBER
是否与 SET_NUMBER
一起以原子方式调度和处理?
docs 的内容如下:
put(action)
创建一个效果描述,指示中间件安排将操作分派到存储。此调度可能不会立即进行,因为其他任务可能位于 saga 任务队列中或仍在进行中。
但是,您可以期望存储在当前堆栈帧中更新(即通过
之后的下一行代码),除非您有其他具有延迟操作传播的异步流的 Redux 中间件。yield put(action)
但我很难理解这些公式。
如果放置操作不与原始
SET_COLOR
操作原子/同步运行建议的方法是什么来进行此类原子更新?或者我应该彻底重新考虑设计?
1。 redux-sagas 中的
put
操作与触发操作是原子的吗?
2。为什么会这样?
put
效果安排动作的调度,由于 saga 队列中的其他任务,该动作可能不会立即发生。3.你该怎么办?
将状态更新合并到单个操作和减速器中以确保原子性:
const SET_NUMBERS = 'SET_NUMBERS';
const setNumbers = (number) => ({
type: SET_NUMBERS,
payload: { number }
});
const initialState = { number: 0, otherNumber: 0 };
function numbersReducer(state = initialState, action) {
switch (action.type) {
case SET_NUMBERS:
return {
...state,
number: action.payload.number,
otherNumber: action.payload.number
};
default:
return state;
}
}
dispatch(setNumbers(newNumber));