2017-05-31 67 views
0

我有一个非常基本的Person类,它需要一个叫做data参数。与Object.assign更改类属性,但返回的类实例

class Person implements PersonInterface { 

    constructor(public data) { 

    } 

    get name(): string { 
     return this.data.name; 
    } 

} 

const person: PersonInterface = new Person({ name: "Aristona }); 

在我的Redux商店中,我将所有人都放在一个数组中。它看起来像这样:

[Person, Person, Person, Person] 

用户可以编辑Person的名称属性。所以,我的减速器是这样的:

case Constants.PERSON_UPDATE_SUCCESS: 
    const person = Object.assign({}, action.payload.person.data, { 
    name: action.payload.name 
    }); 

    return { 
    ...state, 
    persons: [ 
     person, 
     ...state.persons.filter(p => p.id !== person.id) 
    ] 
    }; 

它不起作用,因为Object.assign返回data财产。我需要的是Person对象与data属性更新。如果我能发生变异的数据,应该是这样的:

person.name = action.payload.name; 

否则,我人阵看起来像这样:

[Person, Person, Person, Person, Object] // Object is data 

和它打破了所有的迭代。

我试着这样做:

const updatedData = Object.assign({}, action.payload.person.data, { 
    name: action.payload.name 
}); 

const person: PersonInterface = new Person(updatedData); 

虽然理论上这是可行的,可惜我不能实例这样的课,而不会在我PersonFactory类作出重大的改变。

有没有办法在不破坏Redux不变性的情况下实现这一点?

谢谢。

+1

如果你真的想使用类,我建议使用'new'创建一个新的类实例。 – Sulthan

+1

React,特别是Redux采用更实用的方法而不是面向对象。不幸的是,我无法想出一个很好的方式去做你想做的事情。我必须问,你真的需要为你的国家使用类吗?状态只是一个数据结构,并不会真正从类实例中受益。 – DonovanM

+0

见我为什么使用类在终极版数据气馁答案:https://stackoverflow.com/questions/44268317/clone-and-then-mutate-approach-in-redux/44270061#44270061。 – markerikson

回答

0

1)这不是存储类的实例在状态好的做法

的终极版的三个原则,第一原则说

整个应用程序的状态被存储在对象树中一家商店。这使得很容易地创建通用的应用程序,从服务器的状态可以被序列化和水合与没有额外的编码工作,客户端...

因此可以考虑改变你的状态,只有序列化的数据

2)是使用工具,如immutablejs一个很好的做法,将采取一切不变性问题路程,直到永远。

3)分割你的减速机功能是一个很好的做法,考虑使用combineReducer,如果你这样做,你将有一个减速机只负责该州的persons分支。

4)如果你必须与当前的解决方案去上,我认为你必须实例化一个new人在每一次更新。

+0

我不同意1.保存类的实例存储是完全正常的。它更多的是关于给定对象的复杂性,而不是关于它是一个类的事实。例如,我们都保存'Date'和'Error'实例来存储。 – Sulthan

+0

它的工作原理,但它不具有可扩展性又无法序列化,如果你要坚持你的localStorage状态,或者发生,如果你有服务器端渲染,你想从服务器传输状态的客户端? – Faris

+1

@Sulthan:不,将商店的实例存入商店并不“正常” - 这让人非常气馁。您可以做到这一点,但理想情况下,您应该只在商店中放入普通数据 - 对象,数组和基元。像日期和错误应该用字符串或数字表示。 – markerikson