Json 规范化RESTAPI的redux状态

Json 规范化RESTAPI的redux状态,json,reactjs,rest,web-services,redux,Json,Reactjs,Rest,Web Services,Redux,考虑以下Reddit启发的模式 我正在开发用于管理用户、帖子和评论的管理GUI(在这里伪造实际域)。React应用程序具有不同的路由(导航选项卡): 用户列出用户及其帖子和评论 帖子列出帖子及其评论(包括原始用户) 这两条路线还允许编辑列出的实体 我定义了以下REST端点 /users /users/{id}/posts /users/{id}/ /posts /posts/{id}/comments 在这种情况下,我应该如何塑造Redux状态?我应该吗 A) 只需在自己的子树中按id分

考虑以下Reddit启发的模式

我正在开发用于管理用户、帖子和评论的管理GUI(在这里伪造实际域)。React应用程序具有不同的路由(导航选项卡):

  • 用户列出用户及其帖子和评论
  • 帖子列出帖子及其评论(包括原始用户)
这两条路线还允许编辑列出的实体

我定义了以下REST端点

/users
/users/{id}/posts
/users/{id}/
/posts
/posts/{id}/comments
在这种情况下,我应该如何塑造Redux状态?我应该吗

A) 只需在自己的子树中按id分组不同的实体类型?在这种情况下,检索所有帖子或为用户检索帖子实际上是在同一子树上操作的。React组件将过滤此子树,以根据需要检索其道具


B) 使树的形状更细粒度,以便与路由一起使用?例如,按id分组帖子路由帖子,按用户id分组用户路由帖子?此解决方案将导致一些冗余的重复,直到使用额外的工作使事情正常化。

这取决于您正在构建的应用程序的复杂性。你看过那本书了吗

从API端点看,post和用户看起来是非常分离的,而评论是在post上下文中活动的。如果这是真的,则此redux状态可能是一个良好的开端:

{
  entities: {
    posts: {
      [postId1]: [
        // comments
      ],
      ...
    },
    users: {
      [userId]: {
        posts: [postId1, postId2, ...]
      },
      ...
    }
  },
  ui: {
    screen1: {
      fetchedPosts: [postId1, postId2],
      fetchedUsers: [userId10, userId11]
    }
  }
}
实体
用作获取数据的本地数据库,而
ui
保存实体的ID,以呈现特定组件。当组件执行提取时,响应数据存储在相关实体中,而ID也存储在组件的redux状态中。然后,在组件的渲染方法中,在两者之间进行匹配

使用此模式,您可以获得单一的真实性来源,可以在组件之间共享实体,进行分页,持久化数据。这是一个很好的实现细节