vue學(xué)習(xí)篇4之模板解析與虛擬DOM

模板解析
模板:就是html嵌套js代碼,js代碼以兩種形式存在于頁(yè)面里浅浮,指令屬性和表達(dá)式
模板解析大括號(hào)表達(dá)式{{}}的基本流程:
1沫浆、將el的所有子節(jié)點(diǎn)取出,添加到一個(gè)新建的文檔fragement對(duì)象中滚秩。
2专执、對(duì)fragement中的所有層次子節(jié)點(diǎn)遞歸進(jìn)行編譯解析處理。
3叔遂、通過(guò)nodeType判斷節(jié)點(diǎn)是元素節(jié)點(diǎn)還是文本節(jié)點(diǎn)
4他炊、如果是元素節(jié)點(diǎn)根據(jù)正則表達(dá)式得到匹配出的表達(dá)式字符串。/{{(.+?)}}/g
5已艰、從data中取出表達(dá)式對(duì)應(yīng)的屬性值
6痊末、將屬性值設(shè)置為文本節(jié)點(diǎn)的textContent
7、將解析后的fragement添加到el中

虛擬DOM
為什么要使用虛擬DOM哩掺?
因?yàn)樘岣咝阅茉涞H绻苯釉陧?yè)面當(dāng)中去操作DOM頁(yè)面要不斷的更新,很消耗性能嚼吞,使用虛擬DOM所有的操作都在內(nèi)存里面盒件,只需要虛擬DOM的處理完成了更新到頁(yè)面上只用更新一次。
虛擬DOM是一個(gè)對(duì)象
1舱禽、怎么將真正的DOM轉(zhuǎn)換為虛擬DOM炒刁?

<div id="root">
  <div>hello</div>
</div>

<script>
  class VNode {
    constructor(tag, data, value, type){
      this.tag = tag && tag.toLowerCase()
      this.data = data
      this.value = value
      this.type = type
      this.children = []
    }
    appendChild (vnode) {
      this.children.push(vnode)
    }
  }
  //使用遞歸來(lái)遍歷DOM元素,生成虛擬DOM
  function getVNode(node) {
    let nodeType = node.nodeType
    let _vnode = null
    if (nodeType === 1) { //元素
      let nodeName = node.nodeName
      let attrs = node.attributes
      let _attrsObj = {}
      for (let i = 0; i < attrs.length; i++) {  //attrs[i]屬性節(jié)點(diǎn)  (nodeType===2)
        _attrsObj[attrs[i].nodeName] = attrs[i].nodeValue
      }
      _vnode = new VNode(nodeNamw, _attrsObj, undefined, nodeType)

      //考慮node的子元素
      let childNodes = node.childNodes
      for (let i = 0; i < childNodes .length; i++) {
        _vnode.appendChild (getVNode(childNodes [i]))  //遞歸
      }
    } else if (nodeType === 3) {
      _vnode = new VNode(undefined, undefined, node.nodeValue, nodeType)
    }
    return _vnode
  }

let root = document.querySelector('#root')
let vroot = getVNode(root)
console.log(vroot) 
</script>

2誊稚、怎么將虛擬DOM轉(zhuǎn)換為真正的DOM翔始?

function parseVNode (vnode) {
  //創(chuàng)建真實(shí)的DOM
  let type= vnode.type
  let _node = null
  if (type === 3) {
    return document.createTextNode(vnode.value)  //創(chuàng)建文本節(jié)點(diǎn)
  } else if (type === 1) {
    _node = document.createElement(vnode.tag)
    //處理屬性
    let data = vnode.data
    Object.keys(data).forEach(key => {
      let attrName = key
      let attrValue = data[key]
      _node.setAttribute(attrName ,attrValue)
    })
    //處理子元素
    let children = vnode.children
    children .forEach(subnode => {
      _node.appendChild (parseVNode(subnode ))  //遞歸轉(zhuǎn)換子元素 (是一個(gè)虛擬DOM)
    })
    return _node
  }
}

let dom2 = parseVNode(vroot)
console.log(dom2)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市里伯,隨后出現(xiàn)的幾起案子城瞎,更是在濱河造成了極大的恐慌,老刑警劉巖疾瓮,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脖镀,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡狼电,警方通過(guò)查閱死者的電腦和手機(jī)蜒灰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)肩碟,“玉大人卷员,你說(shuō)我怎么就攤上這事√谖瘢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵削饵,是天一觀的道長(zhǎng)岩瘦。 經(jīng)常有香客問(wèn)我未巫,道長(zhǎng),這世上最難降的妖魔是什么启昧? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任叙凡,我火速辦了婚禮,結(jié)果婚禮上密末,老公的妹妹穿的比我還像新娘握爷。我一直安慰自己,他們只是感情好严里,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布新啼。 她就那樣靜靜地躺著,像睡著了一般刹碾。 火紅的嫁衣襯著肌膚如雪燥撞。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,394評(píng)論 1 310
  • 那天迷帜,我揣著相機(jī)與錄音物舒,去河邊找鬼。 笑死戏锹,一個(gè)胖子當(dāng)著我的面吹牛冠胯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锦针,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼荠察,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了伞插?” 一聲冷哼從身側(cè)響起割粮,我...
    開(kāi)封第一講書(shū)人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎媚污,沒(méi)想到半個(gè)月后舀瓢,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耗美,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年京髓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片商架。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡堰怨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蛇摸,到底是詐尸還是另有隱情备图,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站揽涮,受9級(jí)特大地震影響抠藕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蒋困,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一盾似、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧雪标,春花似錦零院、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至烹困,卻和暖如春玄妈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背髓梅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工拟蜻, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人枯饿。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓酝锅,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親奢方。 傳聞我的和親對(duì)象是個(gè)殘疾皇子搔扁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359