Ngrx 状态可变性

Posted

技术标签:

【中文标题】Ngrx 状态可变性【英文标题】:Ngrx state mutability 【发布时间】:2021-12-06 09:32:46 【问题描述】:

我目前正在尝试学习如何使用 Ngrx 商店,但在理解某些内容时遇到了一些麻烦: 在我的应用程序中,我的状态是一个成分对象数组,格式为:name:string,amount:number。

现在,当我尝试添加新对象时,我想检查是否已经存在同名对象,如果存在,那么我只需将旧数量与新数量相加即可。

但是当我尝试执行以下操作时:

    我使用扩展运算符将旧成分复制到一个新数组中: newIngredients = ...state.ingredients; 我得到了现有同名对象的索引 我只是更改了新数组的数量属性: newIngredients[index].amount = newAmount;

在这里我收到一个错误,说我无法更改金额属性,因为它是只读的。 但是当我使用服务而不是 ngrx 商店时,我能够毫无问题地做到这一点。

它只有在我使用扩展运算符复制现有对象然后更改其数量然后将新对象而不是旧对象放入数组中时才起作用。

为什么会这样?存储是否在数组中返回某种不可变的对象集?

【问题讨论】:

Ngrx 中的状态是不可变的(冻结的)。您需要先复制对象,然后更改值。 【参考方案1】:

只能通过 actions 修改 Redux store 中的内容,然后会触发纯函数 reducers 对您的不可变 store 进行操作,使其成为唯一的事实来源。 store 设置为一个整体,您无法直接更改其中的一部分。一样

Object.freeze(obj);

我们不能 obj 的地方

obj.prop = 1; // this will throw an error

【讨论】:

以上是关于Ngrx 状态可变性的主要内容,如果未能解决你的问题,请参考以下文章

可变状态 VS 可变状态流?

java-并发-不可变对象

java String不可变对象,但StringBuffer是可变对象

可变 Redux 状态结构

可变对象(immutable)和不可变对象(mutable)

在Android单向数据流中更新不可变视图状态值