Vue2.x中的Render函數(shù)詳解
Render函數(shù)是Vue2.x版本新增的一個函數(shù);使用虛擬dom來渲染節(jié)點(diǎn)提升性能,因?yàn)樗腔贘avaScript計(jì)算。通過使用createElement(h)來創(chuàng)建dom節(jié)點(diǎn)。createElement是render的核心方法。其Vue編譯的時(shí)候會把template里面的節(jié)點(diǎn)解析成虛擬dom;
什么是虛擬dom?
虛擬dom不同于真正的dom,它是一個JavaScript對象。當(dāng)狀態(tài)發(fā)生變化的時(shí)候虛擬dom會進(jìn)行一個diff判斷/運(yùn)算;然后判斷哪些dom是需要被替換的而不是全部重繪,所以性能會比dom操作高很多。
下面看一張Aresn大神總結(jié)的一張圖:

Vue2.x版本中VNode屬性:
tag:當(dāng)前節(jié)點(diǎn)標(biāo)簽名,
data:當(dāng)前節(jié)點(diǎn)數(shù)據(jù)對象,
children:子節(jié)點(diǎn)數(shù)組,
text:當(dāng)前節(jié)點(diǎn)文本,
elm:當(dāng)前虛擬節(jié)點(diǎn)對應(yīng)的真實(shí)dom節(jié)點(diǎn),
ns:節(jié)點(diǎn)的namespace( 名稱空間),
content:編譯作用域,
functionalContext:函數(shù)化組件的作用域,即全局上下文,
key:節(jié)點(diǎn)標(biāo)識,有利于patch優(yōu)化,
componentOptions:創(chuàng)建組件實(shí)例時(shí)的options,
child:當(dāng)前節(jié)點(diǎn)對應(yīng)的組件實(shí)例,
parent:組件的占位節(jié)點(diǎn),
raw:原始html,
isStatic:是否是靜態(tài)節(jié)點(diǎn),
isRootInsert:是否作為跟節(jié)點(diǎn)插入,若被<transition>包裹的節(jié)點(diǎn),該屬性值為false,
isComment:是否為注釋節(jié)點(diǎn),
isCloned:是否為克隆節(jié)點(diǎn),
isOnce:是否只改變(渲染)一次,或是否有v-once指令;
其中這里面又有幾種VNode類型:
Aresn大神總結(jié)的很好:

TextVNode:文本節(jié)點(diǎn),
ElementVNode:普通元素節(jié)點(diǎn),
ComponentVNode:組件節(jié)點(diǎn),
EmptyVNode:空節(jié)點(diǎn),或者說是沒有內(nèi)容的注釋節(jié)點(diǎn),
CloneVNode:克隆節(jié)點(diǎn),可以是以上任意類型節(jié)點(diǎn)
說了那么多;到底什么時(shí)候用虛擬dom才比較好呢?其實(shí) 我們使用的單文件組件就已經(jīng)夠好了。但是當(dāng)某些代碼冗余的時(shí)候如果寫單文件組件的話會有好多重復(fù)的內(nèi)容;
接下來介紹其核心函數(shù);
createElement:
createElement接收3個參數(shù):
第一個參數(shù)可以是HTML標(biāo)簽名,組件或者函數(shù)都可以;此參數(shù)是必須的;
第二個為數(shù)據(jù)對象(可選);
第三個為子節(jié)點(diǎn)(可選)。
附上一個非常簡單的createElement函數(shù)demo;
var app = new Vue({
el:"#app",
render:createElement => {
eturn createElement(
'h2',
[
createElement(
'a',
{
domProps:{
href:"#biaoti"
}
},
"標(biāo)題"
)
]
);
}
});
這只是一個createElement函數(shù)的使用,而Vue2中VNodeData
class: v-bind/:class
style:v-bind/:style
attrs:dom屬性,如id
props:props,
on:自定義事件等,
nativeOn:原生事件
像這些也可以在render函數(shù)中實(shí)現(xiàn),若VNode是組件或含有組件的slot,那么VNode必須是唯一。
像平常開發(fā)過程中單文件組件中template寫法更為簡單,可讀性也高。如果是webpack進(jìn)行打包的話template也會預(yù)編譯成render函數(shù)。
這里demo栗子暫時(shí)還沒寫那么多。這里只是一個簡單的介紹。若有更好的歡迎大家一起學(xué)習(xí)討論。
相關(guān)文章
vue中使用elementui實(shí)現(xiàn)樹組件tree右鍵增刪改功能
這篇文章主要介紹了vue中使用elementui實(shí)現(xiàn)對樹組件tree右鍵增刪改功能,右擊節(jié)點(diǎn)可進(jìn)行增刪改,對節(jié)點(diǎn)數(shù)據(jù)進(jìn)行模糊查詢功能,本文給大家分享了完整代碼,需要的朋友可以參考下2022-08-08
vue實(shí)現(xiàn)微信分享鏈接添加動態(tài)參數(shù)的方法
這篇文章主要介紹了vue微信分享鏈接添加動態(tài)參數(shù)的實(shí)現(xiàn)方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-04-04
vue項(xiàng)目搭建以及全家桶的使用詳細(xì)教程(小結(jié))
這篇文章主要介紹了vue項(xiàng)目搭建以及全家桶的使用詳細(xì)教程(小結(jié)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12
vue中計(jì)算屬性computed理解說明包括vue偵聽器,緩存與computed的區(qū)別
這篇文章主要介紹了對vue中計(jì)算屬性computed理解說明包括vue偵聽器,緩存與computed的區(qū)別,需要的朋友可以參考下2022-05-05
Vue3+Spring Framework框架開發(fā)實(shí)戰(zhàn)
這篇文章主要為大家介紹了Vue3+Spring Framework框架開發(fā)實(shí)戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04

