精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Vue.js設(shè)計與實現(xiàn)之十二-渲染器的核心功能:掛載與更新01

開發(fā) 前端
在本文中主要講述了如何實現(xiàn)虛擬DOM節(jié)點轉(zhuǎn)成真實DOM樹上,最終掛載到掛載點上。討論了虛擬節(jié)點是如何掛載到DOM樹,又是如何從DOM樹上卸載的,對于屬性又是如何在元素上進行設(shè)置的。

1、寫在前面

在本文中主要講述了如何實現(xiàn)虛擬DOM節(jié)點轉(zhuǎn)成真實DOM樹上,最終掛載到掛載點上。討論了虛擬節(jié)點是如何掛載到DOM樹,又是如何從DOM樹上卸載的,對于屬性又是如何在元素上進行設(shè)置的。

2、掛載子節(jié)點和元素的屬性

在上篇文章中,在vnode.children值為字符串時,將其設(shè)置為元素的文本內(nèi)容,當vnode.children值為數(shù)組時,表示其有子節(jié)點需要遍歷設(shè)置。我們知道vnode是一個虛擬DOM節(jié)點,vnode.children是一個虛擬DOM樹,其每個元素都是一個虛擬DOM節(jié)點。

const vnode = {
type:"div",
//props是標簽的屬性
props:{
id:"super"
},
children:[
{
type:"p",
children:"pingping"
}
]
}

上面的代碼是虛擬DOM樹形結(jié)構(gòu),如果要實現(xiàn)將虛擬VNode轉(zhuǎn)為真實DOM,需要通過掛載和渲染。可以通過mountElement函數(shù)實現(xiàn)節(jié)點的渲染:

function mountElement(vnode, container){
const el = createElement(vnode.type);
//處理children
if(typeof vnode.children === "string"){
// 字符串轉(zhuǎn)為標簽的文本內(nèi)容
setElementText(el, vnode.children)
}else if(Array.isArray(vnode.children)){
//虛擬DOM節(jié)點數(shù)組 需要遍歷每個節(jié)點進行掛載
vnode.children.forEach(child=>{
patch(null,child,el);
})
}
// 在標簽上添加屬性
if(vnode.props){
for(const key in vnode.props){
// 調(diào)用setAttribute在元素上設(shè)置屬性
el.setAttribute(key, vnode.props[key]);
// 也可以使用DOM對象直接設(shè)置屬性
// el[key] = vnode.props[key];
}
}
insert(el, container);
}

在上面代碼片段中,首先會根據(jù)vnode.type的值創(chuàng)建DOM節(jié)點,children的值判斷為string類型時,直接將其設(shè)置為元素的文本內(nèi)容;children的值判斷數(shù)組時,則對數(shù)組內(nèi)的虛擬DOM節(jié)點進行遍歷,調(diào)用patch函數(shù)掛載節(jié)點。

在掛載階段patch是沒有舊vnode的,對此傳遞的第一個參數(shù)是null,而在patch函數(shù)執(zhí)行時會遞歸調(diào)用mountElement函數(shù)完成掛載。而patch傳遞的第三個參數(shù)是虛擬節(jié)點要掛載的根節(jié)點,完成掛載后需要給元素遍歷設(shè)置屬性。

3、正確地設(shè)置元素屬性

如何正確地設(shè)置元素屬性,就得先了解HTML Attribute和DOM Properties的差異和關(guān)聯(lián)。我們知道HTML Attribute是定義在HTML標簽元素上的屬性,瀏覽器會將其解析創(chuàng)建一個對應(yīng)的DOM對象,這個對象上包含許多屬性(DOM Properties)。

HTML Attribute的作用是設(shè)置與之對應(yīng)的DOM Properties初始值,當值發(fā)生改變時,DOM Properties始終存儲著當前值,那么通過getAttribute獲取到的也是初始值。

