当使用选择器时,我认为我可以在不修改状态的情况下对变量做任何我想做的事情,所以我很惊讶状态会发生变化。
所以如果这是错误的(在 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";
如何创建作为状态副本的选择?
最佳答案
这里确实没有涉及“魔法”。 Redux 的 getState()
实际上只是 return state
,手写选择器和 Reselect 都会返回您编写的要返回的函数。因此,在该示例中,filters
是嵌套在存储状态中的实际对象引用,因为这是您的函数返回的内容。
根据 Redux docs page on "Immutable Update Patterns" ,您需要复制要更新的所有 嵌套级别。在您的示例中,您正在复制 filters
,但不是 filters.terms
,因此 terms
仍然是原始对象商店。您还需要制作一份副本,然后修改副本。
关于redux - 在不改变状态的情况下修改 redux saga 中的选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52479041/