Vue のカスタム命令はグローバルまたはローカルに定義できます。Vue コンポーネントは HTML とコードの再利用ですが、Vue の命令は DOM の拡張された再利用です。Vue のカスタム命令の分析を詳しく見てみましょう。
1. Vue カスタム命令: Vue.directive(id,diction) を使用してグローバル カスタム命令を登録し、コンポーネントのディレクティブ オプションを使用してローカル カスタム命令を登録します。
2. Vue フック関数:
命令定義関数はいくつかのフック関数を提供します (オプション):
bind: 命令が初めて要素にバインドされたときに呼び出され、このフック関数を使用して定義します。 a バインド中に 1 回実行される初期化アクション。
inserted: バインドされた要素が親ノードに挿入されるときに呼び出されます (親ノードが存在する限り呼び出され、ドキュメント内に存在する必要はありません)。
update: バインド直後に初めて呼び出されるとき、取得されるパラメーターはバインディングの初期値であり、バインド値が変更されるかどうかに関係なく、バインドされた要素が配置されているテンプレートが更新されたときに後で呼び出されます。更新前後のバインディング値を比較することで、不要なテンプレートの更新を無視することができます(フック関数のパラメータの詳細については下記を参照)。
componentUpdated: バインドされた要素が配置されているテンプレートが更新サイクルを完了すると呼び出されます。
unbind: 命令が要素からバインドされていないときに呼び出され、1 回だけ呼び出されます。
3. Vueフック関数のパラメータ: (el, binding, vnode, oldVnode)
el: 命令によってバインドされた要素を使用して、DOMを直接操作できます。
binding: 次の属性を含むオブジェクト
name: v- プレフィックスを除く命令名;
value: 命令のバインディング値 (例: v-my-directive="1+1") value 値は 2 です。
oldValue: 命令によってバインドされた前の値。値が変更されるかどうかに関係なく使用できます。
式: バインドされた値の文字列形式。 v-my -directive="1+1"、expression の値は '1+1' です。
arg: 命令に渡されるパラメーター。例: v-my-directive:foo、arg の値は ' foo';
modifiers : 修飾子を含むオブジェクト。例: v-my-directive.a.b、修飾子の値は {'a':true,'b':true} です。
vnode: によって生成される仮想ノードVue コンパイル;
oldVnode: 最後の仮想ノードは、update フック関数とcomponentUpdated フック関数でのみ使用できます。
<p id="app" v-demo:foo.a.b="message"></p> Vue.directive('demo', { bind: function (el, binding, vnode) { console.log('bind'); 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: '#app', data: { message: 'hello!' } });
4. 関数の省略形: ほとんどの場合、バインド フックと更新フックで繰り返しアクションを実行する必要があり、他のフック関数については気にしたくありません。次のように記述できます:
Vue.directive('color-swatch', function (el, binding) { el.style.backgroundColor = binding.value })
5. オブジェクト リテラル: 命令に複数の値が必要な場合は、JavaScript オブジェクト リテラルを渡すことができます。ディレクティブ関数は、すべての正当な種類の JavaScript 式を受け入れることに注意してください。
<p v-demo="{ color: 'white', text: 'hello!' }"></p> Vue.directive('demo', function (el, binding) { console.log(binding.value.color) // => "white" console.log(binding.value.text) // => "hello!" })
分析例:
<p id="app"> <my-comp v-if="msg" :msg="msg"></my-comp> <button @click="update">更新</button> <button @click="uninstall">卸载</button> <button @click="install">安装</button> </p> <script type="text/javascript"> Vue.directive('hello', { bind: function (el){ console.log('bind'); }, inserted: function (el){ console.log('inserted'); }, update: function (el){ console.log('update'); }, componentUpdated: function (el){ console.log('componentUpdated'); }, unbind: function (el){ console.log('unbind'); } }); var myComp = { template: '<h1 v-hello>{{msg}}</h1>', props: { msg: String } } new Vue({ el: '#app', data: { msg: 'Hello' }, components: { myComp: myComp }, methods: { update: function (){ this.msg = 'Hi'; }, uninstall: function (){ this.msg = ''; }, install: function (){ this.msg = 'Hello'; } } }) </script>
a、ページのロード時: バインド挿入
b、コンポーネント更新: コンポーネント更新更新
c、コンポーネントのアンインストール: アンバインド
d、コンポーネントの再インストール: バインド挿入
違いに注意してください: bind および挿入: バインド時には親ノードは null、挿入時には親ノードが存在します。update およびcomponentUpdated: update はデータが更新される前、componentUpdated はデータが更新された後です。
6. 最後に、実際に開発した命令カプセル化実装
基本的な考え方
import store from '@/store' export default { inserted(el, binding, vnode) { const { value } = binding const roles = store.state.permission.pagePermission if (value && typeof value === 'string' && value.length > 0) { const hasPermission = roles.some(role => { return role.permission == value }) if (!hasPermission) { el.parentNode && el.parentNode.removeChild(el) } } else { throw new Error(`need roles! Like v-permission="'button'"`) } } }
API を外部に公開する
import permission from './permission' const install = function(Vue) { Vue.directive('permission', permission) } if (window.Vue) { window['permission'] = permission Vue.use(install) // eslint-disable-line } permission.install = install export default permission
関連する推奨事項:
方法Vue を使用してドロップダウン メニューにカスタム指示を入力します
以上がVueカスタム命令と命令定義関数(コード)の詳細分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。