同一次取数,两种写法,时序完全不同

泳道是手画的模拟时序(请求用 setTimeout 假扮,数据是本地假数据),但「谁先谁后、有没有进 HTML、客户端要不要再请求一次」是 Nuxt 真实行为。 先点 ▶ 播放 看模式一,再切到模式二对比右侧「查看源代码」和下面的计数器。

[迷你控制台] 每一步的机制说明会打在这里,Vue 开发版警告也会进来

速查:这四个「取数据」的东西别混

API服务端会等它吗数据进 payload重复请求什么时候用
useFetch(url)会(除非 lazy/server:false)会,且带 prerendered 标记水合时命中同 key → 0 次默认首选;URL 会自动当成 key
useAsyncData(key, fn)会(同上)会(自己决定返回什么可序列化值)同上,按 key 复用要自己包一层逻辑(多接口合并、transform、挑字段)
$fetch(url)不会,它只是个 promise不会写在 setup 顶层 = 服务端 1 次 + 客户端 1 次交互动作(点按钮、翻页)里按需调用
useLazyFetch(url)不等,页面先渲染数据 resolve 后补水合时若 payload 已有 → 0 次非首屏内容:侧栏、推荐位、评论

key 复用规则:useFetch('/api/posts/1') 的 key 是 "/api/posts/1";useAsyncData 的 key 你自己给。 同一个 key 在整个生命周期里只会真正请求一次(第二次读缓存),refresh(key) 会让所有用这个 key 的地方一起更新; 两个组件写了同一个 key,它们共享同一份 data(改一处两处都变)。 要清掉缓存重来用 clearNuxtData(key)。