国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

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

vue dom是什么意思啊

Dec 20, 2022 pm 08:41 PM
vue dom 虛擬dom

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

vue dom是什么意思啊

本教程操作環(huán)境:windows7系統(tǒng)、vue3版,DELL G3電腦。

什么是dom

dom是一種文檔對象模型,同時(shí)也是用于html編程的接口,通過dom來操作頁面中的元素。當(dāng)html頁面被實(shí)現(xiàn)加載的時(shí)候,瀏覽器會(huì)創(chuàng)建一個(gè)dom,給文檔提供了一種新的邏輯結(jié)構(gòu),并且可以改變內(nèi)容和結(jié)構(gòu)。

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

DOM是HTML文檔的內(nèi)存中對象表示,它提供了使用JavaScript與網(wǎng)頁交互的方式。DOM是節(jié)點(diǎn)的層次結(jié)構(gòu)(或樹),其中document節(jié)點(diǎn)作為根。

實(shí)際上DOM是以面向?qū)ο蟮姆绞絹砻枋龅奈臋n模型。DOM定義了表示和修改文檔所需的對象和這些對象的行為和屬性以及這些對象之間的關(guān)系。

通過JavaScript,我們可以重構(gòu)整個(gè)HTML文檔。比如添加、移除、改變或重排頁面上的項(xiàng)目。

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

什么是虛擬DOM

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

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

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

創(chuàng)建虛擬DOM就是為了更好將虛擬的節(jié)點(diǎn)渲染到頁面視圖中,所以虛擬DOM對象的節(jié)點(diǎn)與真實(shí)DOM的屬性一一照應(yīng)

在vue中同樣使用到了虛擬DOM技術(shù)

定義真實(shí)DOM

<div id="app">
    <p class="p">節(jié)點(diǎn)內(nèi)容</p>
    <h3>{{ foo }}</h3>
</div>

實(shí)例化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("節(jié)點(diǎn)內(nèi)容")]),_v(" "),_c(&#39;h3&#39;,[_v(_s(foo))])])}})

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

Vue獲取DOM的幾種方法

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

使用DOM API直接找元素

<script>
	...
	mounted () {
		let elm = this.$el.querySelector(&#39;#id&#39;)
	}
</script>

這種方法足夠簡單直觀,Vue組件在patch階段結(jié)束時(shí)會(huì)把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;] // 一個(gè)dom元素
		let avatar = this.$refs[&#39;avatar&#39;] // 一個(gè)組件實(shí)例對象
	}
</script>

使用組件實(shí)例的$refs即可拿到組件上ref屬性對應(yīng)的元素。
如果ref屬性加在一個(gè)組件上,那么拿到的是這個(gè)組件的實(shí)例,否則拿到的就是dom元素了。

值得注意的是包含v-for循環(huán)模板指令的情況,其循環(huán)元素和子元素上ref屬性對應(yīng)的都是一個(gè)數(shù)組(就算動(dòng)態(tài)生成ref,也是數(shù)組):

<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;] // 一個(gè)包含dom元素的數(shù)組
		let ps = this.$refs[&#39;pinitem&#39;] // p元素是v-for的子元素,同樣是一個(gè)數(shù)組
		let contact1 = this.$refs[&#39;contact&#39; + this.qlist[0].id] // 還是個(gè)數(shù)組
	}
</script>

關(guān)于這個(gè)的原因,可以從Vue關(guān)于ref處理的部分代碼得到:

function registerRef (vnode, isRemoval) {
  var key = vnode.data.ref;
  if (!isDef(key)) { return }

  var vm = vnode.context;
  // vnode如果有componentInstance表明是一個(gè)組件vnode,它的componentInstance屬性是其真實(shí)的根元素vm
  // vnode如果沒有componentInstance則不是組件vnode,是實(shí)際元素vnode,直接取其根元素
  var ref = vnode.componentInstance || vnode.elm;
  var refs = vm.$refs;
  if (isRemoval) {
    ...
  } else {
  	// refInFor是模板編譯階段生成的,它是一個(gè)布爾值,為true表明此vnode在v-for中
    if (vnode.data.refInFor) {
      if (!Array.isArray(refs[key])) {
        refs[key] = [ref]; // 就算元素唯一,也會(huì)被處理成數(shù)組
      } 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;, {
  // 當(dāng)被綁定的元素插入到 DOM 中時(shí)……
  inserted: function (el) {
    // 聚焦元素
    el.focus()
  }
})

// 在模板中
<template>
	<input v-model="name" v-focus />
</template>

關(guān)于自定義指令,在一些組件庫和事件上報(bào)等場景下非常有用。

【相關(guān)推薦:vuejs視頻教程web前端開發(fā)

以上是vue dom是什么意思啊的詳細(xì)內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

vue怎么給按鈕添加函數(shù) vue怎么給按鈕添加函數(shù) Apr 08, 2025 am 08:51 AM

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

React與Vue:Netflix使用哪個(gè)框架? React與Vue:Netflix使用哪個(gè)框架? Apr 14, 2025 am 12:19 AM

NetflixusesAcustomFrameworkcalled“ Gibbon” BuiltonReact,notReactorVueDirectly.1)TeamExperience:selectBasedAsedonFamiliarity.2)ProjectComplexity:vueforsimplerprojects,vueforsimplerprojects,reactforforforecomplexones.3)cocatizationNeedsneeds:reactofficatizationneedneeds:reactofferizationneedneedneedneeds:reactoffersizatization needeffersefersmoreflexiblesimore.4)ecosyaka

