Vue 中的虚拟 DOM 是什么,以及它是如何工作的。

简介: Vue 中的虚拟 DOM 是什么,以及它是如何工作的。

虚拟 DOM 是什么

虚拟 DOM(Virtual DOM)是一种轻量级的 JavaScript 对象,它是真实 DOM 的抽象表示。在 Vue 等前端框架中,虚拟 DOM 作为真实 DOM 的抽象层,以对象树的形式存储在内存中,包含了真实 DOM 的相关信息,如标签名、属性、子节点等。

真实 DOM 是浏览器用于呈现网页的树形结构,操作真实 DOM 的代价比较高,因为每次修改都会引发浏览器的重排(reflow)和重绘(repaint),这会消耗大量的性能。而虚拟 DOM 的出现就是为了优化这个过程,通过在内存中对虚拟 DOM 进行操作和比较,找出最小的更新量,然后一次性将这些更新应用到真实 DOM 上,从而减少对真实 DOM 的直接操作,提高渲染效率。

虚拟 DOM 是如何工作的

1. 初始化阶段

  • 模板编译:Vue 会将用户编写的模板字符串(如 <div>{ { message }}</div>)编译成渲染函数(render 函数)。这个过程包括解析模板为抽象语法树(AST),对 AST 进行优化,最后根据优化后的 AST 生成渲染函数。
    // 示例渲染函数
    function render() {
         
      return createVNode('div', null, this.message);
    }
    
  • 生成虚拟 DOM:当 Vue 实例首次渲染时,会调用渲染函数,渲染函数会返回一个虚拟 DOM 节点(VNode)。这个虚拟 DOM 节点是一个普通的 JavaScript 对象,它描述了真实 DOM 的结构和属性。
    // 简单的虚拟 DOM 节点示例
    const vnode = {
         
      tag: 'div',
      data: {
         
          class: 'container'
      },
      children: [
          {
         
              tag: 'span',
              text: 'Hello, Vue!'
          }
      ]
    };
    
  • 挂载到真实 DOM:Vue 会根据生成的虚拟 DOM 创建对应的真实 DOM 节点,并将其挂载到页面中指定的位置(即 el 选项指定的元素)。

2. 更新阶段

  • 数据变化触发重新渲染:当 Vue 实例中的响应式数据发生变化时,会触发重新渲染。Vue 会再次调用渲染函数,生成新的虚拟 DOM。
    // 假设 data 中有一个 message 属性
    this.message = 'New message';
    // 触发重新渲染,生成新的虚拟 DOM
    
  • Diff 算法比较差异:为了找出新旧虚拟 DOM 之间的差异,Vue 使用了 Diff 算法。Diff 算法会对新旧虚拟 DOM 进行比较,找出需要更新的部分。Diff 算法采用了双指针和 key 的策略来提高比较效率。
    • 同层比较:Diff 算法只对同层的节点进行比较,不会跨层级比较,这样可以减少比较的复杂度。
    • key 的作用:当节点有唯一的 key 时,Diff 算法可以更准确地识别节点的变化,例如节点的移动、删除和新增。
  • 更新真实 DOM:根据 Diff 算法的比较结果,Vue 会将需要更新的部分应用到真实 DOM 上。这个过程只更新发生变化的部分,而不是重新渲染整个 DOM 树,从而提高了性能。

总结

虚拟 DOM 通过在内存中进行操作和比较,减少了对真实 DOM 的直接操作,从而提高了渲染效率。它在初始化阶段生成虚拟 DOM 并挂载到真实 DOM,在更新阶段通过 Diff 算法找出差异并更新真实 DOM。

相关文章
|
11月前
|
JavaScript
vue监听dom元素的宽高变化和自定义指令监听dom元素的宽高变化
vue监听dom元素的宽高变化和自定义指令监听dom元素的宽高变化
982 0
|
11月前
|
存储 JavaScript 前端开发
揭秘Vue 2中的$nextTick:等待DOM更新的神奇时刻!
揭秘Vue 2中的$nextTick:等待DOM更新的神奇时刻!
|
1月前
|
JavaScript 算法
Vue 中如何手动更新虚拟 DOM?
Vue 中如何手动更新虚拟 DOM?
131 57
|
6月前
|
JavaScript
在Vue中获取DOM元素的实际宽高
【10月更文挑战第2天】
787 76
|
7月前
|
JavaScript 前端开发
react字符串转为dom标签,类似于Vue中的v-html
本文介绍了在React中将字符串转换为DOM标签的方法,类似于Vue中的`v-html`指令,通过使用`dangerouslySetInnerHTML`属性实现。
218 0
react字符串转为dom标签,类似于Vue中的v-html
|
8月前
|
移动开发 JavaScript 前端开发
【Vue面试题二十二】、什么是虚拟DOM?如何实现一个虚拟DOM?说说你的思路
这篇文章深入探讨了虚拟DOM的概念、必要性以及在Vue中的实现方式,解释了虚拟DOM如何作为真实DOM的轻量级抽象,通过优化DOM操作提高性能,并实现跨平台渲染的能力。
【Vue面试题二十二】、什么是虚拟DOM?如何实现一个虚拟DOM?说说你的思路
|
10月前
|
JavaScript 前端开发
Vue的`v-if`和`v-show`用于条件渲染,`v-if`按需编译/销毁DOM,适合不频繁切换且节省初始化资源
【6月更文挑战第25天】Vue的`v-if`和`v-show`用于条件渲染,`v-if`按需编译/销毁DOM,适合不频繁切换且节省初始化资源;`v-show`则始终编译,仅通过CSS切换显示,适合频繁切换,初始渲染成本高但切换性能好。选择取决于元素显示状态的变化频率和初始渲染需求。
114 2
|
9月前
|
移动开发 JavaScript 前端开发
VUE实现一个列表清单【props 父子组件通信、slot插槽的使用、全局自定义指令的封装、$nextTick解决异步DOM更新、巧用v-model简化父子组件之间的通信、触发事件的事件源event】
VUE实现一个列表清单【props 父子组件通信、slot插槽的使用、全局自定义指令的封装、$nextTick解决异步DOM更新、巧用v-model简化父子组件之间的通信、触发事件的事件源event】
75 0
|
11月前
|
JavaScript 开发者
Teleport传送:使用Vue的Teleport进行跨DOM结构渲染
【4月更文挑战第24天】Vue.js的`&lt;teleport&gt;`组件用于跨DOM结构渲染,解决组件视觉呈现跨越父组件DOM的问题。它允许子组件内容传送到DOM的任意位置,如示例中将模态框移到`modal-container`元素。通过`target`属性指定目标元素,结合`v-if`控制显示,实现灵活的UI布局和交互。在适当场景下使用`&lt;teleport&gt;`能优化复杂应用的结构。
109 3
|
11月前
|
JavaScript 前端开发
vue创建dom的方法有哪些
vue创建dom的方法有哪些
146 2