Re:Nuxt

08/20
Lesson 08

Data Refreshing

資料更新與連動

useFetch 不僅僅是一個 HTTP 請求函數,它是一個會監聽變數的機器人。

1 核心概念 兩大更新技巧

useFetch 提供兩種更新資料的方式:

1. 手動更新 (refresh)

當你解構 useFetch 時,會得到一個 refresh 函數。呼叫它,Nuxt 就會重新發送請求。

const { data, refresh } = await useFetch('/api/time')
// 綁定在按鈕上: @click="refresh()"

2. 自動連動 (Reactivity)

如果你在 useFetch 的 URL 或參數中放入了 ref 變數,當這個變數改變時,Nuxt 會自動重新抓取資料。

const page = ref(1)
// 當 page.value 變了,useFetch 會自動重跑!
const { data } = await useFetch('/api/posts', {
query: { _page: page }
})

2 給 Claude Code 的中文指令 Prompt

我們要製作一個具備「分頁功能」的文章列表,來體驗自動重新抓取。

請複製以下指令給 Claude:

請建立一個具備分頁功能的文章列表頁面:

  1. 建立新頁面 app/pages/pagination.vue
  2. 定義一個響應式變數 page,預設值為 1。
  3. 使用 useFetch 抓取 https://jsonplaceholder.typicode.com/posts
  4. 設定 query 參數:{ _page: page, _limit: 5 }
    • 注意:請直接將 page ref 傳入 query 物件,不要傳 page.value,這樣才能啟用自動監聽功能。
  5. 解構回傳值取得 data (命名為 posts), pending, refresh
  6. 在 template 中:
    • 顯示目前的頁碼。
    • 顯示文章列表 (v-for)。
    • 加上「上一頁」按鈕 (page > 1 時才啟用,點擊後 page--)。
    • 加上「下一頁」按鈕 (點擊後 page++)。
    • 加上一個「手動重新整理」按鈕 (點擊後呼叫 refresh())。
  7. app/pages/index.vue 加入連往此頁的連結。

3 驗收重點

請檢查 Claude 完成後的結果:

自動連動測試:

點擊「下一頁」,page 變成了 2。觀察:文章列表有沒有自動變換?

成功:你完全沒寫 watch,但資料自己更新了。這是 Nuxt useFetch 最強大的特性。
失敗:如果按下一頁只有數字變、列表沒變,代表 Claude 可能錯誤地寫成了 page.value
Loading 狀態:

當你快速切換頁面時,應該會短暫看到 pending 狀態(如果你有實作 Loading UI)。

手動重新整理:
  • 打開瀏覽器的 Network tab (F12 → Network)。
  • 點擊「手動重新整理」按鈕。
  • 你應該會看到一個新的 API 請求發送出去。

⚠️ 架構師筆記 (Watch 陷阱)

很多新手會寫成這樣:

useFetch(..., { query: { page: page.value } })

警告:如果你加了 .value,你就只是傳了一個死掉的數字 (純值)進去。Nuxt 不知道它原本是個變數,所以變數改了 Nuxt 也不會理你。

記住:在 Nuxt 的 useFetch 參數裡,把 ref 整顆傳進去,不要拆開。

8