Nuxt3页面重载时useFetch的error值始终为null问题
问题成因
这是Nuxt v3 RC-3版本中useFetch在客户端首屏初始化阶段的时序bug,两种访问场景下的执行逻辑差异直接导致了现象不一致:
- 通过
nuxt-link客户端跳转进入页面时,组件<script setup>的执行时机是Vue客户端路由完全挂载完成后,此时Nuxt客户端侧的数据请求上下文已经初始化完毕,useFetch返回的error响应式状态可以在请求结束后正常更新,判断逻辑能拿到正确值。 - 直接刷新页面/地址栏输入访问时,Nuxt会先走客户端水合流程,因为你配置了
server: false,服务端不会发起该请求,请求会被放到客户端侧发起。但首屏初始化的同步执行栈运行时,useFetch返回的响应式变量error的更新订阅机制还没完成绑定,你写在await useFetch(...)之后的同步判断逻辑,会在请求状态(包括错误状态)写入响应式ref之前执行,所以此时读到的error.value永远是初始空值。 - 用
setTimeout包裹后问题消失的原因很明确:setTimeout回调属于宏任务,会等当前同步执行栈全部清空、Nuxt客户端水合完成、useFetch的响应式状态绑定全部生效后才执行,此时再读取error.value自然能拿到正确结果。
修复方案
不要依赖setTimeout做兼容——不同设备的水合速度存在差异,固定延时没法保证100%覆盖场景,容易出偶发bug。可以选以下两种稳妥方案:
- 保持RC-3版本的前提下,用
watch监听error状态变化处理逻辑
const {data: verification, error } = await useFetch(`/proxy/api/does-not-exist`, { server: false, credentials: "include", }); watch(error, (errVal) => { if (errVal) { // 错误处理逻辑放在这里,首屏刷新、客户端跳转场景都能正常触发 } }, { immediate: true })
- 升级到Nuxt3正式版本,该时序问题在正式版发布前已经完成修复,首屏初始化阶段
useFetch的状态更新时序做了对齐,不需要额外处理,直接在顶层await之后同步判断error.value就能拿到正确结果。
内容的提问来源于stack exchange,提问作者SPQRInc
相关产品推荐
相关产品推荐

