在不改变状态的情况下修改 redux saga 中的选择器
Modify selector in redux saga without mutating state
当使用选择器时,我认为我可以在不修改状态的情况下对变量做任何我想做的事情,所以我很惊讶状态会发生变化。
所以如果这是错误的(在 redux saga 中):
const filters = yield select(state => state.filters.filters);
filters.terms['helloo'] = "mutated";
//send data with request
yield put(requestData(filters)
为什么第一行直接引用了州?
无论如何,如果我尝试使用 Object.assign
,它也会改变状态:
const filters = Object.assign({}, yield select(state => state.filters.filters));
filters.terms['helloo'] = "mutated";
如何创建作为状态副本的选区?
这里确实没有 "magic"。 Redux 的 getState()
字面意思就是 return state
,手写选择器和 Reselect return 无论 你 把函数写到 return .因此,在该示例中,filters
是嵌套在存储状态中的实际对象引用,因为这就是 您的 函数 returned.
根据 Redux docs page on "Immutable Update Patterns",您需要复制要更新的 所有 层嵌套。在您的示例中,您正在制作 filters
的副本,而不是 filters.terms
,因此 terms
仍然是存储中的原始对象。您还需要复制一份,然后修改副本。
当使用选择器时,我认为我可以在不修改状态的情况下对变量做任何我想做的事情,所以我很惊讶状态会发生变化。
所以如果这是错误的(在 redux saga 中):
const filters = yield select(state => state.filters.filters);
filters.terms['helloo'] = "mutated";
//send data with request
yield put(requestData(filters)
为什么第一行直接引用了州?
无论如何,如果我尝试使用 Object.assign
,它也会改变状态:
const filters = Object.assign({}, yield select(state => state.filters.filters));
filters.terms['helloo'] = "mutated";
如何创建作为状态副本的选区?
这里确实没有 "magic"。 Redux 的 getState()
字面意思就是 return state
,手写选择器和 Reselect return 无论 你 把函数写到 return .因此,在该示例中,filters
是嵌套在存储状态中的实际对象引用,因为这就是 您的 函数 returned.
根据 Redux docs page on "Immutable Update Patterns",您需要复制要更新的 所有 层嵌套。在您的示例中,您正在制作 filters
的副本,而不是 filters.terms
,因此 terms
仍然是存储中的原始对象。您还需要复制一份,然后修改副本。