HTML Attribute和DOM Properties。然而在使用Vue.js的單文件模板不會被瀏覽器解析,此時需要框架自己進行解析。會影響DOM屬性的添加方式,瀏覽器會解析普通HTML元素代碼,自定分析HTML Attribute設(shè)置合適的DOM Properties。然而在使用Vue.js的單文件模板不會被瀏覽器解析,此時需要框架自己進行解析。

那么,看看在Vue.js是如何實現(xiàn)的:

const renderer = createRenderer({
//創(chuàng)建元素
createElement(tag){
return document.createElement(tag);
},
//設(shè)置元素的文本節(jié)點
setElementText(el, text){
el.textContent = text;
},
//用于給指定父節(jié)點添加指定元素
insert(el, parent, achor = null){
parent.insertBefore(el, anchor);
}
// 將屬性設(shè)置相關(guān)操作進行封裝,作為渲染器選項進行傳值
patchProps(el, key, prevValue, nextValue){
if(shouldSetAsProps(el, key, nextValue)){
const type = typeof el[key];
if(key === "class"){
//采用el.className方式設(shè)置clas,是因為其性能相對于setAttribute和el.classList更高
el.className = nextValue || "";
}else if(type === "boolean" && nextValue === ""){
el[key] = true;
}else{
el[key] = nextValue;
}
}else{
el.setAttribute(key, nextValue);
}
}
})

在上面代碼中,shouldSetAsProps函數(shù)用于分析屬性是否應(yīng)該作為DOM Properties屬性被設(shè)置,返回的是一個布爾值。當返回一個true值時,表示應(yīng)該作為DOM Properties被設(shè)置,否則就應(yīng)該使用setAttribute函數(shù)設(shè)置屬性。在設(shè)置屬性時,需要優(yōu)先設(shè)置元素的DOM Properties,當其值為空字符串時,需要將其矯正為true。

在mountElement函數(shù)中,只需要調(diào)用patchProps函數(shù)傳遞參數(shù)即可:

function mountElement(vnode, container){
const el = createElement(vnode.type);
//處理children
if(typeof vnode.children === "string"){
// 字符串轉(zhuǎn)為標簽的文本內(nèi)容
setElementText(el, vnode.children)
}else if(Array.isArray(vnode.children)){
//虛擬DOM節(jié)點數(shù)組 需要遍歷每個節(jié)點進行掛載
vnode.children.forEach(child=>{
patch(null,child,el);
})
}

// 在標簽上添加屬性
if(vnode.props){
for(const key in vnode.props){
patchProps(el, key, null, vnode.props[key])
}
}
insert(el, container);
}

在上面代碼片段中,mountElement函數(shù)會檢查每個vnode.props中的屬性,調(diào)用patchProps函數(shù)去設(shè)置DOM Properties。

4、卸載操作

在前面兩節(jié)中,討論了如何將虛擬DOM掛載到掛載點上,是通過createRenderer函數(shù)結(jié)合mountElement實現(xiàn)的。而卸載操作發(fā)生在更新階段,即初次掛載完成之后,后續(xù)渲染觸發(fā)的更新。

//初次掛載
renderer.render(vnode, document.querySelector("#app"));
// 再次掛載新vnode,觸發(fā)更新 當傳遞的是null,則進行卸載之前的操作
renderer.render(vnode, document.querySelector("#app"));
//renderer.render(null, document.querySelector("#app"));

在初次渲染完畢后,后續(xù)渲染時如果傳遞的是null作為新vnode,則表示需要卸載當前所有渲染的內(nèi)容。

在上一篇文章中,使用innerHTML設(shè)置為空作為清空容器元素內(nèi)容的方案是存在缺陷的,因為它不會移除綁定在DOM元素上的事件處理函數(shù)。對此,需要先根據(jù)vnode對象獲取到與之關(guān)聯(lián)的真實DOM元素,使用原生DOM操作方法將其進行移除。

function unmount(vnode){
const parent = vnode.el.parentNode;
if(parent){
parent.removeChild(vnode.el);
}
}

