使用选择器时,我以为我可以对变量做任何我想做的事而无需修改状态,所以我很惊讶状态变了。
因此,如果这是错误的(在redux传奇中):
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";
如何创建状态副本呢?
答案 0 :(得分:0)
这里确实没有“魔术”。 Redux的getState()
实际上只是return state
,并且手写选择器和Reselect都会返回您编写的要返回的函数。因此,在该示例中,filters
是嵌套在存储状态内的实际对象引用,因为这是您的函数返回的内容。
对于Redux docs page on "Immutable Update Patterns",您需要复制要更新的所有个嵌套级别。在您的示例中,您正在复制filters
,而不是filters.terms
,因此terms
仍然是商店中的原始对象。您还需要制作一个副本,然后修改副本。