假设我有一个这样的结构,它是通过调用API并使用“normalizr”来处理我的实体得到的结果:
现在我有一个通过用户筛选帖子的方法,基本上会做到这一点:
现在,如果我向API发送添加用户帖子的请求,并返回新创建的帖子记录,那么该记录将自动添加到我的实体帖子中。
那么,我如何处理更新用户以反映该更改,使得用户现在有3个帖子,并且数组中有新的帖子id?
我应该创建一个reducer并监听帖子创建操作,在其中更新state.entities.users.posts吗?重新获取实体似乎不是一个选项。最好的方法是什么?
谢谢
更新:
这是我现在正在使用的解决方案,以保持数据一致性。我修改响应以考虑已创建的帖子ID。我知道这可以分解成多个reducers,但我仍然想知道是否有更好和更直接的方法,而不必为每个嵌套实体都这样做。
entities: {
users:{
1: {
name: 'John',
posts: [ 1, 4 ]
}
},
posts: {
1: {
name: 'First Post',
},
4: {
name: 'Second Post',
}
}
}
现在我有一个通过用户筛选帖子的方法,基本上会做到这一点:
let filteredPosts = {};
entities.users.posts.forEach(key => {
if(posts.hasOwnProperty(key))
filteredPosts[key] = posts[key]
});
同时还需要一个页面,展示该用户的帖子,例如:
render() {
return(
<div>
{Object.keys(filteredPosts).map(key => {
return (
<div>{filteredPosts[key].name}</div>
);
})}
</div>
)
}
我的实体减速器非常简单:
import { merge } from 'lodash';
...
function entities(state = { users: {}, posts: {} }, action) {
if (action.response && action.response.entities) {
return merge({}, state, action.response.entities);
}
return state;
}
现在,如果我向API发送添加用户帖子的请求,并返回新创建的帖子记录,那么该记录将自动添加到我的实体帖子中。
那么,我如何处理更新用户以反映该更改,使得用户现在有3个帖子,并且数组中有新的帖子id?
我应该创建一个reducer并监听帖子创建操作,在其中更新state.entities.users.posts吗?重新获取实体似乎不是一个选项。最好的方法是什么?
谢谢
更新:
这是我现在正在使用的解决方案,以保持数据一致性。我修改响应以考虑已创建的帖子ID。我知道这可以分解成多个reducers,但我仍然想知道是否有更好和更直接的方法,而不必为每个嵌套实体都这样做。
function entities(state = {}, action) {
...
if(action.type === 'POST_ADD_SUCCESS') {
// Get the user id from the created post
let userId = response.entities.posts[response.result].userId;
// Add the user with all his posts to the response
response.entities.users = {
[userId]: {
posts: [...state.users[userId].posts, response.result]
}
}
}
...
// Merge normally
return merge({}, state, response.entities);
}