vue xunidom_vue的虛擬dom(Virtual DOM )

模板轉換成視圖的過程

在底層實現中Vue會將模板編譯成渲染函數,當然我們也可以不寫模板,直接寫渲染函數,以獲得更好的控制。

渲染函數:渲染函數是用來生成Virtual DOM的;

VNode虛擬節點:vnode可以理解成dom節點的描述對象,它描述了應該怎樣去創建真實的DOM節點;

patch(patching算法):虛擬DOM最核心的部分,它可以將vnode渲染成真實的DOM。這個過程是對比新舊虛擬節點之間有哪些不同,然后根據對比結果找出需要更新的的節點進行更新。其實際作用是在現有DOM上進行修改來實現更新視圖的目的;

Virtual DOM

Virtual DOM用JS對象來描述dom的節點(VNode),這個對象至少包含標簽名( tag)、屬性(attrs)和子元素對象( children)這三個屬性。它是對真實 DOM 的抽象,最終可以通過一系列操作把這個對象轉化為真實的dom。

具體步驟為

Virtual DOM 本質上就是在 JS 和 DOM 之間做了一個緩存

Virtual DOM的作用

虛擬DOM的最終目標是將虛擬節點渲染到視圖上,但是如果直接使用虛擬節點覆蓋舊節點的話,會有很多不必要的DOM操作。例如,一個ul標簽下很多個li標簽,其中只有一個li有變化,這種情況下如果使用新的ul去替代舊的ul,因為這些不必要的DOM操作而造成了性能上的浪費。

為了避免不必要的DOM操作,虛擬DOM在虛擬節點映射到視圖的過程中,將虛擬節點與上一次渲染視圖所使用的舊虛擬節點(oldVnode)做對比,找出真正需要更新的節點來進行DOM操作,從而避免操作其他無需改動的DOM。

其實虛擬DOM在Vue.js主要做了兩件事:

提供與真實DOM節點所對應的虛擬節點vnode;

將虛擬節點vnode和舊虛擬節點oldVnode進行對比,然后更新視圖;

Virtual DOM的diff算法

遞歸地進行同級vnode的diff,最終實現整個DOM樹的更新

步驟:

用 JavaScript 對象結構表示 DOM 樹的結構;然后用這個樹構建一個真正的 DOM 樹,插到文檔當中;

當狀態變更的時候,重新構造一棵新的對象樹。然后用新的樹和舊的樹進行比較,記錄兩棵樹差異;

把所記錄的差異應用到所構建的真正的DOM樹上,視圖就更新了;

Virtual DOM的優點

跨平臺的優勢:由于 Virtual DOM 是以 JavaScript 對象為基礎而不依賴真實平臺環境,所以使它具有了跨平臺的能力,比如說瀏覽器平臺、Weex、Node 等;

提高效率:操作 DOM 慢,js運行效率高,所以將DOM對比操作放在JS層可以提高效率;

提高渲染性能:通過patch 的核心----diff 算法,找出本次DOM需要更新的節點來更新,其他的不更新。比如修改某個model 100次,從1加到100,那么有了Virtual DOM的緩存之后,只會把最后一次修改patch到view上。

nextTick

this.$nextTick(()=>{//操作。。。

})

1 Vue生命周期的created()鉤子函數進行的DOM操作一定要放在Vue.nextTick()的回調函數中;

2?當項目中你想在改變DOM元素的數據后基于新的dom做點什么,對新DOM一系列的js操作都需要放進Vue.nextTick()的回調函數中;

3?在使用某個第三方插件時 ,希望在vue生成的某些dom動態發生變化時重新應用該插件,也會用到該方法;

改變數據有時不更新

1 vue實現數據雙向綁定有這么一個過程:當你把一個普通的 JavaScript 對象傳給 Vue 實例的 data 選項,Vue 將遍歷此對象所有的屬性,并使用Object.defineProperty() 把這些屬性全部轉為getter/setter。每個組件實例都有相應的 watcher 實例對象,它會在組件渲染的過程中把屬性記錄為依賴,之后當依賴項的 setter 被調用時,會通知 watcher 重新計算,從而致使它關聯的組件得以更新。實現數據data變化更新視圖view。

