カスタム命令
目次
- #関数の省略形 ##オブジェクトリテラル
##コア機能に加えて、デフォルトで構築される-in 命令 (v-model
およびv-show
) では、Vue ではカスタム ディレクティブの登録も可能です。 Vue2.0 では、コードの再利用と抽象化の主な形式はコンポーネントであることに注意してください。ただし、場合によっては、通常の DOM 要素に対して低レベルの操作を実行する必要がある場合もあり、その場合にはカスタム ディレクティブが使用されます。次のような、フォーカスされた入力ボックスの例を見てみましょう。
autofocusが動いています(Safari版では動作しません)。実際、このページを開いた後に何もクリックしていない限り、入力ボックスはフォーカスされたままになっているはずです。次に、ディレクティブを使用してこの関数を実装しましょう:
// 注册一个全局自定义指令 `v-focus` Vue.directive('focus', { // 当被绑定的元素插入到 DOM 中时…… inserted: function (el) { // 聚焦元素 el.focus() } })
ローカル ディレクティブを登録したい場合、コンポーネントは directives
オプションも受け入れます:
directives: { focus: { // 指令的定义 inserted: function (el) { el.focus() } } }
その後、次のように、任意の要素に新しい v-focus
属性を追加します:
<input v-focus>
フック関数
コマンド定義オブジェクトは、次のフック関数を提供できます (すべてオプション):
- : 1 回だけ呼び出されます。初めてディレクティブが要素にバインドされるとき。ここではワンタイムの初期化設定を行うことができます。
inserted : バインドされた要素が親ノードに挿入されるときに呼び出されます (親ノードのみが存在することが保証されますが、必ずしもドキュメントに挿入されるわけではありません)。
update : コンポーネントの VNode が更新されるときに呼び出されます - ただし、子 VNode が更新される前に呼び出される場合もあります
。ディレクティブの値は変更されている場合もあれば、変更されていない場合もあります。ただし、更新前後の値を比較することで、不要なテンプレートの更新を無視できます (フック関数のパラメーターの詳細については、以下を参照してください)。
VNode の詳細については、 後で
レンダリング関数について説明する
componentUpdated
: 命令が配置されているコンポーネントのすべての VNode とそのサブ VNode が更新された後に呼び出されます。unbind
: 命令が要素からバインドされていないときに、1 回だけ呼び出されます。
次に、フック関数のパラメータ (つまり、el
、binding
、vnode
、 oldVnode
)。
#フック関数のパラメータ
コマンド フック関数は次のパラメータで渡されます。 :
el
: 命令にバインドされた要素を使用して、DOM を直接操作できます。
binding
: 次の属性を含むオブジェクト:
name
: 命令名、 v- プレフィックスは含まれません。
value
: ディレクティブのバインディング値。例:
v-my-directive="1 1"、バインディング値は
2です。
oldValue
: ディレクティブによってバインドされた以前の値。
updateフックと
componentUpdatedフックでのみ使用できます。値が変更されているかどうかに関係なく使用できます。
#expression
: 文字列形式の命令式。たとえば、
v-my-directive="1 1"の場合、式は
"1 1"です。
arg
: コマンドに渡されるパラメータ (オプション)。たとえば、
v-my-directive:fooでは、パラメーターは
"foo"です。
modifiers
: モディファイアを含むオブジェクト。例:
v-my-directive.foo.barでは、修飾子オブジェクトは
{ foo: true, bar: true }です。
vnode
: Vue コンパイルによって生成された仮想ノード。詳細については、
VNode API に移動してください。oldVnode
: 以前の仮想ノード。
updateフックと
componentUpdatedフックでのみ使用できます。
el
#これは、次のプロパティを使用するカスタム フックの例です:を除き、他のパラメータはすべて読み取り専用であり、変更しないでください。フック間でデータを共有する必要がある場合は、要素の
datasetを通じて行うことをお勧めします。
<div id="hook-arguments-example" v-demo:foo.a.b="message"></div>
Vue.directive('demo', { bind: function (el, binding, vnode) { var s = JSON.stringify el.innerHTML = 'name: ' + s(binding.name) + '<br>' + 'value: ' + s(binding.value) + '<br>' + 'expression: ' + s(binding.expression) + '<br>' + 'argument: ' + s(binding.arg) + '<br>' + 'modifiers: ' + s(binding.modifiers) + '<br>' + 'vnode keys: ' + Object.keys(vnode).join(', ') } }) new Vue({ el: '#hook-arguments-example', data: { message: 'hello!' } })
ディレクティブのパラメータは動的にすることができます。たとえば、 たとえば、固定レイアウトを通じてページ上の要素を固定するカスタム ディレクティブを作成するとします。次のようなディレクティブ値によって垂直ピクセル値を更新するカスタム ディレクティブを作成できます。 これにより、要素がページの上部から 200 ピクセルの位置に固定されます。しかし、要素を上部ではなく左側に修正する必要があるというシナリオの場合はどうなるでしょうか?現時点では、動的パラメータを使用して各コンポーネントのインスタンスを非常に簡単に更新できます。 結果: このようにして、このカスタム ディレクティブは、いくつかの異なる使用例をサポートできるほど柔軟になりました。 を使用するとよいでしょう。 binding v-mydirective:[argument]="value"
では、argument
パラメータはコンポーネント インスタンス データに基づいて更新できます。これにより、カスタム ディレクティブをアプリケーションで柔軟に使用できるようになります。 <div id="baseexample">
<p>Scroll down the page</p>
<p v-pin="200">Stick me 200px from the top of the page</p>
</div>
Vue.directive('pin', {
bind: function (el, binding, vnode) {
el.style.position = 'fixed'
el.style.top = binding.value + 'px'
}
})
new Vue({
el: '#baseexample'
})
<div id="dynamicexample">
<h3>Scroll down inside this section ↓</h3>
<p v-pin:[direction]="200">I am pinned onto the page at 200px to the left.</p>
</div>
Vue.directive('pin', {
bind: function (el, binding, vnode) {
el.style.position = 'fixed'
var s = (binding.arg == 'left' ? 'left' : 'top')
el.style[s] = binding.value + 'px'
}
})
new Vue({
el: '#dynamicexample',
data: function () {
return {
direction: 'left'
}
}
})
#関数の省略形
多くの場合、 と
update は、他のフックに関係なく、同じ動作をトリガーします。たとえば、次のように記述します。
Vue.directive('color-swatch', function (el, binding) {
el.style.backgroundColor = binding.value
})
オブジェクト リテラル
命令で必要な場合複数の値を指定するには、JavaScript オブジェクト リテラルを渡すことができます。ディレクティブ関数はすべての正当な JavaScript 式を受け入れることに注意してください。
<div v-demo="{ color: 'white', text: 'hello!' }"></div>rree