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

Where to store Record meta data with Redux and Immutable JS

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

一个问题我仍然没有找到一个很好的解决方案,用于处理记录时存储该记录的元数据。

例如,假设我有一条 User 记录:

const userRecord = Immutable.Record({
    id: null,
    name: '',
    email: ''
});

对于 User,我可能还希望存储 isLoadingisSaved 等属性。第一个解决方案是将这些存储在 userRecord 中。虽然这是迄今为止最简单的解决方案,但我觉得这不对。

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

例如。

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

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

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

例如。 user.get('isSaved')user.get('name')

是否可以使用 Redux 和 Immutable 重新创建这样的东西?您以前是如何处理这种情况的?

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

What I miss most about Ember is being able to access Model properties easily.

user.get('isSaved') or 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