在不改变状态的情况下修改 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 仍然是存储中的原始对象。您还需要复制一份,然后修改副本。