代码之家  ›  专栏  ›  技术社区  ›  jorgen

查询覆盖阿波罗缓存中缺少的字段

  •  3
  • jorgen  · 技术社区  · 6 年前

    我有时需要查询一个包含多个字段的多个对象的列表,有时只查询一个包含多个字段的对象。作为一个例子,考虑这两个查询:

    • 包含多个对象和几个字段的查询:

      query {
        object(many=true) {
          id
          name
        }
      }
      
    • 具有单个对象和多个字段的查询:

      query {
        object(many=false) {
          id
          ... (many other fields)
        }
      }
      

    我不想在第一个查询中要求超出所需的字段,因为这将导致请求包含大量数据(否则我可以使字段相同,例如使用 fragment ,解决我的问题)。

    问题是:存储在缓存中的数据是标准化的,并根据 __typename id . 这意味着如果查询或查询原子相同,它们将相互覆盖。因此,如果第二个查询最后发生,则数据库中的项没有 name 字段,与第一个查询关联的组件所需。

    名称 在第二个查询中也是如此。问题是,这看起来很脆弱,而且容易出错;例如,一个人可能创建了第三个查询,却忘记了请求 那里

    __类型名 的,即在后端区分它们。但这似乎有点做作;这些查询实际上处理的是同一类对象。

    有没有一个规范的方法来处理这个问题?

    0 回复  |  直到 6 年前
        1
  •  0
  •   jorgen    4 年前

    对于任何在这里结束的人:结果是在当前版本中,至少(@apollo/client 3.3.6)数据是合并的,所以这不是问题。