在redux传奇中修改选择器而不改变状态

时间:2018-09-24 12:05:11

标签: redux redux-saga mutable

使用选择器时,我以为我可以对变量做任何我想做的事而无需修改状态,所以我很惊讶状态变了。

因此,如果这是错误的(在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";

如何创建状态副本呢?

1 个答案:

答案 0 :(得分:0)

这里确实没有“魔术”。 Redux的getState()实际上只是return state,并且手写选择器和Reselect都会返回编写的要返回的函数。因此,在该示例中,filters是嵌套在存储状态内的实际对象引用,因为这是您的函数返回的内容。

对于Redux docs page on "Immutable Update Patterns",您需要复制要更新的所有个嵌套级别。在您的示例中,您正在复制filters,而不是filters.terms,因此terms仍然是商店中的原始对象。您还需要制作一个副本,然后修改副本。