日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Vue.js之VNode的使用

瀏覽:111日期:2022-09-30 15:50:15
什么是VNode

在vue.js中存在一個VNode類,使用它可以實例化不同類型的vnode實例,而不同類型的vnode實例各自表示不同類型的DOM元素。

例如,DOM元素有元素節點,文本節點,注釋節點等,vnode實例也會對應著有元素節點和文本節點和注釋節點。

VNode類代碼如下:

export default class VNode { constructor(tag, data, children, text, elm, context, componentOptions, asyncFactory) { this.tag = tagthis.data = datathis.children = childrenthis.text = textthis.elm = elmthis.ns = undefinedthis.context = contextthis.functionalContext = undefinedthis.functionalOptions = undefinedthis.functionalScopeId = undefinedthis.key = data && data.keythis.componentOptions = componentOptionsthis.componentInstance = undefinedthis.parent = undefinedthis.raw = falsethis.isStatic = falsethis.isRootInsert = truethis.isComment = falsethis.isCloned = falsethis.isOnce = falsethis.asyncFactory = asyncFactorythis.asyncMeta = undefinedthis.isAsyncPlaceholder = false } get child() {return this.componentInstance } }

從上面的代碼可以看出,vnode只是一個名字,本質上來說就是一個普通的JavaScript對象,是從VNode類實例化的對象。我們用這個JavaScript對象來描述一個真實DOM元素的話,那么該DOM元素上的所有屬性在VNode這個對象上都存在對應得屬性。

簡單來說,vnode可以理解成節點描述對象,他描述了應該怎樣去創建真實的DOM節點。例如,tag表示一個元素節點的名稱,text表示一個文本節點的文本,children表示子節點等。vnode表示一個真實的DOM元素,所有真實的DOM節點都是用vnode創建并插入到頁面中。

VNode創建DOM并插入到視圖

Vue.js之VNode的使用

圖中展示了使用vnode創建真實的DOM并渲染到視圖的過程。可以得知,vnode和視圖是一一對應的。我們可以把vnode理解成JavaScript對象版本的DOM元素。

渲染視圖的過程是先創建vnode,然后在使用vnode去生成真實的DOM元素,最后插入到頁面渲染視圖。

VNode的作用

由于每次渲染視圖時都是先創建vnode,然后使用它創建的真實DOM插入到頁面中,所以可以將上一次渲染視圖時先所創建的vnode先緩存起來,之后每當需要重新渲染視圖時,將新創建的vnode和上一次緩存的vnode對比,查看他們之間有哪些不一樣的地方,找出不一樣的地方并基于此去修改真實的DOM。

Vue.js目前對狀態的偵測策略采用了中等粒度。當狀態發生變化時,只通知到組件級別,然后組件內使用虛擬DOM來渲染視圖。

如圖下所示,當某個狀態發生變化時,只通知使用了這個狀態的組件。也就是說,只要組件使用的眾多狀態中有一個發生了變化,那么整個組件就要重新渲染。

Vue.js之VNode的使用

如果組件只有一個節點發生了變化,那么重新渲染整個組件的所有節點,很明顯會造成很大的性能浪費。因此,對vnode驚醒緩存,并將上一次的緩存和當前創建的vnode對比,只更新有差異的節點就變得很重要。這也是vnode最重要的一個作用。

VNode的類型

vnode有很多不同的類型,有以下幾種:

注釋節點

文本節點 元素節點 組件節點 函數式節點 克隆節點

前面介紹了vnode是一個JavaScript對象,不同類型的vnode之間其實屬性不同,準確說是有效屬性不同。因為當使用VNode類創建一個vnode時,通過參數為實例設置屬性時,無效的屬性會默認設置為undefined或者false。對于 vnode身上的無效屬性,直接忽略就好。

1.注釋節點

由于創建注釋節點的過程非常簡單,所以直接通過代碼來介紹它有哪些屬性:

export const createEmptyVNode = text => {const node = new VNode()node.text = text;node.isComment = true;return node }

一個注釋節點只有兩個有效屬性 text 和 isComment。其余屬性全是默認undefined或者false。

例如一個真實的注釋節點,所對應的vnode是下面的樣子:

// <!-- 注釋節點 -->{ text: '注釋節點', isComment: true}2.文本節點

文本節點的創建過程也非常簡單,代碼如下:

export function createTextVNode(val) {return new VNode(undefined, undefined, undefined, String(val)) }

當文本類型的vnode被創建時,它只有一個text屬性:

{ text: '文本節點'} 3.克隆節點

