Javascript 使用rxjs纠正状态不变性
我有一个带有对象(状态)的主题,其中有很多嵌套对象Javascript 使用rxjs纠正状态不变性,javascript,angular,rxjs,immutability,Javascript,Angular,Rxjs,Immutability,我有一个带有对象(状态)的主题,其中有很多嵌套对象 public testSubject: BehaviorSubject<any> = new BehaviorSubject<any>({ a : { prop: {...}, prop1: {...} }, b: { prop: {...}, prop1: {...} }, ... }); 嵌套对象在我的应用程序中经常更新(最多
public testSubject: BehaviorSubject<any> = new BehaviorSubject<any>({
a : {
prop: {...},
prop1: {...}
},
b: {
prop: {...},
prop1: {...}
},
...
});
嵌套对象在我的应用程序中经常更新(最多1-5秒),我发现了一个问题,cloneDeep(任何深度克隆实现)会导致我的应用程序拖拉(因为我的状态非常大)
不知何故,我需要减少深层克隆的使用。我考虑不替换未更改的嵌套对象,但我不确定它在不变性方面是否正确。Smth是这样的:
const currentObject = this.testSubject.getValue();
const newB = {...}; // maybe deepCopy of currentObject.b + changes
this.testSubject.next({
...currentObject,
b: newB,
});
请让我知道,在不变性方面,在更新状态时不制作所有嵌套属性的深度副本,而只制作已更改的嵌套对象及其子对象的深度副本是否可以(如上一个代码片段所示)不变性保证您使用的实例不会被其他人修改
如果您保证在处理(或读取)对象时控制对象的修改,那么第二个解决方案就可以了。如示例所示,不制作未更改的嵌套对象/数组的完整副本也可以
但同样重要的是,我们决定规范化我们的状态,以摆脱深层嵌套对象。AFAIK,只要状态对象中没有函数,您的最后一个代码片段就可以正常工作。这似乎是NGRX之类的东西的一个很好的候选对象。。
public testSubject: BehaviorSubject<any> = new BehaviorSubject<any>({
a : {
prop: {...},
prop1: {...}
},
b: {
prop: {...},
prop1: {...}
},
...
});