如何使用writeFragment更新对象所属字段?
如何用writeFragment更新嵌套Goals数组并自动刷新页面
嘿,看起来你已经找对方向了——选择操作Resolution实体而非单独的Goals是完全正确的,因为Goals作为Resolution的嵌套字段,Apollo Client的缓存是围绕根实体来管理的。既然你已经能通过readFragment成功读取Resolution,那接下来只需要用writeFragment更新这个实体里的Goals数组,就能让页面自动感知到变化并刷新了。
下面是具体的实现步骤:
1. 确认Fragment定义匹配数据模型
首先要确保你用来读取和写入的Fragment结构和你的数据模型完全对齐,特别是嵌套的Goals字段:
const RESOLUTION_FRAGMENT = gql` fragment ResolutionWithGoals on Resolution { _id name completed goals { _id name completed } } `;
2. 在Mutation成功后执行缓存更新
当添加Goal的Mutation返回新创建的Goal对象后,按以下步骤更新缓存:
// 从Mutation结果中取出新创建的goal对象 const newGoal = mutationResult.data.addGoal; // 1. 读取当前缓存中的Resolution实体 const currentResolution = client.readFragment({ id: `Resolution:${resolutionId}`, // 替换为你的Resolution缓存ID,格式通常是「类型名:ID值」 fragment: RESOLUTION_FRAGMENT, }); // 2. 以不可变方式构造更新后的Goals数组 const updatedGoals = [...currentResolution.goals, newGoal]; // 3. 用writeFragment写入更新后的缓存 client.writeFragment({ id: `Resolution:${resolutionId}`, fragment: RESOLUTION_FRAGMENT, data: { ...currentResolution, goals: updatedGoals, }, });
关键注意事项
- 缓存ID格式:Apollo Client默认缓存ID为
类型名:ID值,请确保resolutionId是对应Resolution的_id值,类型名要和GraphQL Schema中的定义一致(比如Resolution)。 - 不可变更新:必须用展开运算符或类似方式创建新数组/对象,不要直接修改
currentResolution.goals——直接修改缓存对象可能无法触发Apollo的更新检测。 - Fragment结构匹配:写入的
data必须完全符合Fragment定义的结构,字段不能缺失或多余,否则Apollo可能会忽略本次更新。
完成以上操作后,Apollo Client的缓存会更新对应的Resolution实体,所有订阅该Resolution数据的组件都会自动接收更新并重新渲染,新增的Goal就能立刻显示在页面上了。
内容的提问来源于stack exchange,提问作者VikR
相关产品推荐
相关产品推荐

