Vue2.x中的Render函數(shù)詳解
Render函數(shù)是Vue2.x版本新增的一個函數(shù);使用虛擬dom來渲染節(jié)點提升性能,因為它是基于JavaScript計算。通過使用createElement(h)來創(chuàng)建dom節(jié)點。createElement是render的核心方法。其Vue編譯的時候會把template里面的節(jié)點解析成虛擬dom;
什么是虛擬dom?
虛擬dom不同于真正的dom,它是一個JavaScript對象。當狀態(tài)發(fā)生變化的時候虛擬dom會進行一個diff判斷/運算;然后判斷哪些dom是需要被替換的而不是全部重繪,所以性能會比dom操作高很多。
下面看一張Aresn大神總結的一張圖:
Vue2.x版本中VNode屬性:
tag:當前節(jié)點標簽名,
data:當前節(jié)點數(shù)據(jù)對象,
children:子節(jié)點數(shù)組,
text:當前節(jié)點文本,
elm:當前虛擬節(jié)點對應的真實dom節(jié)點,
ns:節(jié)點的namespace( 名稱空間),
content:編譯作用域,
functionalContext:函數(shù)化組件的作用域,即全局上下文,
key:節(jié)點標識,有利于patch優(yōu)化,
componentOptions:創(chuàng)建組件實例時的options,
child:當前節(jié)點對應的組件實例,
parent:組件的占位節(jié)點,
raw:原始html,
isStatic:是否是靜態(tài)節(jié)點,
isRootInsert:是否作為跟節(jié)點插入,若被<transition>包裹的節(jié)點,該屬性值為false,
isComment:是否為注釋節(jié)點,
isCloned:是否為克隆節(jié)點,
isOnce:是否只改變(渲染)一次,或是否有v-once指令;
其中這里面又有幾種VNode類型:
Aresn大神總結的很好:
TextVNode:文本節(jié)點,
ElementVNode:普通元素節(jié)點,
ComponentVNode:組件節(jié)點,
EmptyVNode:空節(jié)點,或者說是沒有內(nèi)容的注釋節(jié)點,
CloneVNode:克隆節(jié)點,可以是以上任意類型節(jié)點
說了那么多;到底什么時候用虛擬dom才比較好呢?其實 我們使用的單文件組件就已經(jīng)夠好了。但是當某些代碼冗余的時候如果寫單文件組件的話會有好多重復的內(nèi)容;
接下來介紹其核心函數(shù);
createElement:
createElement接收3個參數(shù):
第一個參數(shù)可以是HTML標簽名,組件或者函數(shù)都可以;此參數(shù)是必須的;
第二個為數(shù)據(jù)對象(可選);
第三個為子節(jié)點(可選)。
附上一個非常簡單的createElement函數(shù)demo;
var app = new Vue({ el:"#app", render:createElement => { eturn createElement( 'h2', [ createElement( 'a', { domProps:{ href:"#biaoti" } }, "標題" ) ] ); } });
這只是一個createElement函數(shù)的使用,而Vue2中VNodeData
class: v-bind/:class
style:v-bind/:style
attrs:dom屬性,如id
props:props,
on:自定義事件等,
nativeOn:原生事件
像這些也可以在render函數(shù)中實現(xiàn),若VNode是組件或含有組件的slot,那么VNode必須是唯一。
像平常開發(fā)過程中單文件組件中template寫法更為簡單,可讀性也高。如果是webpack進行打包的話template也會預編譯成render函數(shù)。
這里demo栗子暫時還沒寫那么多。這里只是一個簡單的介紹。若有更好的歡迎大家一起學習討論。
相關文章
使用Vue.js實現(xiàn)數(shù)據(jù)的雙向綁定
在Vue.js中,雙向數(shù)據(jù)綁定是一項非常強大的功能,它能夠使數(shù)據(jù)和視圖之間保持同步,讓開發(fā)者更加方便地操作數(shù)據(jù),在本文中,我們將介紹如何用Vue.js實現(xiàn)數(shù)據(jù)的雙向綁定,需要的朋友可以參考下2023-04-04Vue+Router+Element實現(xiàn)簡易導航欄
這篇文章主要為大家詳細介紹了Vue+Router+Element實現(xiàn)簡易導航欄,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09vue-router的beforeRouteUpdate不觸發(fā)問題
這篇文章主要介紹了vue-router的beforeRouteUpdate不觸發(fā)問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-04-04