溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

詳解在Vue中通過(guò)自定義指令獲取dom元素

發(fā)布時(shí)間:2020-10-23 01:42:06 來(lái)源:腳本之家 閱讀:289 作者:不帶汽的可樂(lè) 欄目:web開(kāi)發(fā)

vue.js 是數(shù)據(jù)綁定的框架,大部分情況下我們都不需要直接操作 DOM Element,但在某些時(shí)候,我們還是有獲取DOM Element的需求的;

 在 vue.js 中,獲取某個(gè)DOM Element常用的方法是將這個(gè)元素改成一個(gè)組件 (component),然后通過(guò) this.$el 去獲取,但是在一些很小的項(xiàng)目里,在一些沒(méi)有使用 webpack 等構(gòu)建工具的項(xiàng)目中,創(chuàng)建一個(gè)組件并不是那么值得,所以 vue 提供了另一種操作DOM元素的方式,就是自定義指令 (directive) ;

 自定義指令功能在DOM Element的生命周期內(nèi)提供了不同的鉤子函數(shù),并允許我們監(jiān)聽(tīng)指令綁定的數(shù)據(jù)的變化,但是它也是有缺點(diǎn)的,就是在指令的鉤子函數(shù)內(nèi)無(wú)法通過(guò) this 來(lái)訪問(wèn)當(dāng)前 vue 實(shí)例,也就無(wú)法進(jìn)一步進(jìn)行復(fù)雜的操作(雖然一般不需要什么復(fù)雜的操作),在 vue 的鉤子函數(shù) (lifecycle hook) 和方法 (method) 中也無(wú)法像 this.$el 那樣輕易的訪問(wèn)到自定義指令綁定的DOM元素;

 不過(guò)只要通過(guò)一點(diǎn)點(diǎn)變通的做法,就可以突破這個(gè)限制:

HTML代碼: 

    <div id="app">
      <span class='test' v-run="register('test1')"></span>
      <p class='test' v-run="register('test2')"></p>
    </div> 

JavaScript代碼:

const vm = new Vue({
  el:'#app',
  data : {
    elements : {}
  },
  directives : {
    run (el, binding) {
      if (typeof binding.value == 'function')
        binding.value(el);
    }
  },
  methods : {
    register (flag) {
      return (el)=>{
        this.elements[flag] = el;
      }
    }
  },
  beforeMount () {
    console.log(this.elements.test1); //=> undefined
  },
  mounted () {
    console.log(this.elements.test1); //=> the span DOM Element
    console.log(this.elements.test2); //=> the p DOM Element
  }
}) 

如代碼所示,建立一個(gè)名為 run 的自定義指令,運(yùn)行綁定的方法,并將當(dāng)前 DOM Element 作為參數(shù)傳入;
 同時(shí)建立一個(gè)名為 register 的方法,接收一個(gè) flag 參數(shù),并根據(jù)這個(gè)參數(shù)返回一個(gè)用于將傳入?yún)?shù)注冊(cè)到 this.elements 對(duì)象中的閉包函數(shù);

將寫(xiě)好的 run 指令和 register 方法搭配使用,就可以把想要的 DOM 注冊(cè)進(jìn)this.elements,并在 hook 或者 method 中十分方便的訪問(wèn);

 注意:自定義指令將會(huì)在DOM元素插入 Document 時(shí),也就是組件 mount 時(shí)首次執(zhí)行,所以在此之前,比如 beforeMount 鉤子中是無(wú)法使用的,這點(diǎn)也和 this.$el 一致,詳情可以查看官方文檔中的生命周期圖示;

其實(shí)也很好理解啦……在 mount 之前,根本就沒(méi)有這個(gè)實(shí)際的 DOM 元素,怎么可能訪問(wèn)的到……(:з)∠)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI