虚拟DOM和DOM diff

虚拟DOM是什么?

一个能代表DOM树的对象,通常含有标签名、标签上的属性、事件监听和子元素们,以及其他属性。

虚拟DOM的优点:

DOM每发生一次改变,浏览器都会进行一次完整的渲染(重排与重绘),有了虚拟DOM之后,DOM发生改变时先修改对应虚拟DOM,虚拟DOM的改变并不会直接渲染,而是等所有改变完成之后进行渲染,避免不必要的操作从而提高性能。

  1. 减少不必要的DOM操作(下边这两个例子要背下来)。
  • 虚拟DOM可以将多次操作合并为一次操作,减少DOM操作的次数。(比如你添加1000个节点却是一个接一个操作的)
  • 虚拟DOM借助DOM diff算法可以把多余的操作省掉,减少DOM操作的范围(比如你添加1000个节点,其实只有10个是新增的)。
  1. 跨平台渲染:
    由于虚拟dom是个对象,所以可以跨平台并支持服务端渲染。

虚拟DOM长什么样子?

// Vue
const vDode = {
    tag: "div", //标签名 or 组件名
    data: {
        class: "red", // 标签上的属性
        on: {
            click: () => {} // 事件
        }
    },
    children: [
        {tag: "span", ...},
        {tag: "span", ...}
    ],
    ...
}

如何创建一个虚拟DOM

// ReactcreateElement
createElement('div', {className: 'red' , onClick:() => {}},[
    createElement('span', {}, 'span1'),
    createElement('span', {}, 'span2')
])
// Vue(只能在render函数里得到h)
h('div', {
    class: 'red',
    on: {
        click: () => {}
    },
}, [h('span', {}, 'span1'), h('span', {}, 'span2')])

改进(用JSX简化创建虚拟DOM)

// React 通过babel 转为 createElement 形式
<div className="red" onClick = {fn}>
    <span>span1</span>
    <span>span2</span>
</div>
// Vue 通过vue-loader转换为 h 形式
<div class="red" @click="fn">
    <span>span1<span>
    <span>span2<span>
</div>

虚拟DOM的缺点

当首次渲染大量DOM或者全部DOM,因为多了一层虚拟DOM的计算,反而比直接渲染慢
需要额外的创建函数,比如createElement(React)或h(Vue),但可以通过JSX来简化成XML写法。

DOM diff

什么是DOM diff?
DOM diff就是比较两个虚拟DOM之间有什么差异的算法
DOM diff就是一个函数,我们称之为patch
patches = patch(oldVNode, newVNode)
patches 就是我们要运行的DOM操作。
DOM diff的大概逻辑
将新旧两棵树逐层对比,找出哪些节点需要更新。
如果节点是组件就看Component diff,如果检点是标签就看Element diff
Component diff
如果节点是组件,就看组件类型,类型不同直接替换(删除旧的),类型相同就只更新属性,然后深入组件做Tree diff(递归)
Element diff
如果节点是原生标签,则看标签名,标签名不同直接替换,相同则只更新属性。然后进入标签后代做Tree diff(递归)。
DOM diff的优点
对比新旧节点,查找出差异并只修改差异部分,极大提高性能。
DOM diff的问题(key)
当虚拟DOM没有唯一标识符(key)时,默认以索引作为标识,那么两个相同的节点由于索引不同依然会进行修改删除等操作。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • DOM总结 虚拟DOM是什么 一个能代表DOM树的对象,通常含有标签名、标签上的属性、事件监听和子元素们,以及其它...
    卢卢2020阅读 2,187评论 0 0
  • 一个代表DOM树的对象,通常含有标签名,标签上的属性,事件监听和子元素们以及其他属性优点 减少dom操作a. 将多...
    haoti阅读 1,247评论 0 0
  • 概念 虚拟DOM 是什么:其实就是个js对象虚拟 dom 是相对于浏览器所渲染出来的真实 dom 的,在react...
    张德瘦嬢嬢阅读 3,110评论 0 0
  • 一、什么是虚拟DOM 一个能表示DOM树的对象,通常含有标签名、标签上的属性、事件监听和子元素们,以及其他属性 二...
    Avan菜菜阅读 2,701评论 0 0
  • visual Dom是什么🧐 虚拟DOM其实就是,像拥有类似dom的一系列属性的对象,包括:标签名,标签上的属性,...
    Adder阅读 1,382评论 0 2

友情链接更多精彩内容