Vue.directive使用注意(小結(jié))
指令鉤子函數(shù)會被傳入以下參數(shù):
- el:指令所綁定的元素,可以用來直接操作 DOM 。
- binding:一個對象,包含以下屬性:vnode:Vue 編譯生成的虛擬節(jié)點。移步 VNode API 來了解更多詳情。
- ◦name:指令名,不包括 v- 前綴。
- ◦value:指令的綁定值,例如:v-my-directive="1 + 1" 中,綁定值為 2。
- ◦oldValue:指令綁定的前一個值,僅在 update 和 componentUpdated 鉤子中可用。無論值是否改變都可用。
- ◦expression:字符串形式的指令表達式。例如 v-my-directive="1 + 1" 中,表達式為 "1 + 1"。
- ◦arg:傳給指令的參數(shù),可選。例如 v-my-directive:foo 中,參數(shù)為 "foo"。
- ◦modifiers:一個包含修飾符的對象。例如:v-my-directive.foo.bar 中,修飾符對象為 { foo: true, bar: true }。
- oldVnode:上一個虛擬節(jié)點,僅在 update 和 componentUpdated 鉤子中可用。
具體事例
clickoutside.js
用途:clickoutside.js主要用于解決點解元素外的地方時執(zhí)行函數(shù) 主要應(yīng)用的常見有彈出層點擊遮罩層是隱藏窗口,或者一些彈出層點擊其他地方要消失的場景
v-clickoutside具體是怎么實現(xiàn)的
答:主要是通過在bind中定義函數(shù) 通過判斷是否包含元素,執(zhí)行binding.value函數(shù)
export default {
/*
@param el 指令所綁定的元素
@param binding {Object}
@param vnode vue編譯生成的虛擬節(jié)點
*/
bind (el, binding, vnode) {
const documentHandler = function(e) {
if(!vnode.context || el.contains(e.target)) {
return false;
}
if (binding.expression) {
binding.value(e)
}
}
document.addEventListener('click', documentHandler)
},
update (el, binding) {
},
unbind(el) {
document.removeEventListener('click', documentHandler);
}
}
Vue.directive使用注意
首先,Vue.directive要在實例初始化之前,不然會報錯,還有,定義的指令不支持駝峰式寫法,也會報下面同樣的錯,雖然在源碼中沒有找到在哪里統(tǒng)一處理大小寫,但是在有關(guān)directive的方法中捕捉到的指令命名統(tǒng)一變?yōu)樾?所以,還是用'-'或者'_'分割吧。
vue.js:491 [Vue warn]: Failed to resolve directive: xxx
然后,其定義方式有兩種,一種是Vue.directive('xxx', function(el, bind, vNode){}),其中el為dom,vNode為vue的虛擬dom,bind為一較復雜對象,詳情可見Vue-directive鉤子函數(shù)中的參數(shù)的參數(shù),還有一種,為
Vue.directive('my-directive', {
bind: function () {},
inserted: function () {},
update: function () {},
componentUpdated: function () {},
unbind: function () {}
})
參數(shù)代表的含義,參見鉤子函數(shù)描述
最后,要使用自定義的指令,只需在對用的元素中,加上'v-'的前綴形成類似于內(nèi)部指令'v-if','v-text'的形式。
// Vue.directive
Vue.directive('test_directive', function(el, bind, vNode){
el.style.color = bind.value;
});
var app = new Vue({
el: '#app',
data: {
num: 10,
color: 'red'
},
methods: {
add: function(){
this.num++;
}
}
});
當然,也可以將method中的方法加入,bind.value即為methods中的方法。
<div id="app">
<div v-test_directive="changeColor">{{num}}</div>
<button @click="add">增加</button>
</div>
<script type="text/javascript">
// Vue.directive
Vue.directive('test_directive', function(el, bind, vNode){
el.style.color = bind.value();
});
var app = new Vue({
el: '#app',
data: {
num: 10,
color: 'red'
},
methods: {
add: function(){
this.num++;
},
changeColor: function(){
return this.color;
}
}
});
這種形式,可以模仿'v-once',并進行一定的復雜邏輯,但是想要完全達到'v-once',可能需要考慮Vue-directive的鉤子函數(shù)各個周期。下面是固定num的值,使得add的方法無效。
<div id="app">
<div v-test_directive="changeColor">{{num}}</div>
<button @click="add">增加</button>
</div>
<script type="text/javascript">
// Vue.directive
Vue.directive('test_directive', function(el, bind, vNode){
el.style.color = bind.value();
});
var app = new Vue({
el: '#app',
data: {
num: 10,
color: 'red'
},
methods: {
add: function(){
this.num++;
},
changeColor: function(){
this.num = 20;
return this.color;
}
}
});
因為小生剛剛接觸vue,所以,希望前輩能多加指點。也希望大家多多支持腳本之家。
相關(guān)文章
Vue表單數(shù)據(jù)修改與刪除功能實現(xiàn)
本文通過實例代碼介紹了Vue表單數(shù)據(jù)修改與刪除功能實現(xiàn),結(jié)合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友跟隨小編一起看看吧2023-10-10
利用HBuilder打包前端開發(fā)webapp為apk的方法
下面小編就為大家?guī)硪黄肏Builder打包前端開發(fā)webapp為apk的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11
Vue axios 將傳遞的json數(shù)據(jù)轉(zhuǎn)為form data的例子
今天小編就為大家分享一篇Vue axios 將傳遞的json數(shù)據(jù)轉(zhuǎn)為form data的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10

