我有一个带有一个带有很多嵌套对象的对象(状态)的主题。
public testSubject: BehaviorSubject<any> = new BehaviorSubject<any>({
a : {
prop: {...},
prop1: {...}
},
b: {
prop: {...},
prop1: {...}
},
...
});
根据我对rxjs不变性的基本理解,我的第一个更新一些嵌套属性的代码是这样的(让我说我想更新b
):
const copy = cloneDeep(this.testSubject.getValue());
copy.b = {...}
this.testSubject.next(copy);
嵌套对象经常在我的应用程序中非常频繁地更新(最多每1-5秒一次),我遇到了一个问题,那就是cloneDeep(任何深层克隆实现)会导致我的应用程序延迟(因为我的状态确实很大)。 / p>
以某种方式,我需要减少深度克隆的使用。我考虑不替换未更改的嵌套对象,但是我不确定在不变性方面是否正确。像这样:
const currentObject = this.testSubject.getValue();
const newB = {...}; // maybe deepCopy of currentObject.b + changes
this.testSubject.next({
...currentObject,
b: newB,
});
就不变性而言,请让我知道是否在复制状态时不复制所有嵌套属性,而仅复制更改后的嵌套对象及其子对象(如上一代码片段所示)
答案 0 :(得分:0)
不可移植性保证您拥有的实例在使用时不会被其他人修改。
如果您确保在处理(或读取)对象时正在控制对象的修改,那么第二种解决方案就可以了。
答案 1 :(得分:0)
如此处的示例https://redux.js.org/basics/reducers所示,可以不对嵌套对象/数组进行完整的复制,而无需更改。
但是重要的是-我们决定规范化状态以摆脱深层嵌套的对象。