create-adaptable-composable について
Vue.js 開発者向けに、リアクティブ値と通常値の両方を受け取るコンポーザブルの設計を説明するスキルです。型の選択や Vue のリアクティビティ API による入力の正規化に加え、書き込み可能な値と関数パラメーターの扱いを案内します。
主な機能
- 01再利用可能なコンポーザブル API の設計
- 02MaybeRef と MaybeRefOrGetter の選択
- 03toRef または toValue による入力の正規化
- 04書き込み可能な入力と読み取り専用入力の処理
活用シーン
- 01ref と通常値に対応するコンポーザブルの作成
- 02計算値や派生入力への対応
- 03双方向に書き込み可能なコンポーザブルの作成
- 04関数パラメーターの誤った呼び出しの回避
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ vuejs-ai/ skills --skill create-adaptable-composableインストール後、Claude Code で/create-adaptable-composableを入力して読み込まれたか確認します。
詳細
柔軟に組み合わせて使えるコンポーザブルを作成する
柔軟に組み合わせて使えるコンポーザブルは、リアクティブな入力と非リアクティブな入力の両方を受け取れる再利用可能な関数です。これにより、開発者は入力のリアクティビティを気にせず、さまざまなコンテキストでコンポーザブルを使用できます。
Vue.js で柔軟に組み合わせて使えるコンポーザブルを設計する手順:
- コンポーザブルの目的、API 設計、想定される入出力を確認します。
- リアクティブにする入力パラメーター(MaybeRef / MaybeRefOrGetter)を特定します。
- リアクティブエフェクト内で、
toValue()またはtoRef()を使って入力を正規化します。 - Vue のリアクティビティ API を使って、コンポーザブルのコアロジックを実装します。
中核となる型の概念
型ユーティリティ
/**
* value or writable 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は使わないでください - DOM/要素のターゲットで、computed/派生ターゲットを使いたい場合は、
MaybeRefOrGetterを使います
MaybeRefOrGetter または MaybeRef を使う場合:
- リアクティブな値は
toRef()で取得します(例:watcher のソース) - 非リアクティブな値は
toValue()で取得します
例
読み取り専用のタイトルパラメーターを持つ、柔軟に組み合わせて使える useDocumentTitle コンポーザブル
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 コンポーザブル
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 }
}
コメント
Markdown 対応