目录引言虚拟dom的介绍虚拟dom转换真实dom总结引言 经常使用Vue或React的小伙伴肯定对虚拟dom这个词不陌生,虚拟dom的设计是推进前端框架发展的一大变革。今天带大
经常使用Vue或React的小伙伴肯定对虚拟dom这个词不陌生,虚拟dom的设计是推进前端框架发展的一大变革。今天带大家简单模拟下虚拟dom转换真实dom的js设计。废话不说了,上车吧。
介绍
虚拟dom本质是一段js代码,用来模拟dom树的结果。
如下是对一段虚拟dom模拟真实dom的例子
真实dom
<div class="box">
<p name="dog">xiao ming</p>
</div>
虚拟dom
let vnode = {
tag:"div",
attrs:{
class:["box"]
},
childrens:[
{
tag:"p",
attrs:{
name:"dog"
},
childrens:[
{
tag:'text',
content:"xiao ming"
}
]
}
]
}
优势
缺点
页面有大量dom时,性能可能没有原生dom效率高。(原因:虚拟dom本质还是用js描述dom树,所以当页面dom比较多时,js操作与diff算法需要耗费额外的性能较大)
终于来到了今天的主角,通过设计虚拟dom转换真实dom的过程,可以更加清晰其工作原理和设计过程,同时也能让各位在面试中如鱼得水,码上拈来。
const vnode = {
tag: 'DIV',
attrs: {
id: 'app'
},
children: [{
tag: 'SPAN',
children: [{
tag: 'A',
children: []
}]
},
{
tag: 'SPAN',
children: [{
tag: 'A',
children: []
},
{
tag: 'A',
children: []
}
]
}
]
}
function render(vnode) {
//核心递归函数
const main = (node,parent=null) => {
let ele
ele = document.createElement(node.tag.toLowerCase())
//添加属性
if(node.attrs) {
for(let key in node.attrs) {
ele.setAttribute(key,node.attrs[key])
}
}
//添加孩子,递归
if(node.children && node.children.length) {
for(let val of node.children) {
main(val,ele)
}
}
if(parent) {
parent.appendChild(ele)
}else{
parent = ele
}
return parent
}
let dom = main(vnode)
return dom
}
render(vnode)
效果
以上是我对虚拟dom的简单总结和虚拟dom转换方法的设计,更多关于JS模拟虚拟dom转真实dom的资料请关注编程网其它相关文章!
--结束END--
本文标题: JS前端开发模拟虚拟dom转真实dom详解
本文链接: https://www.lsjlt.com/news/177262.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-01-12
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0