vue自定義指令

1.Vue自定義指令

除了核心功能默認(rèn)內(nèi)置的指令 (v-modelv-show等)征绎,Vue允許我們注冊自定義指令用于元素上舔哪。

當(dāng)我們需要對普通 DOM 元素進(jìn)行底層操作時(shí)稚铣,就可以用到用到自定義指令议纯。

2. 鉤子函數(shù):

配置對象中包含一下幾個(gè)鉤子函數(shù)(均為可選值):

鉤子函數(shù) 描述

  • bind: 只調(diào)用一次,指令第一次綁定到元素時(shí)調(diào)用存谎。在這里可以進(jìn)行一次性的初始化設(shè)置银萍。
  • inserted(常用): 被綁定元素插入父節(jié)點(diǎn)時(shí)調(diào)用 (僅保證父節(jié)點(diǎn)存在变勇,但不一定已被插入文檔中)。
  • update: 所在組件的 VNode 更新時(shí)調(diào)用贴唇,但是可能發(fā)生在其子 VNode 更新之前搀绣。指令的值可能發(fā)生了改變,也可能沒有滤蝠。但是你可以通過比較更新前后的值來忽略不必要的模板更新 (詳細(xì)的鉤子函數(shù)參數(shù)見下)豌熄。
  • componentUpdated: 指令所在組件的 VNode 及其子 VNode 全部更新后調(diào)用。
  • unbind: 只調(diào)用一次物咳,指令與元素解綁時(shí)調(diào)用锣险。

3. 鉤子函數(shù)參數(shù):

指令鉤子函數(shù)會(huì)被傳入以下參數(shù):

  • el:指令所綁定的元素,可以用來直接操作 DOM览闰。

  • binding:一個(gè)對象芯肤,包含以下 property:

    • name:指令名,不包括 v- 前綴压鉴。

    • value:指令的綁定值崖咨,例如:v-my-directive="1 + 1" 中,綁定值為 2油吭。

    • oldValue:指令綁定的前一個(gè)值击蹲,僅在 update 和 componentUpdated 鉤子中可用。無論值是否改變都可用婉宰。

    • expression:字符串形式的指令表達(dá)式歌豺。例如 v-my-

      directive="1 + 1" 中,表達(dá)式為 "1 + 1"心包。

    • arg:傳給指令的參數(shù)类咧,可選。例如 v-my-directive:foo 中蟹腾,參數(shù)為 "foo"痕惋。

    • modifiers:一個(gè)包含修飾符的對象。例如:v-my-directive.foo.bar 中娃殖,修飾符對象為 { foo: true, bar: true }值戳。

  • vnode:Vue 編譯生成的虛擬節(jié)點(diǎn)(這個(gè)參數(shù)本人沒有用過,有用過的大佬請指點(diǎn)一下)

  • oldVnode:上一個(gè)虛擬節(jié)點(diǎn)炉爆,僅在 update 和componentUpdated 鉤子中可用述寡。

4.全局注冊

全局注冊自定義指令是將我們的自定義指令掛載到vue實(shí)例上的柿隙,在項(xiàng)目中都可以使用。

  • 全局指令注冊方法為:Vue.directive(dName, options) 傳入兩個(gè)參數(shù)
  • 分別是 指令名配置對象
  • 創(chuàng)建完之后鲫凶,我們就可以使用 v-指令名 的方式加在元素上,以使自定義指令生效

4.1使 input 進(jìn)入獲取焦點(diǎn)

import Vue from 'vue'
// 注冊一個(gè)全局自定義指令 `v-focus`
Vue.directive('focus', {
  // 當(dāng)被綁定的元素插入到 DOM 中時(shí)……
  inserted: function (el) {
    // 聚焦元素
    el.focus()
  }
})

  • 使用
<input v-focus />

5.局部注冊

用法與 全局 注冊是一樣的衩辟, 只是寫法稍有不同

