redux - 在不改变状态的情况下修改 redux saga 中的选择器

标签 redux redux-saga mutable

当使用选择器时,我认为我可以在不修改状态的情况下对变量做任何我想做的事情,所以我很惊讶状态会发生变化。

所以如果这是错误的(在 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/

相关文章:

ios - 集合中的可变对象

javascript - React Router 仅当从 root url 启动时才能够进行路由

javascript - 如何使用 redux-saga 创建领先的去抖动

javascript - React/redux 应用程序在 Safari 上呈现空白屏幕

error-handling - 用 Jest 捕捉错误时如何测试 Redux-Saga

scala - 如何在 scala 中获取(不可变和可变)集合的列表?

haskell - 如何修改或读取作为函数参数传递的可变向量?

reactjs - React 中自己的 TreeStructure - RenderTree

node.js - 使用 Mongoose 和 Redux 删除记录

reactjs - 如何使用 createAsyncThunk 帮助程序分派(dispatch) AsyncThunk