使用Redux和Immutable JS存储Record元数据的位置

时间:2017-04-11 15:17:27

标签: redux react-redux immutable.js

几个月前,我从Ember切换到Redux + Immutable JS项目,整体上享受着这种体验。

的一个问题还没有找到一个很好的解决方案,当使用Records时,存储该记录的元数据。

例如,我们说我有一个bar记录:

User

对于const userRecord = Immutable.Record({ id: null, name: '', email: '' }); ,我可能还希望存储UserisLoading等属性。第一种解决方案是将这些存储在isSaved中。虽然到目前为止这是最简单的解决方案,但这对我来说是错误的。

另一种解决方案可能是创建一个userRecord地图,其中包含User记录,以及有关用户的元数据。

实施例。

User

我认为这更优雅,但我不喜欢所有用户属性如何变得更加嵌套,因此访问用户属性变得非常冗长。

我最想念的是Ember能够轻松访问Model属性。

实施例。 const userMap = Immutable.Map({ record: Immutable.Record({ id: null, name: '', email: '' }), isLoading: false, isSaved: true }); user.get('isSaved')

是否可以使用Redux和Immutable重新创建类似的东西?你以前怎么接近这种情况?

1 个答案:

答案 0 :(得分:3)

我可能误解了这个问题,因为

  

我最想念的是Ember能够轻松访问Model属性。

     

user.get('isSaved')或user.get('name')

适用于不可变记录。

如果您不想为记录添加太多属性,则可以使用单个状态属性并添加一些getter(假设您的状态是互斥的):

const STATUS = {
  INITIAL: 'INITIAL',
  LOADING: 'LOADING',
  SAVING: 'SAVING
};

class UserRecord extends Immutable.Record({
  id: null, 
  name: '', 
  email: '', 
  status: STATUS.INITIAL}) {

  isLoading() {
    return this.get('status') === STATUS.LOADING;
  }

  isSaving() {
    return this.get('status') === STATUS.SAVING;
  }
}

new UserRecord().isLoading());  // returns false

new UserRecord({status: STATUS.LOADING}).isLoading();  // returns true
new UserRecord().set('status', STATUS.LOADING).isLoading();  // returns true