2017-05-30 66 views
0

我一直在阅读的东西在REDX一段时间。对我而言,这是一件奇怪的事情。在大多数人给出的例子中,所有的复制逻辑都是通过reducer来处理的。 我正在使用打字稿,并希望采用更多基于类的方法。但也许我错过了一些东西。克隆,然后mutatate方法在减少

比方说,我有一个购物车类。随着购物车减速器和购物车行动。 它看起来方式如下:

export class Cart 
{ 
    private items:{[key:string]:number} = {}; 

    constructor(items:{[key:string]:number} = {}) 
    { 
     Object.assign(this.items, items); 
    } 

    public addItem(id:string) 
    { 
     this.items[id] = this.items[id]?this.items[id]+1:1; 
    } 

    public removeItem(id:string) 
    { 
     this.items[id]--; 

     if(this.items[id] <= 0) 
     { 
      delete this.items[id]; 
     } 

    } 

    public setItemsCount(id:string, count:number) 
    { 
     this.items[id] = count; 
    } 

    public clone():Cart 
    { 
     return new Cart(Object.assign({}, this.items)); 
    } 

} 

所以,在这里我incapsulating一类克隆逻辑。

在我减速器我会签名去:

function reducer(state = new Cart(), action:Action): Cart { 
    //first clone, then mutate, then return 
} 

或者说,实际上,如何通过一个通用的方法只是深克隆的对象,那么他们变异,然后返回?这种方法有什么不好?

+0

为什么不加一个'Cart'类的方法,它从你的动作中获取一个更新,并根据它的现有值和更新返回一个新的'Cart'实例? – adrice727

回答

3

由于几个原因,这被认为是不好的做法。

首先,不鼓励类实例处于状态because it will break time-travel debugging。你可以这样做,但它不是“正确”的方式。

其次,你的班级直接改变其内容。这也会打破时间旅行调试,并且result in your connected React components not re-rendering properly

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

您可能希望通过我的两个最近的博客文章,The Tao of Redux, Part 1 - Implementation and IntentThe Tao of Redux, Part 2 - Practice and Philosophy,它进入细节上读什么技术限制Redux的需要,为什么,为什么常见的做法,使用终极版存在的,为什么其他方法可能可能但不被认为是惯用的。

1

你可能会这样。毕竟......你会尊重Redux架构所需的不变契约。

但我不建议你这样做。

深层克隆根本就不表现。您的商店越大,您的应用程序越慢。

另外,要honnest我试过这种方法有classhttps://github.com/maxime1992/pizza-sync/blob/5212a29ee9be916383f759a3a129f7b580ed32ea/frontend/src/app/shared/state/orders/orders.reducer.ts

而且它不是那么糟糕。但我最终使用了一个简单的函数。

有一件事,你的actions在这里不会输入,所以你会失去Typescript的一些好处。

而是这样做的,你应该创建一个class每个动作,在这次谈话https://www.youtube.com/watch?v=cyaAhXHhxgk

也解释了,我已经做了一个NGRX启动,可能会帮助您入门:https://github.com/maxime1992/angular-ngrx-starter

+0

根据@markerikson的评论,只有一件事需要澄清:我没有使用过一个班级作为直接减速器,而我所有的方法都是静态的,所以在我的情况下,时间旅行并没有打破,这与您的情况略有不同 – Maxime