7.自定義指令

1.Vue有豐富的內(nèi)置指令,在需要一些特殊功能時皿渗,我們?nèi)韵M麑OM進行底層的操作,這時就要用到自定義指令没卸。
2.自定義指令的注冊方法和組件很像羹奉,也分全局注冊和局部注冊,比如注冊一個v-focus的指令约计,用于在<input>诀拭、<textarea>元素初始化時自動獲得焦點,兩種寫法分別是:

    //全局注冊
    Vue.directive('focus',{
        //指令選項
    })
    //局部注冊
    var app = new Vue({
        el:'#app',
        directives:{
            focus:{
                //指令選項
            }
        }
    })

寫法與組件基本類似煤蚌,只是方法名由component改為了directive耕挨。
上例只是注冊了自定義指令v-focus,還沒有實現(xiàn)具體功能尉桩。
3.自定義指令的各個選項都是由幾個鉤子函數(shù)組成的筒占,每個都是可選的。

  • bind:只調(diào)用一次蜘犁,指令第一次綁定到元素時調(diào)用翰苫,用這個鉤子函數(shù)可以定義一個綁定時執(zhí)行一次的初始化動作。
  • inserted:被綁定元素插入父節(jié)點時調(diào)用(父節(jié)點存在即可調(diào)用这橙,不必存在于document中)
  • update:被綁定元素所在的模板更新時調(diào)用奏窑,而不論綁定值是否變化。通過比較更新前后的綁定值屈扎,可以忽略不必要的模板更新埃唯。
  • componentUpdated:被綁定元素所在模板完成一次更新周期時調(diào)用。
  • unbind:只調(diào)用一次鹰晨,指令與元素解綁時調(diào)用墨叛。

4.可以根據(jù)需求在不同的鉤子函數(shù)內(nèi)完成邏輯代碼止毕,例如上面的v-focus,我們希望在元素插入父節(jié)點時就調(diào)用漠趁,那用到的最好是inserted扁凛。示例:

<div id="app">
    <input type="text" v-focus>
</div>
<script>
    //全局注冊
    Vue.directive('focus',{
        //指令選項
        inserted:function(el){
            //聚焦元素
            el.focus();
        }
    })
    //局部注冊
    var app = new Vue({
        el:'#app'
    })
</script>

可以看到,打開這個頁面棚潦,input輸入框就自動獲得了焦點令漂,成為可輸入狀態(tài)。
5.每個鉤子函數(shù)都有幾個參數(shù)可用丸边,比如上面我們用到了el叠必。它們的含義如下:

  • el 指令所綁定的元素,可以用來直接操作DOM妹窖。
  • binding 一個對象纬朝,包含以下屬性:

    name :指令名,不包括 v-前綴骄呼。
    value :指令的綁定值共苛,例如 v-my-directive="1+1" ,value的值是2蜓萄。
    oldValue :指令綁定的前一個值隅茎,僅在update 和 componentUpdated 鉤子中可用。無論值是否改變都可用嫉沽。
    expression :綁定至的字符串形式辟犀。例如 v-my-directive="1+1",expredsion的值是 "1+1"绸硕。
    arg:傳給指令的參數(shù)堂竟。例如 v-my-directive:foo,arg的值是foo玻佩。
    modifiers :一個包含修飾符的對象出嘹。例如 v-my-directive.foo.bar,修飾符對象modifiers的值是{ foo:true , bar: true}咬崔。
    vnode :Vue編譯生成的虛擬節(jié)點税稼,后續(xù)介紹。
    oldVnode :上一個虛擬節(jié)點僅在update 和 componentUpdate鉤子中可用垮斯。
    下面是結(jié)合了以上參數(shù)的一個示例:

<div id="app">
    <div v-test:msg.a.b="message"></div>
</div>
<script>
    Vue.directive('test',{
        bind:function(el,binding,vnode){
            var keys = [];
            for(var i in vnode){
                keys.push(i)
            }
            el.innerHTML = 
                'name:' + binding.name + '<br>' +
                'value:' + binding.value + '<br>' +
                'expression:' + binding.expression + '<br>' + 
                'argument:' + binding.arg + '<br>' +
                'modifiers:' + JSON.stringify(binding.modifiers) + '<br>' +
                'vnode keys:' + keys.join(',')
        }
    });
    //局部注冊
    var app = new Vue({
        el:'#app',
        data:{
            message:'some text'
        }
    })
</script>

在大多數(shù)使用場景郎仆,我們會在 bind 鉤子里綁定一些事件,比如在document上用 addEventListener綁定甚脉,在unbind里用 removeEventListener 解綁,比較典型的示例就是讓這個元素隨著鼠標拖拽铆农。如果需要多個值牺氨,自定義指令可以傳入一個JavaScript對象字面量狡耻,只要是合法類型的JavaScript表達式都是可以的。示例:

<div id="app">
    <div v-test="{msg:'hello',name:'Aresn'}"></div>
</div>
<script>
    Vue.directive('test',{
        bind:function(el,binding,vnode){
            console.log(binding.value.msg)
            console.log(binding.value.name)
        }
    });
    //局部注冊
    var app = new Vue({
        el:'#app'
    })
</script>

Vue2.x移除了大量Vue 1.x自定義指令的配置猴凹。
在使用自定義指令時夷狰,應(yīng)該充分理解業(yè)務(wù)需求,因為很多時候你需要的可能并不是自定義指令郊霎,而是組件沼头。后續(xù)的實戰(zhàn)示例可以進一步了解自定義指令的使用場景和用法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末书劝,一起剝皮案震驚了整個濱河市进倍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌购对,老刑警劉巖猾昆,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異骡苞,居然都是意外死亡垂蜗,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門解幽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贴见,“玉大人,你說我怎么就攤上這事躲株∑浚” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵徘溢,是天一觀的道長吞琐。 經(jīng)常有香客問我,道長然爆,這世上最難降的妖魔是什么站粟? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮曾雕,結(jié)果婚禮上奴烙,老公的妹妹穿的比我還像新娘。我一直安慰自己剖张,他們只是感情好切诀,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著搔弄,像睡著了一般幅虑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上顾犹,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天倒庵,我揣著相機與錄音褒墨,去河邊找鬼。 笑死擎宝,一個胖子當著我的面吹牛郁妈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绍申,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼噩咪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了极阅?” 一聲冷哼從身側(cè)響起胃碾,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涂屁,沒想到半個月后书在,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡拆又,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年儒旬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帖族。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡栈源,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤西乖,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布腾窝,位于F島的核電站礁芦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一迄埃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧兑障,春花似錦侄非、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至福澡,卻和暖如春叠赦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背革砸。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工除秀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留窥翩,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓鳞仙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親笔时。 傳聞我的和親對象是個殘疾皇子棍好,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359