使用Object.assign更改类属性但返回类实例

时间:2017-05-31 14:05:50

标签: reactjs redux immutability

我有一个非常基本的Person类,需要一个名为data的参数。

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不变性的情况下实现这一目标?

谢谢。

2 个答案:

答案 0 :(得分:0)

1)在您的州

中存储类实例不是一个好习惯

还原的三个原则的第一个原则是

  

整个应用程序的状态存储在单个商店的对象树中。这样可以轻松创建通用应用程序,因为服务器中的状态可以序列化并充当客户端而无需额外的编码工作......

因此,请考虑将状态更改为仅包含可序列化数据。

2)使用像immutablejs这样的工具是一种很好的做法,它将永远消除所有不变性问题。

3)分割你的reducer函数是一个好习惯,考虑使用combineReducer,如果你这样做,你将有一个reducer只负责该州的persons分支。

4)如果你必须继续使用当前的解决方案,我认为你必须在每次更新时实例化new人。

答案 1 :(得分:0)

虽然我同意Faris的观点,将类实例存储在Redux中不是一个好习惯,但是

const person = Object.assign(new Person(), ...);

其中...是更新的数据。