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