国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Vue.js設計與實現之Vue.js3的設計思路

開發 架構
本文中,我們了解到Vue.js框架是通過聲明式描述UI的,而描述UI又有兩種形式:模板字符串和手寫虛擬DOM的形式,虛擬DOM形式比模板字符串更加靈活,但是模板字符串比虛擬DOM形式更加直觀。

1.寫在前面

本文將立足于全局視角去了解Vue.js3的設計思路、工作機制以及一些重要的獨立組成部分,了解他們之間是如何相互獨立、又相互配合的。了解描述UI的兩種形式:模板字符串和虛擬DOM,Vue.js框架的兩個重要組成部分:編譯器和渲染器。

2.聲明式描述UI

通過前面的介紹,我們知道Vue.js3是聲明式UI框架,作者是如何參與設計一個聲明式的UI框架,編寫前端頁面又涉及到哪些內容?

  • DOM元素
  • 屬性
  • 事件
  • 元素的層級結構

上面這些內容是原生包含的,進行框架設計時如何讓它們變成響應式的,在Vue.js3中的解決方案是:

  • 與原生html標簽一樣的描述DOM元素和屬性、層級結構等 <div id="app"><span>onechuan</span></div>
  • 使用:或v-bind來描述動態綁定的屬性,使用@或v-on描述事件 <div id="app" :name="name" @click="handleClick">onechuan</div>

這樣,使用者不需要手寫任何命令式代碼,就可以實現聲明式描述UI。當然除了使用模板形式描述UI外,還能使用JS對象來描述:

const element = {
//標簽元素
tag: "div",
//標簽屬性
props:{
onClick: handleClick
},
//子節點
children: [
{ tag:"span" }
]
}

對應的template模板是:

<div @click="handleClick"><span></span></div>

使用js數據對象描述和template模板有什么異同呢?

//h標簽的限制
const level = 3;
const element = {
tag: `h${level}`,//h3標簽
}

我們看到對于js對象結構代碼簡潔清晰,而使用模板則需要進行窮舉:

<h1 v-if="level === 1"></h1>
<h2 v-else-if="level === 2"></h2>
<h3 v-else-if="level === 3"></h1>
<h4 v-else-if="level === 4"></h1>
<h5 v-else-if="level === 5"></h1>
<h6 v-else-if="level === 6"></h1>

我們在Vue.js組件中通過手寫渲染函數就是使用虛擬DOM來描述UI,h函數的返回值就是一個對象,用于開發者輕松地使用虛擬DOM描述UI。

import {h} from "vue";

export default {
render(){
return h("div",{ onClick: handleClick })//虛擬DOM
}
}

對應的JS對象描述UI就是如下代碼段:

export default {
render(){
return {
tag:"div",
props:{onClick: handleClick }
}
}
}

組件的渲染函數renderer的作用:Vue.js根據組件的render函數的返回值生成虛擬DOM,進而將組件內容進行渲染到頁面。

3.初識渲染器

我們可以使用JS數據對象來描述虛擬DOM,那么虛擬DOM又是如何通過渲染函數轉為真實DOM后,渲染到頁面的呢?

在前面的代碼片段中是使用JS數據對象來描述虛擬DOM:

const vnode = {
tag:"div",
props:{
onclick:()=>console.log("hello pingping")
},
children:"please click me"
}

我們需要編寫渲染函數renderer去將虛擬DOM渲染為真實DOM,接收兩個參數:vnode虛擬DOM對象以及container真實DOM元素掛載點,container用于掛載渲染函數渲染的真實DOM元素。