unmount函數(shù)接收一個虛擬節(jié)點作為參數(shù),并將該節(jié)點對應(yīng)的真實DOM元素從父元素上移除。

注意:在新舊vnode描述內(nèi)容不同時,即vnode.type的屬性不同時,兩個vnode之間就不存在打補丁的意義,此時應(yīng)該使用unmount函數(shù)先將舊元素進行卸載,再將n1的值重置為null,最后將新元素進行掛載到容器中。

當然,即使新舊vnode描述內(nèi)容相同,也要判斷兩者的類型是否相同,vnode可以描述普通標簽也可以描述組件,對于不同類型的vnode需要使用不同的掛載或打補丁方式。

function patch(n1, n2, container){
if(n1 && n2.type !== n1.type){
unmount(n1);
n1 = null;
}
const { type } = n2;
if(typeof type === "string"){
if(!n1){
mountElement(n2, container);
}else{
patchElement(n1, n2);
}
}else if(typeof type === "object"){
// n2.type是object對象類型,則描述的是組件
}else if(type === "xxx"){
//處理其他類型vnode
}
}

5、寫在最后

掛載子節(jié)點只需要遞歸調(diào)用patch函數(shù)即可實現(xiàn)掛載,而節(jié)點屬性的設(shè)置就取決于被設(shè)置屬性的特點。在卸載操作時,通過直接使用innerHTML清空容器元素是存在諸多問題的,對此封裝了一個新的卸載函數(shù)unmount。

責任編輯:姜華 來源: 前端一碼平川
相關(guān)推薦

2022-04-20 09:07:04

Vue.js的事件處理

2022-04-18 08:09:44

渲染器DOM掛載Vue.js

2022-04-01 08:08:27

Vue.js框架命令式

2022-04-04 16:53:56

Vue.js設(shè)計框架

2022-04-25 07:36:21

組件數(shù)據(jù)函數(shù)

2022-04-12 08:08:57

watch函數(shù)options封裝

2022-04-03 15:44:55

Vue.js框架設(shè)計設(shè)計與實現(xiàn)

2022-04-11 08:03:30

Vue.jscomputed計算屬性

2022-05-03 21:18:38

Vue.js組件KeepAlive

2022-04-14 09:35:03

Vue.js設(shè)計Reflect

2022-04-05 16:44:59

系統(tǒng)Vue.js響應(yīng)式

2022-04-26 05:55:06

Vue.js異步組件

2022-04-17 09:18:11

響應(yīng)式數(shù)據(jù)Vue.js

2022-04-09 17:53:56

Vue.js分支切換嵌套的effect

2022-04-16 13:59:34

Vue.jsJavascript

2022-04-12 08:09:22

Nodejs前端面試題

2019-04-01 19:38:28

Vue.jsJavascript前端

2010-08-13 11:02:27

Flex渲染器

2016-11-01 19:10:33

vue.js前端前端框架

2009-07-15 13:48:26

Swing模型和渲染器
點贊
收藏

51CTO技術(shù)棧公眾號