克隆節點是將現有節點的屬性賦值到新節點中,讓新創建的節點和被克隆的節點的屬性保持一致,從而實現克隆效果。它的作用是優化靜態節點和插槽節點(slot node)。

以靜態節點為例,當組件內某個狀態發生變化后,當前組件會通過虛擬DOM重新渲染視圖,靜態節點因為它的內容不會改變,所以除了首次渲染需要執行渲染函數獲取vnode之外,后續更新不需要執行渲染函數重新生成vnode。

因此,這是就會使用創建克隆節點的方法將vnode克隆一份,使用克隆節點進行渲染。這樣就不需要執行渲染函數生成新的靜態節點的vnode,從而提升一定的性能。

創建克隆節點的代碼如下:

export function cloneVNode(vnode, deep) {const cloned = new VNode(vnode.tag, vnode.data, vnode.children, vnode.text, vnode.elm, vnode.context, vnode.componentOptions, vnode.asyncFactory)cloned.ns = vnode.nscloned.isStatic = vnode.isStaticcloned.key = vnode.keycloned.isComment = vnode.isCommentcloned.isCloned = trueif (deep && vnode.children) { cloned.children = cloneVNodes(vnode.children)}return cloned }

克隆現有節點,只需要將現有節點的屬性全部賦值到新節點中。克隆節點和被克隆節點位移的區別是isCloned屬性,克隆節點為true,被克隆的原始節點為false。

4.元素節點

元素節點通常會存在以下4中有效屬性。

tag:tag就是一個節點的名稱,例如 p、ul、li和div等。 data:改屬性包含了一些節點上的數據,比如attrs、class和style等。 children:當前節點的子節點列表。 context:它是當前組件的Vue.js實例

一個真實的元素節點,對應得vnode是下面這樣:

// <p><span>Hello</span><span>World</span></p> {children: [VNode, VNode],context: {...},data: {...},tag: 'p',... } 5.組件節點

組件節點和元素節點類似,有以下兩個獨有的屬性。

componentOptions:組件節點的選項參數,其中包含了propsData、tag和children等信息componentInstance:組件的實例,也就是Vue.js的實例。事實上,在Vue.js中,每個組件都有一個Vue.js實例。

一個組件節點,對應得vnode是下面這樣:

// <child></child> {componentInstance: {...},componentOptions: {...},context: {...},data: {...},tag: 'vue-component-1-child',...}6.函數式節點

函數式節點和組件節點類似,他有兩個獨有的屬性functionalContext和functionalOptions。通常,一個函數式節點的vnode是下面這樣:

{functionalContext: {...},functionalOptions: {...},context: {...},data: {...},tag: 'div' }總結

VNode是一個類,可以生產不同類型的vnode實例,不同類型的實例表示不同類型的真實DOM。

由于Vue.js對組件采用了虛擬DOM來更新視圖,當屬性發生變化時,整個組件都要進行重新渲染的操作,但組件內并不是所有的DOM節點都需要更新,所以將vnode緩存并將當前新生成的vnode和緩存的vnode作對比,只對需要更新的部分進行DOM操作可以提升很多的性能。

vnode有很多類型,它們本質上都是Vnode實例化出的對象,其唯一區別是屬性不同。

