从 Angular 中的 RXJS/NGRX 商店获取要在组件中编辑的不可变项的最佳实践

Best practice for getting an immutable item to edit in a component from an RXJS/NGRX store in Angular

本周我们已将 Angular v9 应用程序升级到 v11 和 RXJS v6.6。在大多数情况下,这一切都非常顺利,但由于商店现在处于冻结模式,我们在之前更新商店的代码中遇到了一些错误。

虽然其中大部分是我们用来更新 reducer 中的存储的辅助方法(并且很容易重构),但我们在编辑组件中使用的一种常见方法会导致问题。

我们一般在编辑一个完整的组件中做如下操作model/item:

这会导致“无法分配给只读 属性...”错误。在大多数情况下,通过使用展开或 Object.assign() 创建浅拷贝是可行的,但对于我们更复杂的对象,这并不适用,因为我们需要深拷贝。

有没有一种 better/proper 方法可以从 RXJS/NGRX 商店获取项目进行编辑,而无需使用自定义代码在组件中创建它的深层副本?目前我们正在解决 JSON.parse(JSON.stringify(Object)) 的问题,但感觉不对!

这可能无法回答您的问题,但希望它能为您提供一些启示。

假设您订阅了一个对象到您的商店并修改了该对象的 属性,您实际上将更改商店和本地的 属性,因为对象和数组是引用类型。您应该更改商店中属性的唯一方法是通过操作,并且更新应该在 reducer 中不可变地发生以启用时间旅行调试。

这个 应该有助于解释更多。

至于创建副本的技术,我认为像您提到的 Object.assign 和 JSON.parse(JSON.stringify(Object)) 似乎没问题。

其他方法是散布数组 [...array] 以创建副本以及散布对象以创建副本 { ...object }。