You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"]
  }
}

我的疑问

  1. 是否必须先从服务器获取所有评论,才能从Redux状态中查询所需的评论?或者,是否应在展示特定帖子时,通过该帖子的comments ID数组从服务器获取所需评论?此时是否需要替换Redux状态中的所有评论实体?

  2. 官方文档中的如下结构何时适用?它是否仍属于规范化状态?该如何处理其异步逻辑?

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

  • 不需要预先获取所有评论,更合理的做法是按需加载:当展示特定帖子时,根据该帖子的comments ID数组,调用后端接口获取对应评论数据。
  • 此时不需要替换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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 20:06:51