56
Vue 3 學習之旅
響應式進階

Day 56: 自訂 ref: customRef

·6 分鐘閱讀·響應式進階

摘要

customRef 是一個高階 API,它允許我們完全自訂一個 ref 的行為,包括對其依賴追蹤 (track) 和變更通知 (trigger) 的精確控制。

定義與說明

customRef 接收一個工廠函數作為參數。該工廠函數會接收 tracktrigger 兩個函數作為參數,並必須回傳一個帶有 get 和 set 方法的物件。你可以在 get 中手動呼叫 track() 來收集依賴,在 set 中手動呼叫 trigger() 來通知更新。

實作範例

Vue SFC
// 實現一個帶有 debounce(防抖)功能的 ref。
import { customRef } from 'vue';

function useDebouncedRef(value, delay = 200) {
  let timeout;
  return customRef((track, trigger) => {
    return {
      get() {
        track(); // 告訴 Vue 追蹤這個依賴
        return value;
      },
      set(newValue) {
        clearTimeout(timeout);
        timeout = setTimeout(() => {
          value = newValue;
          trigger(); // 在延遲後,告訴 Vue 更新畫面
        }, delay);
      }
    };
  });
}

// const text = useDebouncedRef('hello');

結論

customRef 為我們打開了 Vue 響應式系統的底層控制大門。它可以用於實現如防抖、節流、與外部狀態同步等複雜的自訂響應式行為。

customRef 自訂響應式 track/trigger