var vm = newVue({

data:{

a:1; //vm.a 是響應的

}

})

vm.b= 2; //vm.b 是非響應的

2?沒有更新dom是因為改變數據之后Object.defineproperty()的set方法沒有被觸發,即沒有監測到數據更新。以下幾種情況會出現這個問題:

當你利用索引直接設置數組的一項時,例如:this.items[indexOfItem] = newValue;

當你修改數組的長度時,例如:this.items.length = newLength;

數組的push,splice等方法也不會更新dom;

對象里邊的修改:

data () {return{

student: {

name:''},

teach:["李磊"]

}

}//以下操作不會觸發視圖更新

this.student.name="XXX";

解決辦法:

1 使用set:

this.$set('對象名', key, value); //對象寫法

this.$set(this.teach,0, “韓梅梅”); //數組寫法

2 使用deep

watch:{

student:{

handler:(n,o)=>{//邏輯處理

},

deep:true}

}

3? 改變原對象或數組的地址

this.obj = Object.assign({},this.obj,{"sex","man"});

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276059.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276059.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276059.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql之union合并查詢

轉載鏈接:http://www.cnblogs.com/zzwlovegfj/archive/2012/06/23/2559592.html union:聯合的意思,即把兩次或多次查詢結果合并起來。 要求:兩次查詢的列數必須一致 推薦:列的類型可以不一樣,但推薦查詢的每一列&#…

Node.js 開發者 2020 年度報告

大家好,我是若川。歡迎加我微信 ruochuan12,長期交流學習。今天分享一篇Node.js報告,記得當時我還參與填寫這個調查問卷了,Node.js的重要性不言而喻。微信預計閱讀只需7分鐘。點擊下方卡片關注我,或者查看源碼系列文章…

[SPS2010] 使用心得 7 - ebook for Installation

[SPS2010] 使用心得 7 - ebook for Installation 一本有關Sharepoint 2010安裝的ebook (英語) http://sharepoint2007tips.com/Documents/Installing%20and%20Configuring%20SharePoint%202010.pdf 相當詳細,目前為止僅有的可以下載的。 posted on 2010-…

視覺設計_視覺設計:

視覺設計What does the customer first see in your application? Yes, its your application design. So it is very important to pay attention to how the design is made. There’s so many factors to include, like how usually people meaning a symbol, how their pr…

開源分布式中間件 DBLE 快速入門指南

2019獨角獸企業重金招聘Python工程師標準>>> 環境準備 DBLE項目資料 DBLE官方網站:https://opensource.actionsky.com 可以詳細了解DBLE的背景和應用場景,本文不涉及到的細節都可在官方文檔獲得更細節都信息;對于剛了解到同學&…

文字輸入限制_從拼音輸入法的興起看漢字文化圈的衰落

曾經韓國的報紙是這樣的:現在的則是這樣的:(上面兩圖均來自網絡,如有侵權請告知)二戰之后,曾經廣泛使用漢字的朝韓跟越南都走上了廢除漢字之路。日本雖然依然使用漢字,卻也發布了《當用漢字表》…

JS彈出窗口

轉載鏈接:http://www.jb51.net/article/32747.htm 如何利用網頁彈出各種形式的窗口,我想大家大多都是知道些的,但那種多種多樣的彈出式窗口是怎么搞出來的,我們今天就來學習一下: 1.彈啟一個全屏窗口 windows.open(…

跟各位讀者朋友分享下公眾號運營策略

大家好,我是若川。歡迎加我微信 ruochuan12,加群交流學習。目前我的公眾號運營策略,分享給各位讀者朋友。點擊下方卡片關注我,或者查看源碼等系列文章。可能大多數關注的人不知道,我的公眾號取名為若川視野的原因。「若…

[轉載]用PHP的ob_start();控制您的瀏覽器cache!

FROM http://www.phpchina.com/html/28/1628-3870.html Output Control 函數可以讓你自由控制腳本中數據的輸出。它非常地有用,特別是對于:當你想在數據已經輸出后,再輸出文件頭的情況。輸出控制函數不對使用 header() 或 setcookie(), 發送的…

