Javascript Apollo GraphQL:类型策略中合并函数的用例?

Javascript Apollo GraphQL:类型策略中合并函数的用例?,javascript,caching,apollo,react-apollo,apollo-client,Javascript,Caching,Apollo,React Apollo,Apollo Client,我以前在上问过这个问题,但我现在把它重新发布在这里,因为两周后它没有得到回答 此问题与引入的新缓存有关。此更新不推荐使用支持“类型策略”(或“字段策略”)的本地查询,其中包括几个用于处理缓存的工具,例如可以为每个GraphQL类型定义的merge函数,以指定传入数据应如何与缓存中的现有数据合并 我想知道哪些用例更适合merge函数,而不是通过writeQuery或writeFragment编写预先计算的更新值 假设我有一个包含对象的数组,这个数组是另一种类型的属性。例如: type Person

我以前在上问过这个问题,但我现在把它重新发布在这里,因为两周后它没有得到回答

此问题与引入的新缓存有关。此更新不推荐使用支持“类型策略”(或“字段策略”)的本地查询,其中包括几个用于处理缓存的工具,例如可以为每个GraphQL类型定义的
merge
函数,以指定传入数据应如何与缓存中的现有数据合并

我想知道哪些用例更适合
merge
函数,而不是通过
writeQuery
writeFragment
编写预先计算的更新值

假设我有一个包含对象的数组,这个数组是另一种类型的属性。例如:

type Person {
  hobbies: [Hobby!]!
}
应用程序允许我删除、添加和更新此数组中的元素。
cabiods
是否应该使用
merge
功能?以前,我在局部变异解析器中编写了这个逻辑,但是这些已经被弃用了。我可以通过为这些解析器中的每一个定义一个函数来轻松地模拟旧的行为,该函数包含添加/删除/更新逻辑,并使用
writeFragment
存储结果

我可以看到使用
merge
的好处,因为(我认为)它是一个较低的抽象层,但它是否可以用于传入
爱好
数组?据我所知,它的工作方式意味着我们必须通过输入推断突变类型。例如:

type Person {
  hobbies: [Hobby!]!
}
  • 如果传入数组包含较少的一个项(或仅包含已删除的项),则我们执行了删除操作,并且可以假定所有其他元素保持不变
  • 如果传入数组只包含一个元素,并且它是新的,那么我们执行了一个添加操作,并将在数组中合并这一元素
  • 如果传入数组包含相同数量的元素(或者只有一个更新项),那么我们必须更新一个元素,现在必须确定要替换哪个元素(我们假设,由于实施的原因,不可能直接更新单个
    爱好
    ,因为其他爱好也可能受到影响,例如,由于不重叠的时间限制)
这似乎没有像以前那样优雅,在调用
writeFragment
之前计算
cabiods
的新值

使用
合并
是否有性能优势?使用
合并
时,
兴趣爱好
中的现有项目和未受影响的项目是否保留在适当位置,使用
写入标签
时是否覆盖?假设传递给
写入标签
的新计算数据包含一个带有浅拷贝的数组,用于未修改的项目不稳定因素

非常感谢你为我澄清这件事