create-adaptable-composable

create-adaptable-composable

熱門

建立一個符合函式庫等級的 Vue composable,可接受 maybe-reactive 輸入(MaybeRef / MaybeRefOrGetter),讓呼叫者能傳入純值、ref 或 getter。在 reactive 效果(watch/watchEffect)內使用 toValue()/toRef() 正規化輸入,以保持行為可預測且具響應性。當使用者要求建立可適應或可重複使用的 composable 時使用此技能。

2699星標
157分支
更新於 2026/5/30
SKILL.md
readonlyread-only
name
create-adaptable-composable
description

建立一個符合函式庫等級的 Vue composable,可接受 maybe-reactive 輸入(MaybeRef / MaybeRefOrGetter),讓呼叫者能傳入純值、ref 或 getter。在 reactive 效果(watch/watchEffect)內使用 toValue()/toRef() 正規化輸入,以保持行為可預測且具響應性。當使用者要求建立可適應或可重複使用的 composable 時使用此技能。

建立可適應的 Composable

可適應的 composable 是可重複使用的函式,能同時接受響應式與非響應式輸入。這讓開發者可以在各種情境下使用 composable,而不必擔心輸入的響應性。

在 Vue.js 中設計可適應 composable 的步驟:

  1. 確認 composable 的目的、API 設計以及預期的輸入/輸出。
  2. 識別應該具有響應性的輸入參數(MaybeRef / MaybeRefOrGetter)。
  3. 在 reactive 效果中使用 toValue()toRef() 正規化輸入。
  4. 使用 Vue 的響應式 API 實作 composable 的核心邏輯。

核心型別概念

型別工具

/**
 * 值或可寫入的 ref(value/ref/shallowRef/writable computed)
 */
export type MaybeRef<T = any> = T | Ref<T> | ShallowRef<T> | WritableComputedRef<T>;

/**
 * MaybeRef<T> + ComputedRef<T> + () => T
 */
export type MaybeRefOrGetter<T = any> = MaybeRef<T> | ComputedRef<T> | (() => T);

原則與規則

  • 唯讀、適合 computed 的輸入:使用 MaybeRefOrGetter
  • 需要可寫入 / 雙向輸入:使用 MaybeRef
  • 參數可能是函式值(回呼、斷言、比較器):不要使用 MaybeRefOrGetter,否則可能會意外將其作為 getter 呼叫。
  • DOM/元素目標:如果需要 computed/衍生的目標,使用 MaybeRefOrGetter

當使用 MaybeRefOrGetterMaybeRef 時:

  • 使用 toRef() 解析響應式值(例如作為 watcher 的來源)
  • 使用 toValue() 解析非響應式值

範例

可適應的 useDocumentTitle Composable:唯讀的 title 參數

import { watch, toRef } from 'vue'
import type { MaybeRefOrGetter } from 'vue'

export function useDocumentTitle(title: MaybeRefOrGetter<string>) {
  watch(toRef(title), (t) => {
    document.title = t
  }, { immediate: true })
}

可適應的 useCounter Composable:雙向可寫入的 count 參數

import { watch, toRef } from 'vue'
import type { MaybeRef } from 'vue'

function useCounter(count: MaybeRef<number>) {
  const countRef = toRef(count)
  function add() {
    countRef.value++
  }
  return { add }
}