【发布时间】:2021-05-25 21:12:06
【问题描述】:
我正在使用 Redux-tookit 的 createSlice 和 createEntityAdapter 处理标准化数据。
这是一个典型的博客应用,包含(帖子、cmets、用户)-实体
通常,在使用createEntityAdapter 之前,我会:
- 在
postsSlice中获取、规范化和存储数据
所以我的 postSlicestate看起来像这样:blogPosts: {entities: {posts: {}, users:{}, comments: {}}, ids:[]} - 将
id从postsSlice的状态获取到Posts组件 - 将评论/用户
id从Posts传递给子组件 -CommentUser组件,他们将使用传递的id获取数据,其中选择器连接到父级的postSlice状态
const postsAdapter = createEntityAdapter();
const postsSlice = createSlice({
name: "posts",
initialState: postsAdapter.getInitialState(),
reducers: {
setPosts: (state, { payload }) =>
postsAdapter.setAll(state, payload.entities.posts),
},
});
问题是:
- 使用
createEntityAdapter时
由于我们使用的是createEntityAdapter.getInitialState(),因此我们在每个切片中都会得到相同的initialState{entities: {} ids: []}模式。 - 这不允许像我以前那样拥有 initialState:
blogPosts: {entities: {posts: {}, users:{}, comments: {}}, ids:[]}
是否应该每个组件(Posts、User、Comment)都有自己的切片/reducer,并使用来自同一端点的 thunk 获取自己的数据?
这样: (根据 createEntityAdapter.getInitialState() 模式)
-
postSlicestate 将只包含 post Entity -entities: {posts: {}, ids:[]} -
commentSlice状态 - cmets 实体 -entities: {comments: {}, ids:[]} - 等等……
【问题讨论】:
-
我个人的偏好是有一个
entities切片,其中包含每个实体类型的属性。
标签: reactjs redux react-redux redux-toolkit normalizr