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

Nuxt Apollo Client通过NuxtLink跳转不请求数据仅刷新生效如何解决

Nuxt Apollo 路由跳转不更新数据问题解决方案

问题根因

  • 全页面刷新时触发服务端渲染,Apollo会主动发起请求拉取最新数据,结果会注入到客户端缓存完成水合
  • <NuxtLink>跳转属于客户端路由切换,Apollo默认优先读取本地缓存,不会主动发起新请求
  • 此前修改fetchPolicy出现水合报错,核心是服务端与客户端查询策略不一致,导致服务端返回的HTML内容和客户端首次渲染内容不匹配
  • 注意你测试时填写的netowrk-only为拼写错误,正确写法是network-only,拼写错误会导致配置不生效

可落地解决方案

方案1:区分环境配置fetchPolicy(最推荐)

针对单个查询分别配置服务端、客户端的拉取策略,既保证数据最新,又避免水合报错,修改test.vue的apollo配置即可:

<script>
import testQuery from '~/apollo/queries/test.graphql'

export default {
  apollo: {
    users: {
      query: testQuery,
      prefetch: true,
      // 服务端始终走网络拉最新数据,客户端先返回缓存再更新数据
      fetchPolicy: process.server ? 'network-only' : 'cache-and-network',
    },
  },
}

如果不需要旧数据瞬间展示的中间态,可以将客户端策略改为network-only,水合阶段会自动复用服务端注入的缓存数据对齐渲染结果,不会触发报错。

方案2:客户端挂载后手动重查

如果仅需要特定页面跳转时刷新数据,直接在组件mounted钩子触发重查即可,该钩子仅在客户端执行,不会影响服务端渲染:

<script>
import testQuery from '~/apollo/queries/test.graphql'

export default {
  apollo: {
    users: {
      query: testQuery,
      prefetch: true,
    },
  },
  mounted() {
    // 强制重新拉取最新数据,覆盖缓存
    this.$apollo.queries.users.refetch()
  }
}
</script>

方案3:全局配置默认拉取策略

如果所有查询都需要每次拉取最新数据,直接在apollo.config.js中添加全局默认配置即可:

export default context => ({
  httpEndpoint: 'https://test.hasura.app/v1/graphql',
  getAuth () {
    return context.store.state.auth.token ? `Bearer ${context.store.state.auth.token}` : null
  },
  // 新增全局默认查询策略
  defaultOptions: {
    query: {
      fetchPolicy: process.server ? 'network-only' : 'cache-and-network',
    }
  }
})

内容的提问来源于stack exchange,提问作者Evaldas B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 12:09:01