Redux规范化状态下的异步逻辑处理相关疑问
关于Redux规范化状态与后端接口对接的疑问
我查阅了大量Redux状态规范化的相关资料,但仍不清楚与后端接口对接时的流程。若有人能回复此帖,我将不胜感激,恳请分享规范化状态下异步逻辑的处理知识或参考资料。
Redux官方规范化状态简化示例
{ posts : { byId : { "post1" : { id : "post1", author : "user1", body : "......", comments : ["comment1", "comment2"] } }, allIds : ["post1"] }, comments : { byId : { "comment1" : { id : "comment1", author : "user2", comment : ".....", }, "comment2" : { id : "comment2", author : "user3", comment : ".....", } }, allIds : ["comment1", "comment2", "comment3", "comment4", "comment5"] }, users : { byId : { "user1" : { username : "user1", name : "User 1", } }, allIds : ["user1"] } }
我的疑问
是否必须先从服务器获取所有评论,才能从Redux状态中查询所需的评论?或者,是否应在展示特定帖子时,通过该帖子的comments ID数组从服务器获取所需评论?此时是否需要替换Redux状态中的所有评论实体?
官方文档中的如下结构何时适用?它是否仍属于规范化状态?该如何处理其异步逻辑?
entities: { authors : { byId : {}, allIds : [] }, books : { byId : {}, allIds : [] }, authorBook : { byId : { 1 : { id : 1, authorId : 5, bookId : 22 }, 2 : { id : 2, authorId : 5, bookId : 15, }, 3 : { id : 3, authorId : 42, bookId : 12 } }, allIds : [1, 2, 3] } }
解答
针对疑问1
- 不需要预先获取所有评论,更合理的做法是按需加载:当展示特定帖子时,根据该帖子的
commentsID数组,调用后端接口获取对应评论数据。 - 此时不需要替换Redux中已有的所有评论实体,而是采用合并更新的方式:将新获取的评论数据添加到
comments.byId中,同时更新comments.allIds(如果需要维护全量ID列表的话)。这样可以避免重复存储相同ID的评论,也能保留之前加载的其他评论数据。 - 具体实现时,可以在异步逻辑中先检查Redux状态里是否已经存在该评论ID对应的实体,若已存在则跳过请求或只更新需要刷新的字段,减少不必要的网络请求。
针对疑问2
- 这个结构适用于处理多对多关系的场景,比如作者和书籍的关联:一个作者可以写多本书,一本书也可以由多个作者编写,
authorBook就是用来存储这种关联关系的中间表实体。 - 它完全属于规范化状态,因为所有实体(作者、书籍、关联关系)都采用了
byId+allIds的标准规范化结构,每个实体都有唯一ID标识,没有嵌套冗余数据。 - 异步逻辑处理方式:
- 加载作者或书籍数据时,可同时请求对应的关联关系数据,将关联实体和关联关系分别存入
authors、books、authorBook中。 - 查询某作者的所有书籍时,先从
authorBook中找到该作者ID对应的所有bookId,再从books.byId中取出对应的书籍实体;反之亦然。 - 更新关联关系时,直接针对
authorBook实体进行增删改操作,无需修改authors或books的核心数据,保持状态的整洁和可维护性。
- 加载作者或书籍数据时,可同时请求对应的关联关系数据,将关联实体和关联关系分别存入
参考资料
- 有用解答:markerikson在Stack Overflow上的相关Redux规范化状态解答
- Redux官方文档:《异步逻辑》、《规范化状态结构》、《更新规范化状态》
内容的提问来源于stack exchange,提问作者Vladimir Kim
相关产品推荐
相关产品推荐

