詳解在Vue中通過自定義指令獲取dom元素
vue.js 是數(shù)據(jù)綁定的框架,大部分情況下我們都不需要直接操作 DOM Element,但在某些時候,我們還是有獲取DOM Element的需求的;
在 vue.js 中,獲取某個DOM Element常用的方法是將這個元素改成一個組件 (component),然后通過 this.$el 去獲取,但是在一些很小的項目里,在一些沒有使用 webpack 等構(gòu)建工具的項目中,創(chuàng)建一個組件并不是那么值得,所以 vue 提供了另一種操作DOM元素的方式,就是自定義指令 (directive) ;
自定義指令功能在DOM Element的生命周期內(nèi)提供了不同的鉤子函數(shù),并允許我們監(jiān)聽指令綁定的數(shù)據(jù)的變化,但是它也是有缺點的,就是在指令的鉤子函數(shù)內(nèi)無法通過 this 來訪問當(dāng)前 vue 實例,也就無法進一步進行復(fù)雜的操作(雖然一般不需要什么復(fù)雜的操作),在 vue 的鉤子函數(shù) (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 的自定義指令,運行綁定的方法,并將當(dāng)前 DOM Element 作為參數(shù)傳入;
同時建立一個名為 register 的方法,接收一個 flag 參數(shù),并根據(jù)這個參數(shù)返回一個用于將傳入?yún)?shù)注冊到 this.elements 對象中的閉包函數(shù);
將寫好的 run 指令和 register 方法搭配使用,就可以把想要的 DOM 注冊進this.elements,并在 hook 或者 method 中十分方便的訪問;
注意:自定義指令將會在DOM元素插入 Document 時,也就是組件 mount 時首次執(zhí)行,所以在此之前,比如 beforeMount 鉤子中是無法使用的,這點也和 this.$el 一致,詳情可以查看官方文檔中的生命周期圖示;
其實也很好理解啦……在 mount 之前,根本就沒有這個實際的 DOM 元素,怎么可能訪問的到……(:з)∠)
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Pure admin-Router標(biāo)簽頁配置與頁面持久化實現(xiàn)方法詳解
這篇文章主要介紹了Pure admin-Router標(biāo)簽頁配置與頁面持久化實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01
vue自定義標(biāo)簽和單頁面多路由的實現(xiàn)代碼
這篇文章主要介紹了vue自定義標(biāo)簽和單頁面多路由的實現(xiàn)代碼,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05
Vue中router-link如何添加mouseover提示
這篇文章主要介紹了Vue中router-link如何添加mouseover提示,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11
element-plus的自動導(dǎo)入和按需導(dǎo)入方式詳解
之前使用 ElementPlus 做項目的時候,由于不會使用按需引入耽誤了不少時間,這篇文章主要給大家介紹了關(guān)于element-plus自動導(dǎo)入和按需導(dǎo)入的相關(guān)資料,需要的朋友可以參考下2022-08-08
vue3中項目優(yōu)化方法詳解(Web?Worker的使用)
最近在做vue3的項目中,遇到了計算量龐大導(dǎo)致頁面響應(yīng)緩慢的問題,所以下面這篇文章主要給大家介紹了關(guān)于vue3中項目優(yōu)化方法的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-07-07
如何使用electron將vue項目打包成.exe文件(保姆級教程)
本文給大家介紹如何使用electron將vue項目打包成.exe文件,大家要注意一下vue2項目,使用的vue-element-admin框架,用electron打包成.exe文件,本文結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友參考下吧2024-03-03

