Vue Academy · レッスン

カスタムディレクティブの作成

app.directive()、mounted/updated/unmountedフック、ディレクティブの引数と修飾子について学習します。

レッスン 4/413 ステップ

「カスタムディレクティブの作成」はCoddyKit上の無料Vue Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはVue Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Vue Academyコースには全4レッスンが含まれています。

コンポーネントだけでは足りない場合

Vue での再利用の大半は、コンポーネントとコンポーザブルを通じて行います。しかし、自動的に入力欄へフォーカスを当てる処理や、Vue 以外のライブラリとの統合、要素の測定など、生の DOM を対象とするロジックもあります。カスタムディレクティブは、まさにこのために用意されています。

最小限のディレクティブ

app.directive を使って、アプリにディレクティブを登録します。mounted フックは要素を受け取るため、このディレクティブでは入力欄が表示されたときにフォーカスします。

const app = createApp(App)
app.directive('focus', {
  mounted(el) { el.focus() }
})

ディレクティブを使用する

テンプレートでは、v- プレフィックスに登録した名前を続けて適用します。

<template>
  <input v-focus />
</template>

script setup でのローカルディレクティブ

<script setup> 内では、v で始まるキャメルケースのトップレベル変数が、使用可能なディレクティブになります。vFocus という名前を付けると、v-focus として使用できます。

<script setup>
const vFocus = {
  mounted: (el) => el.focus()
}
</script>

<template>
  <input v-focus />
</template>

バインディングオブジェクト

すべてのフックは、第2引数として binding オブジェクトを受け取ります。このオブジェクトには、テンプレートから渡されたディレクティブの値、引数、修飾子が含まれます。

app.directive('demo', {
  mounted(el, binding) {
    console.log(binding.value, binding.arg, binding.modifiers)
  }
})

値を渡す

等号の後の式は binding.value になります。ここでは色を渡し、それを要素に適用しています。

<!-- template -->
<p v-color="'red'">Hello</p>

<!-- directive -->
app.directive('color', {
  mounted(el, binding) { el.style.color = binding.value }
})

引数を渡す

コロンの後の部分は binding.arg になります。これにより、1つのディレクティブをラベルに応じて異なる動作にできます。

<!-- v-pin:top means binding.arg === 'top' -->
<div v-pin:top="20"></div>

修飾子を使用する

修飾子はドットの後に記述し、binding.modifiers では真偽値のマップとして渡されます。修飾子を使って動作を調整できます。

<!-- v-pin.fixed -> binding.modifiers.fixed === true -->
<div v-pin.fixed="10"></div>

ディレクティブのライフサイクルフック

ディレクティブには、コンポーネントのライフサイクルに対応するフックがあります。created、beforeMount、mounted、beforeUpdate、updated、beforeUnmount、unmounted です。

更新に反応する

updated フックは、要素が再レンダリングされた後に実行されます。binding.value と binding.oldValue を比較して実際に変更があった場合のみ処理し、unmounted で後片付けを行います。

app.directive('color', {
  mounted(el, binding) { el.style.color = binding.value },
  updated(el, binding) {
    if (binding.value !== binding.oldValue) el.style.color = binding.value
  }
})

ディレクティブとコンポーネントの違い

構造や状態に関わる処理には、コンポーネントを優先してください。フォーカス管理やサードパーティ製の DOM ウィジェットのように、コンポーネントでは扱いにくい低レベルの DOM への直接アクセスが必要な場合にのみ、ディレクティブを使用します。

理解度チェック

カスタムディレクティブの知識を確認します。

まとめ

カスタムディレクティブの作成方法を学びました。

  • app.directive でグローバルに登録するか、script setup で vName としてローカルに登録します。
  • binding.value、binding.arg、binding.modifiers を使ってデータを受け取ります。
  • ライフサイクルフックには created、beforeMount、mounted、beforeUpdate、updated、beforeUnmount、unmounted があります。
  • 低レベルの DOM 操作にはディレクティブを使用し、それ以外ではコンポーネントを優先します。
無料で開始

AI チューターと学ぶ HTML — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
42
レッスン
156

よくある質問

「カスタムディレクティブの作成」レッスンは無料ですか?

はい。「カスタムディレクティブの作成」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Vue Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Vue Academyコースには全4レッスンが含まれています。

「カスタムディレクティブの作成」で何を学びますか?

app.directive()、mounted/updated/unmountedフック、ディレクティブの引数と修飾子について学習します。 ブラウザで直接実行するハンズオンコードでVue Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Vue Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのVue Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「カスタムディレクティブの作成」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このVue Academyレッスンでコードを書いて実行できますか?

はい。すべてのVue Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. v-model:双方向バインディングの内部動作
  2. v-onイベント修飾子
  3. v-bindの動的バインディングと複数バインディング
  4. カスタムディレクティブの作成
← Vue Academyに戻る