進(jìn)行局部注冊時(shí)螟炫, 我們的組件中可以接收一個(gè)directives選項(xiàng)

其中艺晴,鍵為指令名 值為配置對象
  • 注冊
export default{
  data(){
    return { ... }
  },
  directives:{
        focus:{
        inserted: function (el) {
          //element-ui中 el-input外層是div, 里面包裹的才是input, 因此用在 el-input上的話昼钻,要讓el-input里的子元素聚焦
          //增加判斷可以使我們的v-focus通用性更強(qiáng)
          el.tagName == 'INPUT' ? el.focus() : el.children[0].focus
        }
      }
  }
}

  • 使用
<input v-focus></input>

6.項(xiàng)目用到的自定義指令

6.1 防抖函數(shù):

點(diǎn)擊按鈕過快可能多次請求接口,用自定義指令做全局的函數(shù)防抖

  • 在main.js中 全局注冊一個(gè)自定義指令:
/**防抖函數(shù)
 * @el :指令所綁定的元素封寞,可以用來直接操作 DOM然评。
 * @binding :綁定的事件或者值
 */
Vue.directive('debounce', {
  inserted(el, binding) {
    let timer = null
    el.addEventListener('click', () => {
      if (timer) {
        clearTimeout(timer)
      }
      timer = setTimeout(() => {
        binding.value();
        timer = null;
      }, 500)
    })
  }
})
  • 使用
<button v-debounce="send">發(fā)送</button>

6.2節(jié)流函數(shù)

觸發(fā)高頻事件后,n秒內(nèi)函數(shù)函數(shù)只會(huì)執(zhí)行一次狈究。

應(yīng)用場景: search搜索聯(lián)想碗淌,用戶在不斷輸入值時(shí)

  • 在main.js中 全局注冊一個(gè)自定義指令
/**節(jié)流函數(shù)
 * @el :指令所綁定的元素,可以用來直接操作 DOM抖锥。
 * @binding :綁定的事件或者值
 */
Vue.directive('throttle', {
  inserted(el, binding) {
    let timer = null
    el.addEventListener('change', () => {
      if (!timer) {
        timer = setTimeout(() => {
          clearTimeout(timer)
          binding.value();
          timer = null;
        }, 100)
      }
    })

  }
})
  • 使用
<input v-throttle="changeSearch" />
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末亿眠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子磅废,更是在濱河造成了極大的恐慌纳像,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拯勉,死亡現(xiàn)場離奇詭異竟趾,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)宫峦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門岔帽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人斗遏,你說我怎么就攤上這事山卦。” “怎么了诵次?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵账蓉,是天一觀的道長。 經(jīng)常有香客問我逾一,道長铸本,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任遵堵,我火速辦了婚禮箱玷,結(jié)果婚禮上怨规,老公的妹妹穿的比我還像新娘。我一直安慰自己锡足,他們只是感情好波丰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著舶得,像睡著了一般掰烟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沐批,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天纫骑,我揣著相機(jī)與錄音,去河邊找鬼九孩。 笑死先馆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的躺彬。 我是一名探鬼主播煤墙,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼顾患!你這毒婦竟也來了番捂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤江解,失蹤者是張志新(化名)和其女友劉穎设预,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體犁河,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鳖枕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了桨螺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宾符。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖灭翔,靈堂內(nèi)的尸體忽然破棺而出魏烫,到底是詐尸還是另有隱情,我是刑警寧澤肝箱,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布哄褒,位于F島的核電站,受9級(jí)特大地震影響煌张,放射性物質(zhì)發(fā)生泄漏呐赡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一骏融、第九天 我趴在偏房一處隱蔽的房頂上張望链嘀。 院中可真熱鬧萌狂,春花似錦、人聲如沸怀泊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽包个。三九已至刷允,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碧囊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來泰國打工纤怒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留糯而,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓泊窘,卻偏偏與公主長得像熄驼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子烘豹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容