今天小編給大家分享一下Vue中如何獲取DOM元素的相關(guān)知識點,內(nèi)容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
襄城ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
dom是一種文檔對象模型,同時也是用于html編程的接口,通過dom來操作頁面中的元素。DOM是HTML文檔的內(nèi)存中對象表示,它提供了使用JavaScript與網(wǎng)頁交互的方式。DOM是節(jié)點的層次結(jié)構(gòu)(或樹),其中document節(jié)點作為根。
什么是dom
dom是一種文檔對象模型,同時也是用于html編程的接口,通過dom來操作頁面中的元素。當html頁面被實現(xiàn)加載的時候,瀏覽器會創(chuàng)建一個dom,給文檔提供了一種新的邏輯結(jié)構(gòu),并且可以改變內(nèi)容和結(jié)構(gòu)。
DOM稱為文件對象模型(DocumentObjectModel,簡稱DOM),是W3C組織推薦的處理可擴展置標語言的標準編程接口
DOM是HTML文檔的內(nèi)存中對象表示,它提供了使用JavaScript與網(wǎng)頁交互的方式。DOM是節(jié)點的層次結(jié)構(gòu)(或樹),其中document節(jié)點作為根。
實際上DOM是以面向?qū)ο蟮姆绞絹砻枋龅奈臋n模型。DOM定義了表示和修改文檔所需的對象和這些對象的行為和屬性以及這些對象之間的關(guān)系。
通過JavaScript,我們可以重構(gòu)整個HTML文檔。比如添加、移除、改變或重排頁面上的項目。
要改變頁面上的某個東西,JavaScript就需要獲得對HTML文檔中所有元素進行訪問的入口。這個入口,連同對HTML元素進行添加、移動、改變或移除的方法和屬性,都是通過文檔對象模型來獲得的。
什么是虛擬DOM
虛擬 DOM (Virtual DOM )這個概念相信大家都不陌生,從 React 到 Vue ,虛擬 DOM 為這兩個框架都帶來了跨平臺的能力(React-Native 和 Weex)
實際上它只是一層對真實DOM的抽象,以JavaScript 對象 (VNode 節(jié)點) 作為基礎(chǔ)的樹,用對象的屬性來描述節(jié)點,最終可以通過一系列操作使這棵樹映射到真實環(huán)境上
在Javascript對象中,虛擬DOM 表現(xiàn)為一個 Object對象。并且最少包含標簽名 (tag)、屬性 (attrs) 和子元素對象 (children) 三個屬性,不同框架對這三個屬性的名命可能會有差別
創(chuàng)建虛擬DOM就是為了更好將虛擬的節(jié)點渲染到頁面視圖中,所以虛擬DOM對象的節(jié)點與真實DOM的屬性一一照應
在vue中同樣使用到了虛擬DOM技術(shù)
定義真實DOM
<div id="app">
<p class="p">節(jié)點內(nèi)容</p>
<h4>{{ foo }}</h4>
</div>
實例化vue
const app = new Vue({
el:"#app",
data:{
foo:"foo"
}
})
觀察render的render,我們能得到虛擬DOM
(function anonymous(
) {
with(this){return _c('div',{attrs:{"id":"app"}},[_c('p',{staticClass:"p"},
[_v("節(jié)點內(nèi)容")]),_v(" "),_c('h4',[_v(_s(foo))])])}})
通過VNode,vue可以對這顆抽象樹進行創(chuàng)建節(jié)點,刪除節(jié)點以及修改節(jié)點的操作, 經(jīng)過diff算法得出一些需要修改的最小單位,再更新視圖,減少了dom操作,提高了性能。
Vue獲取DOM的幾種方法
雖然Vue實現(xiàn)了MVVM模型,將數(shù)據(jù)和表現(xiàn)進行了分離,我們只需要更新數(shù)據(jù)就能使DOM同步更新,但是某些情況下,還是需要獲取DOM元素進行操作(比如引入的某個庫要求傳入一個根dom元素作為根節(jié)點,或者寫一些自定義指令),本文主要介紹幾種在Vue中獲取DOM元素的方法。
使用DOM API直接找元素
<script>
...
mounted () {
let elm = this.$el.querySelector('#id')
}
</script>
這種方法足夠簡單直觀,Vue組件在patch階段結(jié)束時會把this.$el
賦值為掛載的根dom元素,我們可以直接使用$el
的querySelector, querySelectorAll
等方法獲取匹配的元素。
refs
<template>
<div ref="bar">{{ foo }}</div>
<MyAvatar ref="avatar" />
...
</template>
<script>
...
mounted () {
let foo = this.$refs['bar'] // 一個dom元素
let avatar = this.$refs['avatar'] // 一個組件實例對象
}
</script>
使用組件實例的$refs
即可拿到組件上ref
屬性對應的元素。
如果ref屬性加在一個組件上,那么拿到的是這個組件的實例,否則拿到的就是dom元素了。
值得注意的是包含v-for
循環(huán)模板指令的情況,其循環(huán)元素和子元素上ref
屬性對應的都是一個數(shù)組(就算動態(tài)生成ref,也是數(shù)組):
<template>
<div v-for="item in qlist" :key="item.id" ref="qitem">
<h4>{{ item.title }}</h4>
<p ref="pinitem">{{ item.desc }}</p>
<p :ref="'contact'+item.id">{{ item.contact }}</p>
</div>
...
</template>
<script>
...
data () {
return {
qlist: [
{ id: 10032, title: 'abc', desc: 'aadfdcc', contact: 123 },
{ id: 11031, title: 'def', desc: '--*--', contact: 856 },
{ id: 20332, title: 'ghi', desc: '?/>,<{]', contact: 900 }
]
}
},
mounted () {
let foo = this.$refs['qitem'] // 一個包含dom元素的數(shù)組
let ps = this.$refs['pinitem'] // p元素是v-for的子元素,同樣是一個數(shù)組
let contact1 = this.$refs['contact' + this.qlist[0].id] // 還是個數(shù)組
}
</script>
關(guān)于這個的原因,可以從Vue關(guān)于ref處理的部分代碼得到:
function registerRef (vnode, isRemoval) {
var key = vnode.data.ref;
if (!isDef(key)) { return }
var vm = vnode.context;
// vnode如果有componentInstance表明是一個組件vnode,它的componentInstance屬性是其真實的根元素vm
// vnode如果沒有componentInstance則不是組件vnode,是實際元素vnode,直接取其根元素
var ref = vnode.componentInstance || vnode.elm;
var refs = vm.$refs;
if (isRemoval) {
...
} else {
// refInFor是模板編譯階段生成的,它是一個布爾值,為true表明此vnode在v-for中
if (vnode.data.refInFor) {
if (!Array.isArray(refs[key])) {
refs[key] = [ref]; // 就算元素唯一,也會被處理成數(shù)組
} else if (refs[key].indexOf(ref) < 0) {
// $flow-disable-line
refs[key].push(ref);
}
} else {
refs[key] = ref;
}
}
}
使用自定義指令
Vue提供了自定義指令,官方文檔給出了如下的使用方法,其中el
就是dom元素的引用
Vue.directive('focus', {
// 當被綁定的元素插入到 DOM 中時……
inserted: function (el) {
// 聚焦元素
el.focus()
}
})
// 在模板中
<template>
<input v-model="name" v-focus />
</template>
關(guān)于自定義指令,在一些組件庫和事件上報等場景下非常有用。
以上就是“Vue中如何獲取DOM元素”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)頁名稱:Vue中如何獲取DOM元素
當前路徑:http://jinyejixie.com/article40/jdogeo.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導航、營銷型網(wǎng)站建設、關(guān)鍵詞優(yōu)化、品牌網(wǎng)站建設、移動網(wǎng)站建設、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)