国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

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

2019-11-19 17:19:08
字體:
來源:轉載
供稿:網友

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

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

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

 不過只要通過一點點變通的做法,就可以突破這個限制:

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  }}) 

如代碼所示,建立一個名為 run 的自定義指令,運行綁定的方法,并將當前 DOM Element 作為參數傳入;
 同時建立一個名為 register 的方法,接收一個 flag 參數,并根據這個參數返回一個用于將傳入參數注冊到 this.elements 對象中的閉包函數;

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

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

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 介休市| 定州市| 治多县| 峡江县| 新津县| 濮阳市| 福鼎市| 镇安县| 铁力市| 高淳县| 吉水县| 敖汉旗| 黔东| 曲水县| 丰都县| 遂溪县| 沁源县| 昂仁县| 龙门县| 和平区| 远安县| 积石山| 广丰县| 永胜县| 区。| 定襄县| 五常市| 琼海市| 西乌珠穆沁旗| 中西区| 德阳市| 永丰县| 饶河县| 北海市| 理塘县| 辛集市| 临沂市| 盘山县| 乐昌市| 班玛县| 方正县|