javascript --- > 将DOM结构转换成虚拟DOM && 虚拟DOM转换成真实的DOM结构

本文介绍了虚拟DOM的实现,探讨了为何使用虚拟DOM以减少DOM的回流与重绘。内容包括将DOM结构转化为对象存储在内存中,详细阐述了虚拟DOM的数据结构,以及如何通过算法判断元素类型创建相应的虚拟DOM节点。同时,文章还讨论了如何将虚拟DOM转换回真实的DOM结构,涉及到文本节点和元素节点的创建、属性设置及子节点的添加。
摘要由CSDN通过智能技术生成

虚拟DOM的实现

使用虚拟DOM的原因: 减少回流与重绘

将DOM结构转换成对象保存到内存中

<img /> => { tag: 'img'}

文本节点 => { tag: undefined, value: '文本节点' }

<img title="1" class="c" /> => { tag: 'img', data: { title = "1", class="c" } }

<div><img /></div> => { tag: 'div', children: [{ tag: 'div' }]}

根据上面可以写出虚拟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)
    }
}

可能用到的基础知识

  • 判断元素的节点类型: node.nodeType
let nodeType = node.nodeType
if(nodeType == 1) {
    // 元素类型
} else if (nodeType == 3) {
	// 节点类型
}
  • 获取元素类型的标签名和属性 && 属性中具体的键值对,保存在一个对象中
let nodeName = node.nodeName	// 标签名
let attrs  = node.attributes	// 属性
let _attrObj = {
   }	// 保存各个具体的属性的键值对,相当于虚拟DOM中的data属性
for(let i =0, len = attrs.length; i< len; i++){
   
    _attrObj[attrs[i].nodeName] = attrs[i].nodeValue
}
  • 获取当前节点的子节点
let childNodes = node.childNodes
for(let i = 0, len = childNodes.length; i < len; i++){
   
    console.log(childNodes[i])
}

算法思路</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值