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

首頁 > 開發(fā) > JS > 正文

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

2024-05-06 16:35:34
字體:
供稿:網(wǎng)友

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

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

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

 不過只要通過一點(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ù)注冊到 this.elements 對(duì)象中的閉包函數(shù);

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

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

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

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請移步到JavaScript/Ajax教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 蒙自县| 荃湾区| 茶陵县| 永丰县| 东乌珠穆沁旗| 芦山县| 广东省| 台中市| 西华县| 汽车| 富裕县| 新邵县| 靖远县| 天等县| 定日县| 镇坪县| 保亭| 南木林县| 永寿县| 抚宁县| 泾川县| 千阳县| 鄂尔多斯市| 濮阳市| 乐东| 右玉县| 新余市| 治多县| 富锦市| 伊川县| 上林县| 垫江县| 肇庆市| 宣汉县| 四会市| 都安| 来安县| 都匀市| 噶尔县| 大埔县| 临高县|