function renderer(vnode, container){
// 使用vnode的tag作為標簽名渲染DOM元素
const el = document.createElement(vnode.tag)
// 遍歷vnode的props作為DOM元素的屬性和事件
for(const key in vnode.props){
if(/^on/.test(key)){
// 如果key以on開頭,這說明他是一個事件
el.addEventListener(
key.substring(2).toLowerCase(),//事件名稱將onClick-->click
vnode.props[key]//事件處理函數
)
}
}

// 處理children
if(typeof vnode.children === "string"){
// 如果是字符串,直接作為元素的文本子節點
el.appendChild(document.createTextNode(vnode.children))
}else if(Array.isArray(vnode.children)){
// 遞歸調用renderer函數進行渲染子節點,使用當前元素el作為掛載點
vnode.children.forEach(child=>renderer(child,el))
}
// 將元素添加到掛載點
container.appendChild(el)
}

調用:

renderer(vnode, document.body)

點擊按鈕后:

渲染器renderer的實現思路:

  • 創建元素
  • 給元素添加屬性和事件
  • 遞歸遍歷children創建節點

4.組件的本質

組件是一組DOM元素的封裝,而這組DOM元素就是組件渲染的內容,對此可以定義函數來描述這段真實DOM元素對應的虛擬DOM對象。

const MyComponent = function(){
return {
tag:"div",
props:{
onClick: ()=>console.log("hello world")
},
children:"click me"
}
}

通過虛擬DOM對象中tag屬性可以用于存儲組件函數,將其作為標簽類型進行渲染,同樣的也需要渲染器renderer函數。當然,此時的渲染函數需要根據待渲染標簽的類型進行判定,是普通標簽元素還是組件元素。

const vnode = {
tag: MyComponent
}

renderer(vnode, document.body)

function renderer(vnode, container){
// 判斷是標簽元素還是組件
if(typeof vnode.tag === "string"){
// 如果是字符串,直接作為元素的標簽元素
mountElement(vnode, container)
}else{
mountComponent(vnode, container)
}
}

// 渲染元素
function mountElement(vnode, container){
// 使用vnode.tag 作為標簽名稱創建DOM元素
const el = document.createElement(vnode.tag)
// 遍歷vnode的props作為DOM元素的屬性和事件
for(const key in vnode.props){
if(/^on/.test(key)){
// 如果key以on開頭,這說明他是一個事件
el.addEventListener(
key.substring(2).toLowerCase(),//事件名稱將onClick-->click
vnode.props[key]//事件處理函數
)
}
}

// 處理children
if(typeof vnode.children === "string"){
// 如果是字符串,直接作為元素的文本子節點
el.appendChild(document.createTextNode(vnode.children))
}else if(Array.isArray(vnode.children)){
// 遞歸調用renderer函數進行渲染子節點,使用當前元素el作為掛載點
vnode.children.forEach(child=>renderer(child,el))
}
// 將元素添加到掛載點
container.appendChild(el)
}

// 渲染組件
function mountComponent(vnode, container){
// 調用組件函數,獲取組件要渲染的內容-虛擬DOM
const subtree = vnode.tag()
// 遞歸調用renderer渲染subtree
renderer(subtree, container)
}

5.模板的工作原理

其實,手寫虛擬DOM還是使用模板形式,都可以聲明式描述UI,在Vue.js框架設計中是始終支持兩種形式的。我們知道JS對象描述虛擬DOM的形式,是通過渲染器renderer將虛擬DOM轉為真實DOM的,那么模板又是如何渲染到頁面的呢?

<div @click="handleClick">
hello pingping
</div>
模板字符串渲染到頁面,依賴于

模板字符串渲染到頁面,依賴于Vue.js框架的一個重要函數--編譯器compiler,其作用就是將模板字符串編譯成與之功能對應的渲染函數:

render(){
return h("div",{onClick: handleClick},"hello pingping")
}

對此,我們知道無論是使用模板字符串還是直接手寫渲染函數,都是通過渲染函數將虛擬DOM轉為真實DOM,最終將描述的內容渲染到頁面上。只不過使用模板字符串多了一個編譯過程,需要通過編譯器將模板字符串編譯成渲染函數。

6.編譯器和渲染器組成有機整體

在Vue.js框架設計中,組件實現依賴于渲染器和編譯器,而渲染器和編譯器之間是彼此獨立又相互依賴的重要部分。