欧美大片xxxx| 无码人妻丰满熟妇区毛片18| www日本高清视频| 激情久久一区| 亚洲色图校园春色| 久久久精品高清| 91白丝在线| 中文字幕欧美日本乱码一线二线| 91在线观看免费高清完整版在线观看| 久久婷婷一区二区| 精品久久久久久久久久久aⅴ| 欧美妇女性影城| 欧美精品久久久久久久久久久| 国产在线你懂得| 国产不卡免费视频| 国产精品wwww| 欧美日韩中文视频| 日韩精品免费一区二区在线观看| 日韩精品一区二区三区老鸭窝| 日本精品免费在线观看| 黄色网页网址在线免费| 26uuu精品一区二区在线观看| 国产欧洲精品视频| 天堂中文在线网| 欧美日韩综合| 日韩在线视频网站| 添女人荫蒂视频| 亚洲国产aⅴ精品一区二区| 一本大道久久精品懂色aⅴ| www.99riav| 日韩黄色影院| 国产欧美一区二区三区沐欲| 国产一区二区在线观看免费播放| 国产乱码精品一区二三区蜜臂 | 久久精品国产精品亚洲红杏| 久久久久一本一区二区青青蜜月| 亚洲熟女毛茸茸| 国产探花在线精品| 日韩不卡中文字幕| 日韩少妇一区二区| 婷婷综合国产| 欧美一级精品在线| 国产三级精品三级在线| 国产精品伦一区二区| 色呦呦网站一区| 日韩精品―中文字幕| 四虎影院观看视频在线观看| 中文字幕亚洲视频| 亚洲看片网站| 91欧美在线视频| 国产午夜精品久久久久久免费视| 久久国产精品一区二区三区四区| 亚洲精品国产精品乱码不卡| 国产精品99久久久久久似苏梦涵| 91久久精品美女| 国产麻豆一精品一男同| 精品一区二区在线视频| 成人a视频在线观看| 中文字幕一区二区在线视频| 日本vs亚洲vs韩国一区三区| 国产精品18久久久久久麻辣| 中文字幕 国产精品| 天堂资源在线中文精品| 日韩免费高清在线观看| 亚洲精品中文字幕乱码三区91| 一区二区动漫| 欧美壮男野外gaytube| 中文字幕激情小说| 久久久精品五月天| 国产91在线视频| 中文字幕精品一区二区精| 美腿丝袜亚洲一区| 91美女片黄在线观| www.污视频| 91在线免费视频观看| 欧美一区二区三区电影在线观看 | 久久久国产免费| 免费成人av资源网| 成人性生交大片免费看视频直播| 国产a级免费视频| 成人性视频免费网站| 国产区一区二区三区| 国内在线免费高清视频| 中文字幕一区二区三区四区| 永久免费在线看片视频| 97人人在线视频| 91久久精品国产91性色tv| av亚洲天堂网| 成人动态视频| 亚洲天堂日韩电影| 中文字幕亚洲欧美日韩| 亚洲区第一页| 国产精品一区二区三区毛片淫片| av观看在线免费| 91蜜桃免费观看视频| 亚洲午夜精品一区二区三区| 超清av在线| 欧美性做爰猛烈叫床潮| 日韩大尺度视频| 国产精品一区高清| 欧美国产日韩视频| 久久精品五月天| 国产成人三级在线观看| 欧美一区二视频在线免费观看| 日本在线观看网站| 欧美日韩精品二区| 免费观看黄网站| 欧美精品尤物在线观看| 久久久亚洲精选| 91极品身材尤物theporn| 97国产精品videossex| 91免费网站视频| 国产精品专区免费| 精品美女一区二区三区| 青青青视频在线免费观看| 亚洲毛片av| 92看片淫黄大片看国产片| 久热av在线| 午夜视频一区在线观看| 欧美视频亚洲图片| 欧美综合一区| 欧美在线激情网| 亚洲a视频在线| 中文字幕在线视频一区| www.日日操| 欧美有码在线| 欧美激情网友自拍| 国产美女www爽爽爽视频| 国产女人18毛片水真多成人如厕| 免费在线a视频| 给我免费播放日韩视频| 久久影视电视剧免费网站清宫辞电视| 日韩国产成人在线| 91理论电影在线观看| 久久精品国产sm调教网站演员| 国产日本亚洲| 久久色精品视频| 久久精品国产亚洲av麻豆蜜芽| 2021久久国产精品不只是精品| av在线观看地址| 亚洲综合网站| 欧美另类极品videosbestfree| 97成人在线观看| 国产精品乱码久久久久久| 欧美精品aaaa| 精品欧美久久| 国产精品电影一区| 超碰国产在线观看| 在线看国产一区| 亚洲区自拍偷拍| 日韩精品欧美成人高清一区二区| 久久99精品国产一区二区三区| 91视频欧美| 日韩电影第一页| 韩国av中文字幕| 97久久精品人人做人人爽| 九九九九免费视频| 天堂在线精品| 国产a∨精品一区二区三区不卡| 三级毛片在线免费看| 一本大道综合伊人精品热热| 国产综合精品久久久久成人av| 可以免费看不卡的av网站| 久久伦理网站| 日韩毛片在线| 日韩视频免费看| 精品国产乱码一区二区三| 亚洲一区自拍偷拍| 亚洲av片不卡无码久久| 石原莉奈在线亚洲三区| 一区二区免费在线视频| 国内不卡的一区二区三区中文字幕| 久久久久99精品久久久久| 精品人妻无码一区二区色欲产成人| 一级特黄大欧美久久久| 一起草在线视频| 日韩成人av影视| 超碰超碰超碰超碰超碰| 好吊妞视频这里有精品| 欧美性受xxx| 色开心亚洲综合| 精品国产乱码久久久久久久 | 超碰在线最新| 欧美精品一区二区三区四区| 亚洲午夜18毛片在线看| 国产精品情趣视频| 亚洲精品鲁一鲁一区二区三区| 99精品国产一区二区青青牛奶| 天天综合狠狠精品| 一区二区三区亚洲变态调教大结局 | 亚洲自拍偷拍网址| 精精国产xxxx视频在线播放| 在线观看91久久久久久| 性欧美8khd高清极品| 欧美日韩国产在线看| 看黄色录像一级片| 懂色av一区二区三区蜜臀| 91淫黄看大片| 激情欧美日韩| 亚洲第一综合| 久久免费视频66| 国产综合久久久久| 日本在线播放一二三区| 久久亚洲精品国产亚洲老地址| 熟妇人妻一区二区三区四区| 欧美日韩一区高清| 91久久国产视频| 亚洲欧洲国产专区| 亚洲女优在线观看| www.爱久久.com| 欧美国产日韩另类| 久久国产精品久久久久久电车| 精品少妇人妻av一区二区| 台湾佬综合网| 99免费在线视频观看| 欧美成a人片免费观看久久五月天| 国内精品免费午夜毛片| 国产黄色小视频在线| 亚洲欧洲一区二区三区在线观看 | 韩国一区二区在线观看| 丁香啪啪综合成人亚洲| 极品中文字幕一区| 懂色av粉嫩av蜜臀av| 欧美肉体xxxx裸体137大胆| 国产精品区二区三区日本| 9999精品免费视频| 国产精品久久久久久亚洲影视 | 国产精品看片资源| 九色porny自拍视频在线播放| 欧美成人在线免费视频| 日p在线观看| 伊人久久免费视频| 免费在线毛片| 日韩精品久久久久久久玫瑰园 | 成熟亚洲日本毛茸茸凸凹| 日本高清久久久| 免费成人在线视频观看| 成人黄色一区二区| 久久午夜精品| 50路60路老熟妇啪啪| 国产精品美女久久久| 日本在线xxx| 99精品福利视频| 丰满少妇久久久| 亚洲国产午夜| av免费观看大全| 国产精品综合色区在线观看| 91好吊色国产欧美日韩在线| aⅴ色国产欧美| 国产精品无码av在线播放| 亚洲国内欧美| 久久久久久久久久久视频| 国产精品毛片| 亚洲五月天综合| 三级欧美在线一区| 亚洲欧洲日本精品| 精品一二三四区| 人妻换人妻仑乱| 国产成人在线网站| 国产a级黄色片| 久久综合狠狠综合久久激情 | 国产ts变态重口人妖hd| 日韩欧美一区在线| 日韩专区第一页| 亚洲精选一区二区| av在线播放免费| 久久久久999| 国产桃色电影在线播放| 性色av一区二区三区| 美女一区网站| 国产精品久久二区| 91精品国产一区二区在线观看| 91免费观看| 乱亲女h秽乱长久久久| 热re99久久精品国99热蜜月| 91综合网人人| av在线观看地址| 日韩精品电影一区亚洲| 国内av一区二区| 不卡视频在线看| 极品久久久久久久| 夜夜亚洲天天久久| 四虎精品永久在线| 欧美剧情片在线观看| 成人高潮片免费视频| 亚洲美女黄色片| 国产鲁鲁视频在线观看特色| 国内精品久久久久久| 国产成人午夜性a一级毛片| 92看片淫黄大片看国产片| 日韩精品a在线观看91| 亚洲欧美电影在线观看| 在线成人av| 91小视频网站| a级精品国产片在线观看| 国产又大又粗又爽的毛片| 一区二区三区精品在线| 免费观看日批视频| 日韩一区二区在线观看视频| 青青草在线免费视频| 久久视频在线视频| 成人免费影院| www.成人三级视频| 成人在线电影在线观看视频| 在线观看18视频网站| 免费久久99精品国产自在现线| 国产成年人视频网站| 91久色porny| 欧美精品久久久久久久久46p| 黑人欧美xxxx| 狠狠综合久久av一区二区| 中文字幕国产亚洲| 亚洲人成午夜免电影费观看| 97久久人人超碰caoprom欧美 | 亚洲欧美中文日韩在线v日本| av中文字幕在线播放| 国产精品扒开腿做爽爽爽男男| 中文一区二区三区四区| 美国av在线播放| 蜜臀91精品一区二区三区| 菠萝菠萝蜜网站| 亚洲国产欧美在线| 国产情侣在线播放| 自拍偷拍亚洲欧美| xxxxxx欧美| 精品久久久三级| 亚洲视频观看| 91网址在线观看精品| 中文字幕一区二区三区精华液| 日本免费在线观看视频| 亚洲成人教育av| 成人免费高清观看| www.成人av.com| 欧美日韩综合| 无码人妻一区二区三区精品视频| 国产精品麻豆99久久久久久| 少妇又紧又色又爽又刺激视频| 精品中文视频在线| 狼人综合视频| 久久av一区二区三区漫画| 亚洲乱码久久| 波多野结衣一二三区| 亚洲成人自拍网| 亚洲男女视频在线观看| 欧美国产中文字幕| jizz18欧美18| 日本精品久久久久久久久久| 国产成人av福利| 国产一级二级三级| 精品区一区二区| sm在线播放| 久久国产精品久久精品国产| 久久av一区二区三区| 极品粉嫩小仙女高潮喷水久久| 精品高清一区二区三区| 亚洲av成人无码网天堂| 日本成人在线视频网址| 国产九一精品| www.com操| 亚洲视频在线一区观看| 精品国产无码一区二区三区| 色中色综合影院手机版在线观看| 99香蕉久久| 欧美 日本 亚洲| 久久精品亚洲精品国产欧美kt∨| 久久精品五月天| 中文字幕亚洲欧美在线| 电影91久久久| 女人帮男人橹视频播放| 99re亚洲国产精品| 午夜一区二区三区四区| 久久久精品久久| 国产精品videossex| 日日橹狠狠爱欧美超碰| 国产日本欧美一区二区| 国产又粗又大又爽| 久久久噜噜噜久噜久久| 亚洲综合图色| 黄色片视频在线| 亚洲成人在线免费| 黄色的视频在线免费观看| 成人精品久久一区二区三区| 在线不卡欧美| 精品熟妇无码av免费久久| 日韩色视频在线观看| 天堂电影一区| 99热一区二区三区| www.66久久| 一起草av在线| 91精品国产色综合久久不卡98| 成人高清av| 久久久久亚洲AV成人网人人小说| 91久久精品国产91性色tv| 天堂亚洲精品| 日韩高清国产一区在线观看| 国产黄色精品网站| 97人妻一区二区精品视频| 久久97久久97精品免视看| 欧洲grand老妇人| 亚洲少妇一区二区三区|