oracle 帶有變量的語句_【成都校區】Oracle SQL語句之常見優化方法總結

本帖出自于黑馬程序員成都中心,更多資源可關注微信公眾號1、SQL語句盡量用大寫的;因為oracle總是先解析SQL語句,把小寫的字母轉換成大寫的再執行。2、使用表的別名: 當在SQL語句中連接多個表時, 盡量使用表的別名并把別名前綴于每…

js 獲取上下文后面的路徑_通過在數據后面顯示上下文來可視化公眾意見

js 獲取上下文后面的路徑In 1824, The Harrisburg Pennsylvanian, a newspaper from a town in Pennsylvania conducted the first known public opinion polls in history, and successfully predicted the result of the vote in the close race between Andrew Jackson and …

甘肅甘南步班郵遞員:草原上的“遞愛”艱途

圖為甘肅甘南藏族自治州碌曲縣郎木寺鎮郵政支局的投遞員進行投遞工作。(資料圖) 鐘欣 攝 中新網蘭州1月25日電 (吳玉蒿)漸近春節,劉權英投遞郵件的工作愈加繁重。現年45歲的劉權英是甘肅甘南藏族自治州碌曲縣郎木寺鎮郵政支局的一名投遞員。由…

核心編程6——線程

Note 0:了進程實際是由兩個組件組成的:一個進程內核對象和一個地址空間.類似地,線程也由兩個組件組成:一個是線程的內核對象,操作系統用它管理線程.內核對象還是系統用來存放線程統計信息的地方.一個線程堆棧,用于維護線程執行時所需的所有函數參數和局部變量.Note 1:進程是有惰…

PHP解決搶購、秒殺、搶樓、抽獎等阻塞式高并發庫存防控超量的思路方法

轉載鏈接:http://www.4u4v.net/thinking-approach-to-buy-spike-grab-floor-sweepstakes-and-other-high-concurrent-blocking-prevention-excess-inventory-solve-php.html 如今在電商行業里,秒殺搶購活動已經是商家常用促銷手段。但是庫存數量有限,而同…

看了就會的 Node.js 三大基礎模塊常用 API

大家好,我是若川。歡迎加我微信 ruochuan12,加群交流學習。今天分享一篇nodejs基礎的文章。點擊下方卡片關注我,或者查看源碼等系列文章。在日常使用 Node 進行開發的時候,會使用到一些文件系統、路徑操作等基礎 API,這…

vue-cli3插件初體驗

vue-cli3發布自2018年8月,距離現在還不是特別久,最好搭建項目剛好用到,所以寫下這篇文章,記錄一下踩坑經歷。vue的作者說過,vue-cli的本質是模版的拉取,太多的配置導致了模版的難以維護,所以重構…

ios設計登錄功能_親愛的產品設計師,這是iOS 14的新功能

ios設計登錄功能On June 22, 2020 Apple previewed iOS 14 for the first time. As always there are quite some changes you should know about as a product designer like widgets, pickers, app clips, permissions and more.2020年6月22日,Apple首次預覽iOS 1…

c++ int 轉 short_C/C++結構體內存對齊

在面試或工作中,經常會遇到內存對齊的問題。這里結合我的理解談一談對內存對齊的理解。1. 為什么要內存對齊,不對齊會怎么樣?內存中存放數據是為了給CPU使用,CPU訪問內存數據時會受到地址總線寬度的限制,也就是一次能從…

對于日訪問量達到1W IP的處理方法

轉自:http://www.java123.net/56026-2.html 對于日訪問量達到1W IP的處理方法 一、1萬ip真是不高: 1.常用數據用緩存,減輕數據庫壓力。 2.詳細頁數據生成靜態頁面。 二、10000算是相當小的了,不需要什么特殊的處理機制,只要符合最一般的…

數據契約(DataContract)

WCF第一要素就是契約: 服務契約用于聲明可用于遠程訪問的類型。在Interface或class開始處使用服務契約標簽. [ServiceContract] Public interface Iservice { } 接口調用契約的好處: 1. 同一服務類型可以實現多個不相干的服務契約. 2. 有利于版本升級 3. 按照…