1、大致思路
获取#app根节点,创建VNode类用于创建虚拟DOM,创建vDom函数,用于生成虚拟DOM对象。根据元素的 nodeType 判断类型,对真实DOM的参数进行处理创建虚拟DOM。对每个元素的 childNodes 进行遍历,递归的进行 vDom 的创建。
2、代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| class Vue { constructor(option) { this.obj = document.querySelector(option.el) let AST = vDom(this.obj) console.log(AST) } }
class VNode { constructor(option) { Object.assign(this, option) this.children = [] } appendChild(node) { this.children.push(node) } }
function vDom(node) { let nodeType = node.nodeType let _vnode = null if (nodeType === 1) { let props = node.attributes
let property = {} for (let i = 0; i < props.length; i++) { property[props[i].name] = props[i].nodeValue }
_vnode = new VNode({ tagName: node.nodeName, props: property, type: nodeType })
let children = node.childNodes for (let i = 0; i < children.length; i++) { if (children[i].nodeType === 1 || children[i].length > 1) { _vnode.appendChild(vDom(children[i])) } } } else if (nodeType === 3) { _vnode = new VNode({ type: nodeType, value: node.nodeValue.trim() }) } return _vnode }
new Vue({ el: '#app', data: {} })
|