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

Apollo GraphQL结合Nextjs使用时Delete Mutation后未重拉Query如何解决

排查及修复方案

  1. 核对查询字段名一致性
    你新增操作中读取缓存用的字段是mainCategories,删除操作里读的是getMainCategories,如果FETCH_MAINCATEGORIES_QUERY定义的返回字段和其中任意一个不匹配,缓存读写就会失效,先确认查询返回的字段名,保证两处读写用的key完全一致。

  2. 补全客户端组件声明
    Next.js 13及以上版本默认所有组件为服务端组件,没有加'use client'声明的组件无法正常运行React客户端钩子,检查DeleteButton、表格组件、表单组件的顶部是否添加了'use client'指令。

  3. 补全删除mutation的refetch配置
    你当前贴出的DeleteButton代码中没有添加refetchQueries配置,添加时额外加上awaitRefetchQueries保证查询完成再执行后续逻辑,示例如下:

const [deleteMainCategoryOrMutation] = useMutation(mutation, {
  update(proxy) {
    // 原有逻辑
  },
  variables: {
    mainCategoryId,
  },
  // 新增以下配置
  refetchQueries: [{ query: FETCH_MAINCATEGORIES_QUERY }],
  awaitRefetchQueries: true
});
  1. 修正缓存更新写法
    Apollo缓存要求不可变更新,你现在直接修改读取到的data对象属性会导致缓存更新无法触发,调整为如下写法:
if (mainCategoryId) {
  const { getMainCategories } = proxy.readQuery({
    query: FETCH_MAINCATEGORIES_QUERY,
  });
  const newCategories = getMainCategories.filter(
    (ap) => ap.id !== mainCategoryId
  );
  toast.error(`Main Category Deleted`, { autoClose: 2000 });
  proxy.writeQuery({ 
    query: FETCH_MAINCATEGORIES_QUERY, 
    data: { getMainCategories: newCategories } 
  });
}
  1. 确认Apollo Client为单例
    如果你的Apollo Client实例没有做单例处理,Next.js服务端渲染过程中会重复生成实例,导致多个组件缓存无法共享,检查Apollo Client的初始化逻辑,保证全局只有一个实例供所有客户端组件调用。

内容的提问来源于stack exchange,提问作者Mohammad Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 20:36:00