首頁 web前端 前端問答 vue dom是什麼意思啊

vue dom是什麼意思啊

Dec 20, 2022 pm 08:41 PM
vue dom 虛擬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(&#39;div&#39;,{attrs:{"id":"app"}},[_c(&#39;p&#39;,{staticClass:"p"},
					  [_v("节点内容")]),_v(" "),_c(&#39;h3&#39;,[_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(&#39;#id&#39;)
	}
</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[&#39;bar&#39;] // 一个dom元素
		let avatar = this.$refs[&#39;avatar&#39;] // 一个组件实例对象
	}
</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="&#39;contact&#39;+item.id">{{ item.contact }}</p>
	</div>
	...
</template>
<script>
	...
	data () {
		return {
			qlist: [
				{ id: 10032, title: &#39;abc&#39;, desc: &#39;aadfdcc&#39;, contact: 123 },
				{ id: 11031, title: &#39;def&#39;, desc: &#39;--*--&#39;, contact: 856 },
				{ id: 20332, title: &#39;ghi&#39;, desc: &#39;?/>,<{]&#39;, contact: 900 }
			]
		}
	},
	mounted () {
		let foo = this.$refs[&#39;qitem&#39;] // 一个包含dom元素的数组
		let ps = this.$refs[&#39;pinitem&#39;] // p元素是v-for的子元素,同样是一个数组
		let contact1 = this.$refs[&#39;contact&#39; + 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(&#39;focus&#39;, {
  // 当被绑定的元素插入到 DOM 中时……
  inserted: function (el) {
    // 聚焦元素
    el.focus()
  }
})

// 在模板中
<template>
	<input v-model="name" v-focus />
</template>
登入後複製

關於自訂指令,在一些元件庫和事件上報等場景下非常有用。

【相關推薦:vuejs影片教學web前端開發

以上是vue dom是什麼意思啊的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

vue怎麼給按鈕添加函數 vue怎麼給按鈕添加函數 Apr 08, 2025 am 08:51 AM

可以通過以下步驟為 Vue 按鈕添加函數:將 HTML 模板中的按鈕綁定到一個方法。在 Vue 實例中定義該方法並編寫函數邏輯。

vue.js怎麼引用js文件 vue.js怎麼引用js文件 Apr 07, 2025 pm 11:27 PM

在 Vue.js 中引用 JS 文件的方法有三種:直接使用 &lt;script&gt; 標籤指定路徑;利用 mounted() 生命週期鉤子動態導入;通過 Vuex 狀態管理庫進行導入。

vue中怎麼用bootstrap vue中怎麼用bootstrap Apr 07, 2025 pm 11:33 PM

在 Vue.js 中使用 Bootstrap 分為五個步驟:安裝 Bootstrap。在 main.js 中導入 Bootstrap。直接在模板中使用 Bootstrap 組件。可選:自定義樣式。可選:使用插件。

vue中的watch怎麼用 vue中的watch怎麼用 Apr 07, 2025 pm 11:36 PM

Vue.js 中的 watch 選項允許開發者監聽特定數據的變化。當數據發生變化時,watch 會觸發一個回調函數,用於執行更新視圖或其他任務。其配置選項包括 immediate,用於指定是否立即執行回調,以及 deep,用於指定是否遞歸監聽對像或數組的更改。

vue返回上一頁的方法 vue返回上一頁的方法 Apr 07, 2025 pm 11:30 PM

Vue.js 返回上一頁有四種方法:$router.go(-1)$router.back()使用 &lt;router-link to=&quot;/&quot;&gt; 組件window.history.back(),方法選擇取決於場景。

Vue 實現跑馬燈/文字滾動效果 Vue 實現跑馬燈/文字滾動效果 Apr 07, 2025 pm 10:51 PM

在 Vue 中實現跑馬燈/文字滾動效果,可以使用 CSS 動畫或第三方庫。本文介紹了使用 CSS 動畫的方法:創建滾動文本,用 &lt;div&gt; 包裹文本。定義 CSS 動畫,設置 overflow: hidden、width 和 animation。定義關鍵幀,設置動畫開始和結束時的 transform: translateX()。調整動畫屬性,如持續時間、滾動速度和方向。

怎樣查詢vue的版本 怎樣查詢vue的版本 Apr 07, 2025 pm 11:24 PM

可以通過以下方法查詢 Vue 版本:使用 Vue Devtools 在瀏覽器的控制台中查看“Vue”選項卡。使用 npm 運行“npm list -g vue”命令。在 package.json 文件的“dependencies”對像中查找 Vue 項。對於 Vue CLI 項目,運行“vue --version”命令。檢查 HTML 文件中引用 Vue 文件的 &lt;script&gt; 標籤中的版本信息。

vue遍歷怎麼用 vue遍歷怎麼用 Apr 07, 2025 pm 11:48 PM

Vue.js 遍歷數組和對像有三種常見方法:v-for 指令用於遍歷每個元素並渲染模板;v-bind 指令可與 v-for 一起使用,為每個元素動態設置屬性值;.map 方法可將數組元素轉換為新數組。

See all articles