站長資訊網
        最全最豐富的資訊網站

        vue dom是什么意思啊

        dom是一種文檔對象模型,同時也是用于html編程的接口,通過dom來操作頁面中的元素。DOM是HTML文檔的內存中對象表示,它提供了使用JavaScript與網頁交互的方式。DOM是節點的層次結構(或樹),其中document節點作為根。

        vue dom是什么意思啊

        本教程操作環境:windows7系統、vue3版,DELL G3電腦。

        什么是dom

        dom是一種文檔對象模型,同時也是用于html編程的接口,通過dom來操作頁面中的元素。當html頁面被實現加載的時候,瀏覽器會創建一個dom,給文檔提供了一種新的邏輯結構,并且可以改變內容和結構。

        DOM稱為文件對象模型(DocumentObjectModel,簡稱DOM),是W3C組織推薦的處理可擴展置標語言的標準編程接口

        DOM是HTML文檔的內存中對象表示,它提供了使用JavaScript與網頁交互的方式。DOM是節點的層次結構(或樹),其中document節點作為根。

        實際上DOM是以面向對象的方式來描述的文檔模型。DOM定義了表示和修改文檔所需的對象和這些對象的行為和屬性以及這些對象之間的關系。

        通過JavaScript,我們可以重構整個HTML文檔。比如添加、移除、改變或重排頁面上的項目。

        要改變頁面上的某個東西,JavaScript就需要獲得對HTML文檔中所有元素進行訪問的入口。這個入口,連同對HTML元素進行添加、移動、改變或移除的方法和屬性,都是通過文檔對象模型來獲得的。

        什么是虛擬DOM

        虛擬 DOM (Virtual DOM )這個概念相信大家都不陌生,從 React 到 Vue ,虛擬 DOM 為這兩個框架都帶來了跨平臺的能力(React-Native 和 Weex)

        實際上它只是一層對真實DOM的抽象,以JavaScript 對象 (VNode 節點) 作為基礎的樹,用對象的屬性來描述節點,最終可以通過一系列操作使這棵樹映射到真實環境上

        在Javascript對象中,虛擬DOM 表現為一個 Object對象。并且最少包含標簽名 (tag)、屬性 (attrs) 和子元素對象 (children) 三個屬性,不同框架對這三個屬性的名命可能會有差別

        創建虛擬DOM就是為了更好將虛擬的節點渲染到頁面視圖中,所以虛擬DOM對象的節點與真實DOM的屬性一一照應

        在vue中同樣使用到了虛擬DOM技術

        定義真實DOM

        <div id="app">     <p class="p">節點內容</p>     <h3>{{ foo }}</h3> </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("節點內容")]),_v(" "),_c('h3',[_v(_s(foo))])])}})
        登錄后復制

        通過VNode,vue可以對這顆抽象樹進行創建節點,刪除節點以及修改節點的操作, 經過diff算法得出一些需要修改的最小單位,再更新視圖,減少了dom操作,提高了性能。

        Vue獲取DOM的幾種方法

        雖然Vue實現了MVVM模型,將數據和表現進行了分離,我們只需要更新數據就能使DOM同步更新,但是某些情況下,還是需要獲取DOM元素進行操作(比如引入的某個庫要求傳入一個根dom元素作為根節點,或者寫一些自定義指令),本文主要介紹幾種在Vue中獲取DOM元素的方法。

        使用DOM API直接找元素

        <script> 	... 	mounted () { 		let elm = this.$el.querySelector('#id') 	} </script>
        登錄后復制

        這種方法足夠簡單直觀,Vue組件在patch階段結束時會把this.$el賦值為掛載的根dom元素,我們可以直接使用$elquerySelector, 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循環模板指令的情況,其循環元素和子元素上ref屬性對應的都是一個數組(就算動態生成ref,也是數組):

        <template> 	<div v-for="item in qlist" :key="item.id" ref="qitem"> 		<h3>{{ item.title  }}</h3> 		<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元素的數組 		let ps = this.$refs['pinitem'] // p元素是v-for的子元素,同樣是一個數組 		let contact1 = this.$refs['contact' + this.qlist[0].id] // 還是個數組 	} </script>
        登錄后復制

        關于這個的原因,可以從Vue關于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]; // 就算元素唯一,也會被處理成數組       } 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>
        登錄后復制

        關于自定義指令,在一些組件庫和事件上報等場景下非常有用。

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 国产精品永久久久久久久久久| 精品无码一区在线观看| 日产精品久久久久久久| 国产精品一香蕉国产线看观看| 99久久99久久精品免费看蜜桃 | 精品欧美激情在线看| 97热久久免费频精品99| 亚洲精品网站在线观看不卡无广告| 精品国产午夜福利在线观看| 午夜精品视频在线观看| 99热亚洲色精品国产88| 精品无码人妻一区二区三区品| 亚洲精品乱码久久久久久蜜桃不卡| 久久久精品视频免费观看| 国产综合成人色产三级高清在线精品发布 | 华人在线精品免费观看| 国产精品无码久久久久久| 色久综合网精品一区二区| 亚洲一区二区三区国产精品| 久久精品国产福利国产琪琪| 国内精品视频九九九九| 精品亚洲一区二区三区在线播放| 国产精品成人小电影在线观看| 亚洲永久永久永久永久永久精品| 国产精品一国产精品| 韩国精品欧美一区二区三区| 国产精品自拍一区| 欧美精品免费观看二区| 欧美精品一区二区精品久久 | 久久er热视频在这里精品| 精品福利资源在线| 99久久免费国产精精品| 国产精品无码无片在线观看| 国产精品无码久久综合| 国产成人精品精品欧美| 麻豆精品成人免费国产片| 精品九九人人做人人爱| 欧美黑人巨大精品| 国产成人精品免费视频大全| 精品人妻少妇一区二区三区不卡| 久久久精品久久久久久|