Reactjs 标准化器&x2B;Redux-更新单个实体的属性

Reactjs 标准化器&x2B;Redux-更新单个实体的属性,reactjs,redux,normalizr,Reactjs,Redux,Normalizr,我正在构建一个音乐播放器应用程序,并使用RESTAPI从各个端点(播放列表、某个用户发布的曲目等)获取曲目 我正在使用redux和normalizer来管理我的状态。我创建了一个tracks实体,用于映射track对象及其ID 简言之,我的状态有点像这样: { playlists: { 123: { id: 123, name: 'foo', tracks: [1, 2, 3] } }, users: { me: { name: 'Niek', tracks: [2,

我正在构建一个音乐播放器应用程序,并使用RESTAPI从各个端点(播放列表、某个用户发布的曲目等)获取曲目

我正在使用redux和normalizer来管理我的状态。我创建了一个
tracks
实体,用于映射
track
对象及其ID

简言之,我的状态有点像这样:

{
  playlists: {
    123: { id: 123, name: 'foo', tracks: [1, 2, 3] }
  },
  users: {
    me: { name: 'Niek', tracks: [2, 3] },
  },
  entities: {
    tracks: {
      1: { name: 'bar', user_favorited: false, ... },
      2: { name: 'foo', user_favorited: false, ... },
      3: { name: 'bar', user_favorited: true, ... }
    }
  }
}
到目前为止,这对我来说非常有效。但现在,我正在构建一个功能,通过调用另一个API端点来切换曲目的
收藏
状态

此端点不包括响应中的整个
跟踪
资源,但我确实希望在API调用成功后更新单个
跟踪
实体的
用户偏好
属性

实现这一目标的最佳方式是什么


作为一种解决方法,在
用户偏好的
端点调用成功后,我现在再次从另一个端点获取整个
轨迹
实体,但我希望找到一个优雅的解决方案,而这是不必要的。

将提出两种解决方案:

  • 重新蚀刻数据。

  • 更改实体。

  • 一种方法是创建一个实体缩减器,如下所示:

    {
      playlists: {
        123: { id: 123, name: 'foo', tracks: [1, 2, 3] }
      },
      users: {
        me: { name: 'Niek', tracks: [2, 3] },
      },
      entities: {
        tracks: {
          1: { name: 'bar', user_favorited: false, ... },
          2: { name: 'foo', user_favorited: false, ... },
          3: { name: 'bar', user_favorited: true, ... }
        }
      }
    }
    
    const tracks减速机=(状态、操作)=>{
    //改变轨道
    }
    const entitiesReducer=(状态、操作)=>{
    让状态=状态;
    //存储所有实体
    if(action.payload&&action.payload.entities){
    _state=merge({},state,action.payload.entities);
    }
    返回合并器({
    轨道:轨道减速器,
    })(_)国家、行动);
    };
    导出默认{实体:entitiesReducer};
    
    *上面的代码使用lodash的merge和redux的combinereducer


    最近,我也一直在思考另一个完整的结构,但没有测试它,也没有发现其他人分享他们的经验。其想法是完全删除第一级“实体”,并将它们存储在相应的键下。从理论上讲,当我们开始对实体进行更改时,它似乎是有意义的,并且将所有类似的还原器、选择器等放在一个地方会更容易

    {
    轨道:{
    实体:{
    1:{name:'bar',user_favorited:false,…},
    2:{name:'foo',user_favorited:false,…},
    3:{name:'bar',user_favorited:true,…}
    },
    top3:[1,2,3],
    是的
    },
    用户:{
    实体:{},
    我:{名字:'Niek',曲目:[2,3]}
    },
    播放列表:{
    实体:{
    123:{id:123,名称:'foo',曲目:[1,2,3]}
    }
    }
    }
    
    你有没有想过这一点?