vdom的实现
背景
1. 纯js比操作DOM快很多很多
2. 由于前后端分离,导致前端会更频繁的操作DOM
3. MVVM框架的流行

思路
所有对DOM的操作转化为对js对象的操作
通过diff计算出对DOM操作的最小集
进而更新DOM
VDOM实际上就是一个js对象
创建html对象
function Element (tagName, props, children) {
this.tagName = tagName
this.props = props
this.children = children
}
Element.prototype.render = function () {
var el = document.createElement(this.tagName) // 根据tagName构建
var props = this.props
for (var propName in props) { // 设置节点的DOM属性
var propValue = props[propName]
el.setAttribute(propName, propValue)
}
var children = this.children || []
children.forEach(function (child) {
var childEl = (child instanceof Element)
? child.render() // 如果子节点也是虚拟DOM,递归构建DOM节点
: document.createTextNode(child) // 如果字符串,只构建文本节点
el.appendChild(childEl)
})
return el
}
使用Element
var el = function(tagName, props, children){
return new Element (tagName, props, children);
}
var ul = new el('ul', {id: 'list'}, [
el('li', {class: 'item'}, ['Item 1']),
el('li', {class: 'item'}, ['Item 2']),
el('li', {class: 'item'}, ['Item 3'])
])
var ulRoot = ul.render()
document.querySelector('#container').appendChild(ulRoot)

vdom
By Joson Chen
vdom
- 596