虛擬dom

vue和react都有用到虛擬dom。虛擬dom有什麼用?先來看下dom元素,dom是很慢的,咱們能夠把dom元素裏面的全部屬性都打印出來看下vue

能夠看到,一個元素就有幾百個屬性,這還僅僅是一個而已,真正的dom結構是很是龐大的,由於他們就是這麼規定的,因此操做dom時要當心再當心,有時候操做不當可能就會成爲殺死性能的罪魁禍首。這也是爲何咱們常常說操做dom耗性能,不要常常操做dom結構的緣由。react

相對於dom結構,用js對象結構處理是很是快的,dom樹上的結構,屬性,子節點都是能夠經過js表示的。app

var element = {
  tagName: 'ul', // 節點標籤名
  props: { // DOM的屬性,用一個對象存儲鍵值對
    id: 'list'
  },
  children: [ // 該節點的子節點
    {tagName: 'li', props: {class: 'item'}, children: ["Item 1"]},
    {tagName: 'li', props: {class: 'item'}, children: ["Item 2"]},
    {tagName: 'li', props: {class: 'item'}, children: ["Item 3"]},
  ]
}

既然能夠用js對象結構來表示dom樹,那麼就能夠根據js對象結構來構建一個dom樹。dom

下面來簡單說一下虛擬dom的實現原理性能

1.用js對象結構構建一個虛擬domspa

2.根據虛擬dom生成真實的domcode

3.dom上有狀態變化的時候,生成一個新的虛擬dom對象

4.比較兩個虛擬dom的差別blog

5.把差別應用到真正的dom上element

做者:戴嘉華
連接:https://www.zhihu.com/question/29504639/answer/73607810
來源:知乎
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。

// 1. 構建虛擬DOM
var tree = el('div', {'id': 'container'}, [
    el('h1', {style: 'color: blue'}, ['simple virtal dom']),
    el('p', ['Hello, virtual-dom']),
    el('ul', [el('li')])
])

// 2. 經過虛擬DOM構建真正的DOM
var root = tree.render()
document.body.appendChild(root)

// 3. 生成新的虛擬DOM
var newTree = el('div', {'id': 'container'}, [
    el('h1', {style: 'color: red'}, ['simple virtal dom']),
    el('p', ['Hello, virtual-dom']),
    el('ul', [el('li'), el('li')])
])

// 4. 比較兩棵虛擬DOM樹的不一樣
var patches = diff(tree, newTree)

// 5. 在真正的DOM元素上應用變動
patch(root, patches)
相關文章
相關標籤/搜索