7.寫在后面

本文中,我們了解到Vue.js框架是通過聲明式描述UI的,而描述UI又有兩種形式:模板字符串和手寫虛擬DOM的形式,虛擬DOM形式比模板字符串更加靈活,但是模板字符串比虛擬DOM形式更加直觀。

在Vue.js框架設計中有兩種重要的組成部分:編譯器和渲染器,編譯器就是將模板字符串編譯成渲染函數,而渲染器則是將虛擬DOM創建為真實DOM,最終完成頁面的渲染。

責任編輯:武曉燕 來源: 前端一碼平川
相關推薦

2022-04-01 08:08:27

Vue.js框架命令式

2022-04-25 07:36:21

組件數據函數

2022-04-12 08:08:57

watch函數options封裝

2022-04-18 08:09:44

渲染器DOM掛載Vue.js

2022-04-14 09:35:03

Vue.js設計Reflect

2022-04-11 08:03:30

Vue.jscomputed計算屬性

2022-04-05 16:44:59

系統Vue.js響應式

2022-04-03 15:44:55

Vue.js框架設計設計與實現

2022-05-03 21:18:38

Vue.js組件KeepAlive

2022-04-09 17:53:56

Vue.js分支切換嵌套的effect

2022-04-17 09:18:11

響應式數據Vue.js

2022-04-26 05:55:06

Vue.js異步組件

2022-04-16 13:59:34

Vue.jsJavascript

2022-04-20 09:07:04

Vue.js的事件處理

2016-11-01 19:10:33

vue.js前端前端框架

2022-04-19 23:01:54

Vue.jsDOM節點DOM樹

2019-04-01 19:38:28

Vue.jsJavascript前端

2018-04-04 10:32:13

前端JavascriptVue.js

2016-11-04 19:58:39

vue.js

2017-07-04 17:55:37

Vue.js插件開發
點贊
收藏

51CTO技術棧公眾號

