customRef() 独自の動作を持つ ref を作る

最終更新:2026-10-22

customRef() 独自の動作を持つ ref を作る

customRef() はファクトリ関数で依存の追跡とトリガーのタイミングをカスタマイズできます。定番の用途は入力欄へのデバウンスです。

グループリアクティビティ: 応用
種類API
スコープコンポーネント内
Vue バージョン3.0+
SSR 対応対応

📝 構文

function useDebounced(value, delay) {
  return customRef((track, trigger) => ({
    get() { track(); return value },
    set(v) { clearTimeout(timer); timer = setTimeout(() => { value = v; trigger() }, delay) }
  }))
}

⚙️ 引数

factory(track, trigger) => { get, set }。track が依存を収集し、trigger が更新を通知します

戻り値:カスタム動作の ref

▶ 例

以下のコードを編集して結果を確認しましょう:

出力:

Typing fast updates the line only after a 400ms pause — intermediate states are merged.

💡 ポイント

⚠️ 注意 track() と trigger() は必ず呼びます。track を忘れると依存が収集されず、trigger を忘れると更新が発火しません。
💡 ヒント useDebounced のようなコンポーザブルにラップして再利用するのが定番のパターンです。
ℹ️ 補足 デバウンス、スロットル、バリデーション付きの入力モデルなど、独自の同期戦略に最適です。
関連ケースは近日公開予定。

📚 関連チュートリアル

❓ よくある質問

Q 依存を手動で track するのはなぜですか?
A customRef は完全な制御を開発者に委ねるため、いつ依存を収集し、いつ通知するかを明示的に宣言する必要があります。
Q デバウンスに customRef は必須ですか?
A 必須ではありません。watch + setTimeout で通常の ref を管理することもできますが、customRef のほうがまとまりのある書き方です。
Q スロットルも実装できますか?
A できます。set 内で最初の書き込みは即座に実行し、以降は間隔をあけてトリガーすればよいです。
Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%