Vue3 カスタムディレクティブ

デフォルトで設定されているコアディレクティブ(v-model と v-show)に加えて、Vue ではカスタムディレクティブを登録することもできます。

次に、グローバルディレクティブ v-focus を登録します。このディレクティブは、ページ読み込み時に要素がフォーカスを取得する機能を持ちます:

例

<div id="app"> <p>ページ読み込み時に、input 要素が自動的にフォーカスを取得します:</p> <input v-focus> </div> <script>const app = Vue.createApp({}) // グローバルなカスタムディレクティブ `v-focus` を登録する app.directive('focus', { // バインドされた要素が DOM にマウントされたとき…… mounted(el) { // 要素にフォーカスする el.focus() } }) app.mount('#app')</script>

試してみる »

インスタンスで directives オプションを使用してローカルディレクティブを登録することもできます。これにより、ディレクティブはこのインスタンス内でのみ使用できます:

例

<div id="app"> <p>ページ読み込み時に、input 要素が自動的にフォーカスを取得します:</p> <input v-focus> </div> <script>ディレクティブの定義

試してみる »

フック

フック関数

ディレクティブ定義関数には、いくつかのフック関数(オプション)が用意されています:

  • created : バインドされた要素の属性またはイベントリスナーが適用される前に呼び出されます。

  • beforeMount : ディレクティブが最初に要素にバインドされ、親コンポーネントがマウントされる前に呼び出されます。

  • mounted : バインドされた要素の親コンポーネントがマウントされた後に呼び出されます。

  • beforeUpdate: コンポーネントを含む VNode が更新される前に呼び出されます。

  • updated: コンポーネントを含む VNode とその子コンポーネントの VNode が更新された後に呼び出されます。

  • beforeUnmount: バインドされた要素の親コンポーネントがアンマウントされる前に、一度だけ呼び出されます。

  • unmounted: ディレクティブが要素からバインド解除され、親コンポーネントがアンマウントされたときに、一度だけ呼び出されます。

例

import { createApp } from 'vue' const app = createApp({}) //登録 app.directive('my-directive', { //ディレクティブは一連のライフサイクルフックを持っています: //バインドされた要素の attribute またはイベントリスナーが適用される前に呼び出されます created() {}, //バインドされた要素の親コンポーネントがマウントされる前に呼び出されます beforeMount() {}, //バインドされた要素の親コンポーネントがマウントされるときに呼び出されます mounted() {}, //コンポーネントを含む VNode が更新される前に呼び出されます beforeUpdate() {}, //コンポーネントを含む VNode とその子コンポーネントの VNode が更新された後に呼び出されます updated() {}, //バインドされた要素の親コンポーネントがアンマウントされる前に呼び出されます beforeUnmount() {}, //バインドされた要素の親コンポーネントをアンマウントするときに呼び出されます unmounted() {} }) //登録(関数ディレクティブ) app.directive('my-directive', () => { //これは `mounted` と `updated` として呼び出されます }) //getter。登録されている場合、ディレクティブ定義を返します const myDirective = app.directive('my-directive')

フック関数のパラメータ

フック関数のパラメータは次のとおりです:

el

elディレクティブがバインドされた要素。DOM を直接操作するために使用できます。

binding

binding はオブジェクトで、次の属性を含みます:

  • instance:ディレクティブを使用するコンポーネントのインスタンス。
  • value:ディレクティブに渡される値。たとえば、v-my-directive="1 + 1"中では、その値は2。
  • oldValue:以前の値。使用できるのはbeforeUpdateとupdated中だけです。値が変更されているかどうかに関わらず使用できます。
  • arg:ディレクティブに渡されるパラメータ(もしあれば)。たとえばv-my-directive:foo中で、arg は"foo"。
  • modifiers:修飾子(もしあれば)を含むオブジェクト。たとえばv-my-directive.foo.bar中で、修飾子オブジェクトは{foo: true,bar: true}。
  • dir:ディレクティブの登録時にパラメータとして渡されるオブジェクト。たとえば、次のディレクティブでは:
app.directive('focus', {
  mounted(el) {
    el.focus()
  }
})

dir は次のオブジェクトになります:

{
  mounted(el) {
    el.focus()
  }
}

vnode

el パラメータとして受け取った実際の DOM 要素のブループリント。

prevNode

前の仮想ノード。beforeUpdate と updated フックでのみ利用可能です。

次の例では、これらのパラメータの使用法を示しています:

例

<div id="app"> <div v-サンプル="{ name: 'サンプル', url: 'www.example.com' }"></div> </div> ​ <script>const app = Vue.createApp({}) app.directive('サンプル', (el, binding, vnode) => { console.log(binding.value.name) // => "サンプル" console.log(binding.value.url) // => "www.example.com" var s = JSON.stringify el.innerHTML = s(binding.value) }) app.mount('#app')</script>

試してみる »

場合によっては、他のフック関数が不要なこともあります。次の形式で関数を簡略化できます:

Vue.directive('サンプル', function (el, binding) {
  // 设置指令的背景颜色
  el.style.backgroundColor = binding.value.color
})

ディレクティブ関数は、有効な JavaScript 式をすべて受け入れることができます。次の例では、JavaScript オブジェクトを渡しています:

例

<div id="app"> <div v-サンプル="{ color: 'green', text: 'サンプル!' }"></div> </div> <script>Vue.directive('サンプル', function (el, binding) { // 简写方式设置文本及背景颜色 el.innerHTML = binding.value.text el.style.backgroundColor = binding.value.color }) new Vue({ el: '#app' })</script>

試してみる »
その他の拡張