在redux中克隆然后变异的方法

在redux中克隆然后变异的方法,redux,clone,immutability,ngrx,Redux,Clone,Immutability,Ngrx,我已经在redux上读了一段时间了。对我来说有一件奇怪的事。在人们给出的大多数示例中,所有复制逻辑都是通过减缩器处理的。 我正在使用typescript,希望采用一种更基于类的方法。但也许我错过了什么 假设我有一门购物车课程。以及购物车减速器和购物车动作。 它看起来是这样的: 导出类购物车 { 私有项:{[key:string]:number}={}; 构造函数(项:{[key:string]:number}={}) { Object.assign(此项,项); } 公共附加项(id:字符串)

我已经在redux上读了一段时间了。对我来说有一件奇怪的事。在人们给出的大多数示例中,所有复制逻辑都是通过减缩器处理的。 我正在使用typescript,希望采用一种更基于类的方法。但也许我错过了什么

假设我有一门购物车课程。以及购物车减速器和购物车动作。 它看起来是这样的:

导出类购物车
{
私有项:{[key:string]:number}={};
构造函数(项:{[key:string]:number}={})
{
Object.assign(此项,项);
}
公共附加项(id:字符串)
{
this.items[id]=this.items[id]?this.items[id]+1:1;
}
public removietem(id:string)
{
此.items[id]-;

如果(this.items[id]这被认为是不好的做法,原因有几个

首先,不鼓励将类实例保持在状态。您可以这样做,但这不是“正确”的方法

第二,你的类直接改变了它的内容。这也会破坏时间旅行调试,并且

第三,Redux鼓励更具功能性的方法,而不是OOP


您可能想阅读我最近的两篇博文,其中详细介绍了Redux需要的技术限制以及原因,为什么存在使用Redux的常见做法,以及为什么可能使用其他方法但不被认为是惯用方法。

这被认为是不好的做法,原因有几个

首先,不鼓励将类实例保持在状态。您可以这样做,但这不是“正确”的方法

第二,你的类直接改变了它的内容。这也会破坏时间旅行调试,并且

第三,Redux鼓励更具功能性的方法,而不是OOP


您可能想阅读我最近的两篇博文,其中详细介绍了Redux需要哪些技术限制以及为什么,为什么存在使用Redux的常见做法,以及为什么其他方法可能是可行的,但不被认为是惯用的。

您可以这样做。毕竟……您将尊重所需的不变性契约通过Redux架构

但我不建议你这么做。

深度克隆根本就没有性能。你的商店越大,你的应用程序速度就越慢

另外,老实说,我用
类尝试了这种方法:

也没那么糟糕,但我最终使用了一个简单的函数

有一件事是,这里的
操作将不会被键入,因此您将失去Typescript的一些好处

与此相反,您应该为每个操作创建一个
,如本演讲中所述


此外,我还制作了一个ngrx启动程序,它可能会帮助您入门:

您可以这样做。毕竟……您将尊重Redux体系结构所需的不变性契约

但我不建议你这么做。

深度克隆根本就没有性能。你的商店越大,你的应用程序速度就越慢

另外,老实说,我用
类尝试了这种方法:

也没那么糟糕,但我最终使用了一个简单的函数

有一件事是,这里的
操作将不会被键入,因此您将失去Typescript的一些好处

与此相反,您应该为每个操作创建一个
,如本演讲中所述


此外,我还制作了一个ngrx启动程序,可以帮助您入门:

为什么不向
Cart
类添加一个方法,该方法从您的操作中获取更新,并基于其现有值和更新返回
Cart
的新实例?为什么不向
Cart
类添加一个方法,该方法从您的操作中获取更新,并返回一个基于现有值和更新的
Cart
的新实例?根据@markerikson注释,只有一件事需要澄清:我没有使用类作为直接减缩器,我的所有方法都是静态的,因此我的情况下时间旅行没有中断,这与您的情况略有不同@markerikson注释,仅此而已需要澄清的是:我没有使用类作为直接减速器,而且我所有的方法都是静态的,所以在我的情况下时间旅行没有中断,这与您的情况略有不同
function reducer(state = new Cart(), action:Action): Cart {
    //first clone, then mutate, then return
}