基于Vue的虚拟Dom实现 手动实现虚拟Dom和真实Dom互相转换
1.真实Dom生成虚拟Dom
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)
}
}
function createVnode(node) {
const nodeType = node.nodeType
let _vnode = null
if (nodeType === 1) {
const tagName = node.nodeName
const attrList = node.attributes;
const attrData = {}
for (let i = 0; i < attrList.length; i++) {
attrData[attrList[i].nodeName] = attrList[i].nodeValue
}
_vnode = new Vnode(tagName, attrData, undefined, nodeType)
const childNodes = node.childNodes
for (let i = 0; i < childNodes.length; i++) {
_vnode.appendChild(createVnode(childNodes[i]))
}
} else if (nodeType === 3) {
_vnode = new Vnode(undefined, undefined, node.nodeValue, nodeType)
}
return _vnode
}
2.虚拟Dom生成转为真实Dom
function getRealNode(vnode) {
const { tag, data, value, type, children } = vnode
let _node = null
if (type === 1) {
_node = document.createElement(tag)
for (let key in data) {
_node.setAttribute(key, data[key])
}
for (let i = 0; i < children.length; i++) {
_node.appendChild(getRealNode(children[i]))
}
} else if (type === 3) {
_node = document.createTextNode(value)
}
return _node
}