欧美综合77777色婷婷| 日本成人网址| 中文一区在线| 97国产精品免费视频| 成全电影大全在线观看| 在线观看视频欧美| 99re6热在线精品视频播放| 日韩最新中文字幕| 色无极亚洲影院| 欧美激情精品久久久| 九七电影院97理论片久久tvb| 欧美大胆人体bbbb| 国产精品刘玥久久一区| 欧美日韩一区小说| youjizz在线播放| 黄色成人91| 久久av高潮av| 妞干网在线观看视频| 一级视频在线观看| 国产精品久久免费看| 国产欧美日韩网站| 国产寡妇亲子伦一区二区| 亚洲一区二区在线看| 日本久久91av| 视频一区欧美日韩| 91麻豆国产精品| 日韩电影免费网址| 日本免费一区二区三区视频观看| 亚洲a级在线观看| 亚洲啊v在线观看| 国产91富婆露脸刺激对白| 先锋影音一区二区三区| 美女视频黄 久久| 国产精品亚洲天堂| 成人免费黄色在线| 精品国产一二三四区| 99久久免费视频.com| 国产日产欧美视频| 欧美激情一区在线观看| 免费人成短视频在线观看网站| 国产在线观看91一区二区三区| 欧美在线观看日本一区| 国产精品久久久久久久| 国产三级精品在线不卡| 日韩精品亚洲专区| 天天干天天色天天爽| 成人动漫一区二区在线| 免费一级特黄录像| 一级精品视频在线观看宜春院| 在线观看的av网站| 日韩免费高清视频| 不卡亚洲精品| 国产精品88a∨| 99在线精品免费视频九九视| 99久re热视频精品98| 国产精品色呦呦| 成人全视频高清免费观看| 亚洲女同性videos| 欧美激情极品| 麻豆久久久9性大片| 久久先锋影音av| 欧美孕妇孕交| 亚洲天堂一区二区三区| 免费看成人哺乳视频网站| 国产精品播放| 91尤物视频在线观看| 日本亚洲一区| 中文字幕日本欧美| 清纯唯美综合亚洲| 国产精品无码乱伦| 一区二区三区在线免费播放| 99精品老司机免费视频| www.xxxx精品| 亚洲精品影视| 手机看片一级片| 六月婷婷色综合| www.91av| 亚洲第一精品夜夜躁人人爽| 亚洲成aⅴ人片久久青草影院| 欧洲精品国产| 亚洲免费在线看| 黄色漫画在线免费看| 国产成人精品网站| 国内成+人亚洲+欧美+综合在线 | 麻豆精品蜜桃| 国产91精品久久久久久| 亚洲理伦在线| 四虎永久在线精品无码视频| 色天使色偷偷av一区二区| 在线日韩三级| 欧美在线一区二区三区四区| 1区2区3区欧美| sis001欧美| av日韩免费电影| 国产亚洲成年网址在线观看| av在线免费播放| 国产精品久久久久久久久久| 国内不卡的一区二区三区中文字幕| 亚洲va男人天堂| 久久久久久久久99精品| 久久亚洲中文字幕无码| 午夜久久久久久| 亚洲免费一区| 亚洲欧美日韩国产成人综合一二三区| 亚洲福利一区二区三区| av国产精品| 热这里只有精品| 欧美日本在线看| 视频在线不卡免费观看| 午夜免费一区二区| 亚洲色图18p| 日韩不卡一二三区| 日本在线免费中文字幕| 国产日韩av在线播放| 亚洲欧洲国产日韩| 国产精品日韩精品在线播放| 久久精品久久久久| 老司机一区二区三区| 三级在线观看| 国产不卡av在线免费观看| 久久久综合视频| 亚洲福利影院| 亚欧精品在线| 3d动漫精品啪啪| 欧美在线三区| 一级片免费在线| 国产精品美女www| 欧美日韩国产探花| 天天噜天天色| 538国产精品视频一区二区| 丁香五精品蜜臀久久久久99网站| 精品精品导航| 亚洲国产精品视频一区| 日韩欧美视频一区| 国产精品一区毛片| 精品欧美色视频网站在线观看| 亚洲一区二区中文| 色呦呦国产精品| 久久久久美女| 国产三级在线观看| 国语精品中文字幕| 欧美巨大另类极品videosbest| 黄视频在线免费看| 日韩国产欧美精品| 亚洲成人精品在线| 精品系列免费在线观看| 中文av在线全新| www..com日韩| 欧美肥老妇视频| 亚洲天堂成人网| 欧美久久精品一级c片| 激情视频免费观看在线| 亚洲aaa激情| 欧美人妇做爰xxxⅹ性高电影| 日韩电影一二三区| 亚洲日本在线观看视频| 欧美牲交a欧美牲交| 98精品在线视频| 亚洲成人午夜影院| 国产日本精品| 在线天堂新版最新版在线8| 波多野结衣家庭教师在线播放| 97精品久久久| 色综合天天综合色综合av| 亚洲国产美女| 欧美日韩精品免费观看视完整| 欧美视频第三页| 国产自摸综合网| 亚洲精品在线电影| 久久九九全国免费| 香蕉久久网站| 免费v片在线观看| 激情综合网五月激情| 成人91视频| 一区二区福利视频| 亚洲一区二区五区| 麻豆精品一二三| 激情视频极品美女日韩| 黄色片在线播放| 黄色特一级视频| 国产盗摄xxxx视频xxx69| 欧美电影影音先锋| www.欧美日韩国产在线| 日韩欧美视频在线播放| www成人免费观看| 国产字幕中文| 性欧美精品一区二区三区在线播放| 久久国产精品电影| 欧美午夜理伦三级在线观看| 成人av在线看| 欧美日韩a区| 欧美日韩亚洲国产| 男男激情在线| 成人黄色av片| 99精品在线直播| 欧美成人免费播放| 欧美日韩大陆在线| 国产欧美日本一区视频| 视频一区免费在线观看| 亚洲伊人春色|