Re:Nuxt

06/20
Lesson 06

Composables

組合式函數

Composables 讓你將可重用的邏輯抽離出來,在任何元件中都能輕鬆使用。

1 核心概念

在寫程式時,我們最忌諱 重複的程式碼 (Don't Repeat Yourself - DRY)。如果你在「首頁」需要一個計數器,在「關於頁」也需要一個計數器,傳統寫法是你得在兩個檔案裡都寫一遍 const count = ref(0)

使用方式

檔案位置:app/composables/useCounter.ts

使用方式:在任何 .vue 檔中直接呼叫 useCounter(),完全不需要寫 import。

這讓你的 Vue 檔案變得很乾淨,只專注在「畫面顯示」,而把「運算邏輯」全部藏在 Composables 裡。

2 給 Claude Code 的中文指令 Prompt

我們要建立一個簡單的計數器邏輯,並讓它具備「加」與「減」的功能。

請複製以下指令給 Claude:

請幫我建立一個 Composable 並在頁面中使用:

  1. 建立 app/composables/ 資料夾。
  2. 建立 app/composables/useCounter.ts
    • 這是一個 TypeScript 檔案。
    • 匯出一個預設函數 (export default function useCounter)。
    • 在函數內部定義一個響應式變數 count (初始值 0)。
    • 定義兩個函數 increment (加 1) 和 decrement (減 1)。
    • 最後 return 一個物件包含 { count, increment, decrement }
  3. 修改 app/pages/index.vue
    • <script setup> 中直接呼叫 const { count, increment, decrement } = useCounter() (不要寫 import)。
    • 在 template 中顯示 count 的數字。
    • 加入兩個按鈕,分別綁定點擊事件到 incrementdecrement

3 驗收重點

請檢查 Claude 完成後的結果:

檔案結構檢查: 確認有 app/composables/useCounter.ts。注意 Nuxt 的習慣命名通常以 use 開頭(駝峰式命名)。

程式碼檢查 (app/pages/index.vue): 檢查 <script setup> 區域,絕對不能出現 import useCounter from ...

功能檢查: 回到瀏覽器首頁,點擊按鈕,數字應該會變動。這證明了邏輯已經成功被抽離並注入到頁面中。

💡 架構師筆記 (Utils vs Composables)

你可能會問:「這跟普通的 helper function 有什麼不同?」

Utils (utils/ 資料夾):通常放純函數(Stateless),例如 formatDate(date)。輸入 A 永遠得到 B,不涉及 Vue 的響應式系統。
Composables (composables/ 資料夾):通常涉及 State (狀態)。例如我們剛寫的 useCounter,它裡面用了 ref()。這意味著當 Composable 裡的資料變動時,畫面會跟著更新。
6