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

在不改变状态的情况下修改redux saga中的选择器,redux,redux-saga,mutable,Redux,Redux Saga,Mutable,当使用选择器时,我认为我可以在不修改状态的情况下对变量做任何我想做的事情,所以我很惊讶状态发生了变化 因此,如果这是错误的(在redux传奇中): 为什么第一行直接指的是国家 无论如何,如果我尝试使用Object.assign,它也会改变状态: const filters = Object.assign({}, yield select(state => state.filters.filters)); filters.terms['helloo'] = "mutated"; 如何创建一

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

因此,如果这是错误的(在redux传奇中):

为什么第一行直接指的是国家

无论如何,如果我尝试使用
Object.assign
,它也会改变状态:

const filters = Object.assign({}, yield select(state => state.filters.filters));
filters.terms['helloo'] = "mutated";
如何创建一个复制状态的选择?

这里确实没有“魔力”。Redux的
getState()
实际上就是
返回状态
,手写选择器和重新选择都返回您编写的要返回的函数。因此,在该示例中,
filters
是嵌套在存储状态中的实际对象引用,因为这是函数返回的


根据,您需要复制要更新的所有嵌套级别。在您的示例中,您制作的是
过滤器
,而不是
过滤器.术语
,因此
术语
仍然是存储中的原始对象。您还需要制作一份副本,并修改副本。

谢谢您的链接。即使它不是非常清晰,我也能理解一点。在reducer中,你返回你修改过的状态,但不是在传奇中,所以我认为我不能像那样直接改变状态。。但是我制作了filters.terms的副本,并以声明方式将其放入对象中(如果这是正确的术语的话),这样做很有效。。但我会看一下这个链接,我也建议你阅读。同样,这里的关键问题是,在reducer和Selector中,都有对存储中“真实”原始对象的引用。理解这一点很重要。所以,当你改变其中一个对象时,你改变了原始数据。@markerikson,谢谢你,我尝试了这个,在Saga it self after
getState()
返回我需要的任何状态,然后执行
Object.assign
浅拷贝(如果足够的话),在哪里可以克隆Redux状态。或者我应该在选择器
createSelector
中执行此操作,就像创建一个
selectCloneSelectorOfSomeState
返回状态克隆pease的专用选择器一样?@Kid完全取决于您尝试执行的操作。通常,默认情况下,您应该避免复制状态,并且只在需要对其执行某些操作的位置复制状态(例如,在reducer中,或者如果您正在更新状态以将其发送到服务器或其他位置,则可能在action creator中)。
const filters = Object.assign({}, yield select(state => state.filters.filters));
filters.terms['helloo'] = "mutated";