Reactjs 标准化器&x2B;Redux-更新单个实体的属性
我正在构建一个音乐播放器应用程序,并使用RESTAPI从各个端点(播放列表、某个用户发布的曲目等)获取曲目 我正在使用redux和normalizer来管理我的状态。我创建了一个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,
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]}
}
}
}
你有没有想过这一点?