Ngrx用数组存储不可变状态吗?

Rol*_*ácz 3 ngrx angular ngrx-store

我打算使用Angular 5创建一个大型应用程序。我也想使用Ngrx来存储我的应用程序的状态。但是有一件事我不明白。

假设我有一个对象(为了简单起见,我现在不使用类或接口),该对象以表示我的状态Store

let state = {
    x: 10,
    y: [1, 2, 3]
};
Run Code Online (Sandbox Code Playgroud)

在我阅读的每篇文章中,作者都​​使用它在化简器Object.assign()中创建状态的副本。例如:

...
case SET_X:
    return Object.assign({}, state, {x: 123});
...
Run Code Online (Sandbox Code Playgroud)

但这不会创建状态的深层副本。因此,y新状态的数组与旧状态的数组相同。我认为这与Redux / Ngrx的概念背道而驰。

那么这是否意味着我必须使用ListImmutable.js或类似的东西,而每篇文章都是“错误的”?还是我错过了什么?我认为这不是一个非常特殊的情况。

max*_*992 5

不,您不必使用Immutable.js(我也不建议您使用)。

如果要更新数组,可以说添加一个值,则应这样做:

const state = {
  x: 10,
  y: [1, 2, 3]
};

const newState = {
  ...state,
  y: [...state.y, 4]
}
Run Code Online (Sandbox Code Playgroud)

在这里,您会注意到两件事:
-可以使用对象的spread运算符来代替使用Object.assign-
要保持数组的不变性,您必须创建一个新引用。而且,您也可以在数组上使用散布运算符,然后仅添加一个新值。如果要在之前而不是之后添加:y: [4, ...state.y],如果要删除3数组中的所有元素:y: state.y.filter(nb => nb !== 3)