Netflix的前端:React(或VUE)的示例和應(yīng)用 Netflix的前端:React(或VUE)的示例和應(yīng)用 Apr 16, 2025 am 12:08 AM

Netflix使用React作為其前端框架。1)React的組件化開發(fā)模式和強(qiáng)大生態(tài)系統(tǒng)是Netflix選擇它的主要原因。2)通過組件化,Netflix將復(fù)雜界面拆分成可管理的小塊,如視頻播放器、推薦列表和用戶評(píng)論。3)React的虛擬DOM和組件生命周期優(yōu)化了渲染效率和用戶交互管理。

vue的div怎么跳轉(zhuǎn) vue的div怎么跳轉(zhuǎn) Apr 08, 2025 am 09:18 AM

Vue 中 div 元素跳轉(zhuǎn)的方法有兩種:使用 Vue Router,添加 router-link 組件。添加 @click 事件監(jiān)聽器,調(diào)用 this.$router.push() 方法跳轉(zhuǎn)。

反應(yīng),vue和Netflix前端的未來 反應(yīng),vue和Netflix前端的未來 Apr 12, 2025 am 12:12 AM

Netflix主要使用React作為前端框架,輔以Vue用于特定功能。1)React的組件化和虛擬DOM提升了Netflix應(yīng)用的性能和開發(fā)效率。2)Vue在Netflix的內(nèi)部工具和小型項(xiàng)目中應(yīng)用,其靈活性和易用性是關(guān)鍵。

vue怎么a標(biāo)簽跳轉(zhuǎn) vue怎么a標(biāo)簽跳轉(zhuǎn) Apr 08, 2025 am 09:24 AM

實(shí)現(xiàn) Vue 中 a 標(biāo)簽跳轉(zhuǎn)的方法包括:HTML 模板中使用 a 標(biāo)簽指定 href 屬性。使用 Vue 路由的 router-link 組件。使用 JavaScript 的 this.$router.push() 方法??赏ㄟ^ query 參數(shù)傳遞參數(shù),并在 router 選項(xiàng)中配置路由以進(jìn)行動(dòng)態(tài)跳轉(zhuǎn)。

vue怎么實(shí)現(xiàn)組件跳轉(zhuǎn) vue怎么實(shí)現(xiàn)組件跳轉(zhuǎn) Apr 08, 2025 am 09:21 AM

Vue 中實(shí)現(xiàn)組件跳轉(zhuǎn)有以下方法:使用 router-link 和 &lt;router-view&gt; 組件進(jìn)行超鏈接跳轉(zhuǎn),指定 :to 屬性為目標(biāo)路徑。直接使用 &lt;router-view&gt; 組件顯示當(dāng)前路由渲染的組件。使用 router.push() 和 router.replace() 方法進(jìn)行程序化導(dǎo)航,前者保存歷史記錄,后者替換當(dāng)前路由不留記錄。

怎樣開發(fā)一個(gè)完整的PythonWeb應(yīng)用程序? 怎樣開發(fā)一個(gè)完整的PythonWeb應(yīng)用程序? May 23, 2025 pm 10:39 PM

要開發(fā)一個(gè)完整的PythonWeb應(yīng)用程序,應(yīng)遵循以下步驟:1.選擇合適的框架,如Django或Flask。2.集成數(shù)據(jù)庫,使用ORM如SQLAlchemy。3.設(shè)計(jì)前端,使用Vue或React。4.進(jìn)行測試,使用pytest或unittest。5.部署應(yīng)用,使用Docker和平臺(tái)如Heroku或AWS。通過這些步驟,可以構(gòu)建出功能強(qiáng)大且高效的Web應(yīng)用。

See all articles