到此這篇關于Vue.js之VNode的使用的文章就介紹到這了,更多相關VNode使用內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Vue
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美.日韩.国产.一区.二区| 欧美激情麻豆| 不卡一二三区| 精品色999| 高潮久久久久久久久久久久久久| 精品三级在线观看视频| 久久天堂影院| 超碰在线99| 国产一区观看| 欧美美女一区| 石原莉奈一区二区三区在线观看| 丝袜美腿高跟呻吟高潮一区| 最新亚洲国产| 国产精品欧美三级在线观看| 精品美女在线视频| 国产成人调教视频在线观看| 日韩在线中文| 影院欧美亚洲| 日本不卡一区二区| 国产精品综合色区在线观看| 精品一区二区三区四区五区| 欧美韩一区二区| 极品裸体白嫩激情啪啪国产精品| 国产中文字幕一区二区三区| 久久三级福利| 亚洲国产不卡| 国产精品videossex久久发布| 欧美日韩精品免费观看视欧美高清免费大片 | 亚洲精品88| 亚洲成人国产| 亚洲中字黄色| 国产日产精品一区二区三区四区的观看方式| 国产精品主播| 99视频精品全国免费| 久久国产精品99国产| 奇米亚洲欧美| 亚洲欧洲美洲av| 国产99精品| 日本欧美一区二区| 成人综合一区| 久久xxxx| 国产成人免费av一区二区午夜| 91九色精品国产一区二区| 成人日韩精品| 欧洲亚洲一区二区三区| 欧美日韩国产精品一区二区亚洲| 天堂久久av| 久久男人av资源站| 免费美女久久99| 久久不卡日韩美女| 亚洲精品国产偷自在线观看| 欧美日韩精品一区二区三区视频| 美女在线视频一区| 欧美~级网站不卡| 欧美一级二区| 今天的高清视频免费播放成人| 日韩av影院| 色婷婷精品视频| 日韩高清在线不卡| 99成人在线视频| 国产麻豆精品| 一本色道精品久久一区二区三区| 国产精品一区2区3区| 影视先锋久久| 国产精品地址| 国产农村妇女精品一二区| 国产精品成人国产| 国产高清一区| 精品视频网站| 蜜桃久久久久久| 日韩欧美一区二区三区免费观看| 欧美日韩91| 91久久亚洲| 久久99国产精品视频| 亚洲综合激情在线| 国产伊人精品| 福利一区视频| 欧美黑人做爰爽爽爽| 伊人久久大香伊蕉在人线观看热v| 日韩在线不卡| 久久精品一区二区国产| 99精品综合| 麻豆精品视频在线观看视频| 久久午夜精品| 亚洲国产专区| 国产资源在线观看入口av| 91亚洲精品视频在线观看| 9久re热视频在线精品| 成人va天堂| 国产不卡av一区二区| 欧美欧美黄在线二区| 日本久久精品| 欧美另类中文字幕| 一区二区高清| 日韩一区二区免费看| 精品99久久| 欧美日韩亚洲国产精品| 亚洲精品一区二区在线看| 欧美国产一级| 精品淫伦v久久水蜜桃| 日本免费新一区视频| 欧美综合国产| 欧美不卡视频| 日韩三区在线| 久久男人av资源站| 国产精品原创| 福利一区和二区| 狂野欧美性猛交xxxx| 国产毛片精品| 欧美精品国产一区| 日本一区二区中文字幕| 日韩在线卡一卡二| 一区久久精品| 亚洲福利精品| 婷婷亚洲五月色综合| 亚洲一级高清| 欧美日韩国产免费观看| 国产一区二区精品| 免费日韩av片| 日韩中文字幕亚洲一区二区va在线| 尤物精品在线| 亚洲一区日韩在线| 一区在线视频观看| 在线综合欧美| 免播放器亚洲一区| 综合五月婷婷| 日本免费新一区视频| 日本伊人午夜精品| 亚洲3区在线| 日本国产一区| 国产精品v亚洲精品v日韩精品| 国产精品a级| 精品免费在线| 成人久久一区| 在线一区视频| 日韩精品久久久久久| 麻豆久久久久久| 日韩在线中文| 夜夜嗨一区二区三区| 蜜臀av性久久久久蜜臀aⅴ四虎| 日韩一区二区三区四区五区| 国产精品一区二区av交换| 国产精品久久久久77777丨| 精品亚洲成人| 精品日韩视频| 久热精品在线| 国产日韩欧美一区在线| 国产一区二区三区国产精品| 欧洲av不卡| 国产亚洲精品久久久久婷婷瑜伽| 亚洲精品影视| 精品无人区麻豆乱码久久久 | 国精品一区二区| 午夜在线精品偷拍| 天海翼精品一区二区三区| 亚洲精品免费观看| 国产精品成人**免费视频| 日韩国产欧美| 极品裸体白嫩激情啪啪国产精品| 日韩影院免费视频| 国产极品一区| 播放一区二区| 日韩中文字幕亚洲一区二区va在线| 国产色99精品9i| 婷婷激情一区| 中文字幕乱码亚洲无线精品一区| 欧美精品aa| 樱桃成人精品视频在线播放| 国产精品一级| 亚洲免费观看高清完整版在线观| 亚洲精品三级| 中日韩男男gay无套| 日韩激情中文字幕| 国产精品99精品一区二区三区∴ | 中文在线一区| 日韩手机在线| av中文资源在线资源免费观看| 欧美~级网站不卡| 欧美视频久久| 激情欧美丁香| 亚欧成人精品| 激情国产在线| 亚洲欧洲日韩精品在线| 精品久久精品| 免费在线观看不卡| 国产精品毛片一区二区在线看| 免费观看在线色综合| 吉吉日韩欧美| 日本一区二区中文字幕| 久久国产直播| 国产亚洲精品美女久久| 国产综合精品一区| 欧美国产不卡| 免费在线视频一区| 日韩欧美精品综合| 日韩国产在线一| 丰满少妇一区| 97精品国产| 日韩欧美一区二区三区在线观看| 美女毛片一区二区三区四区|