虚拟dom与diff算法

博客介绍了虚拟DOM(vdom)与diff算法。为减少DOM操作、提高性能,前端引入vdom,它是模拟真实DOM节点结构的Object对象模型。还提到结合javascript和xml产生的jsx语法糖可模拟vdom。diff算法用于比较两个vdom差异,生成patch补丁对象,应用于虚拟DOM可提高渲染效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虚拟dom与diff算法

以下为自己总结内容,欢迎其他程序员小伙伴一起交流谈论!

1、概念引入

  • 大量的dom操作会使性能降低,而且花费的时间更多,为此,为了减少dom操作,提高性能,我们应该先操作数据,再去操作dom,因此,前端引入了虚拟dom,即vdom
  • Vue是一种MVVM框架,Vue高性能的原因之一就是vdom

2、什么是虚拟dom(vdom)

  • 它是一个Object对象模型,用来模拟真实dom节点的结构

  • 问题:vdom如何模拟真实dom?这里有个需求:将来我想在div中增加一个li,里面的内容为 : hello

一般代码操作示例:

<div class = "box">
	<ul>
		<li> 你好 </li>
	</ul>
</div>
var list = document.querySelector( '.list' )
var li = document.createElement( 'LI' )
li.innerHTML = ' hello '
list.appendChild( li )
  • vdom解决问题的代码操作使用流程

1、获取数据

var data = {
    id: 1,
    name: '你好'
}

2、创建vdom

var vdom = {
      tag: 'div',
      attr: {
        className: 'box'
      },
      content: [
        {
          tag: 'ul',
          content: [
            {
              tag: 'li',
              content: data.name
            }
          ]
        }
      ]
    }

3、初次渲染 vdom(将vdom渲染成真是dom)

var div = document.createElement('DIV')
div.className = 'box'
var ul = document.createElement('UL')
var li = document.createElement('LI')

**产生的问题:**因为我们的网页结构是很复杂的,我们使用上述vdom方法去模拟dom结构,发现vdom这个对象模型会写很多,代码极其冗余,所以想如果能在js中书写dom标签结构就方便许多,所以结合了javascript + xml 弄出来了新的语法糖 jsx ,使用 jsx 来模拟 vdom

如下:

<div class = "box">
	<ul>
		<li> {{ data.name }} </li>
	</ul>
</div>

使用 jsx 模拟 vdom

1、获取数据

var data = {
    id: 1,
    name: '李四'
}

2、创建dom

<div class = "box">
	<ul>
		<li> {{ data.name }} </li>
	</ul>
</div>

3、通过render函数解析jsx,将其转换成vdom结构

var vdom = {
      tag: 'div',
      attr: {
        className: 'box'
      },
      content: [
        {
          tag: 'ul',
          content: [
            {
              tag: 'li',
              content: data.name
            }
          ]
        }
      ]
    }

4、将vdom渲染成真是dom

使用render函数

5、数据更改

data.name = '张三'
    vdom = {
      tag: 'div',
      attr: {
        className: 'box'
      },
      content: [
        {
          tag: 'ul',
          content: [
            {
              tag: 'li',
              content: data.name   //这里的data.name修改了
            }
          ]
        }
      ]
    

6、使用diff算法对比两次vdom,生成patch补丁对象

diff 算法是比较两个文件的差异,并将两个文件不同之处,生成一个补丁对象(patch)

7、根据 keypatch对象渲染到页面中改变的结构上,而其他没有改变的地方是不做任何修改的( 虚拟dom的惰性原则 )

3、什么是diff算法

diff算法来源后端,用来比对两个文件的不同,前端将其应用于虚拟dom,vue中将 虚拟dom的diff算法放在了 patch.js文件中,使用 js 来进行两个对象的比较( vdom 对象模型),diff算法是同级比较,会给每一个层级打一个标记,这个标记是一个数字( 这个数字就是 key

diff算法运行结束后返回的是 patch补丁对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值