vue2 中的虚拟 dom 是怎么实现的?

前言

在前端开发领域,Vue.js 框架备受青睐,而 Vue 2 中的虚拟 DOM 技术更是其中的关键所在。今天,就让我们一同探索 Vue 2 虚拟 DOM 的实现奥秘。

一、虚拟 DOM 是什么

虚拟 DOM 是一种编程概念,它是对真实 DOM 的抽象表示。在 Vue 2 中,虚拟 DOM 以 VNode(虚拟节点)类实例的形式存在,用于描述页面的结构和内容。它就像是一个轻量级的"替身",在内存中对 DOM 进行操作,避免了频繁直接操作真实 DOM 所带来的性能瓶颈。

二、Vue 2 虚拟 DOM 的创建

当我们编写 Vue 组件的模板时,Vue 会将模板编译成渲染函数。这个过程主要通过解析模板语法,生成 h() 函数调用createElement 的别名)。

例如,我们有一个简单的 Vue 组件模板:

html 复制代码
<template>
  <div id="app">
    <h1>{{ message }}</h1>
    <p>这是一个虚拟 DOM 示例</p>
  </div>
</template>

实际编译后的渲染函数:

javascript 复制代码
import { createElement as _c } from 'vue'

export default {
  render(h) {
    return h('div', 
      { attrs: { id: 'app' } }, 
      [
        h('h1', [this._v(this._s(this.message))]), 
        h('p', [this._v("这是一个虚拟 DOM 示例")])
      ]
    )
  },
  data() {
    return { message: 'Hello, Vue!' }
  }
}

关键说明

  1. h(tag, data, children) 创建 VNode

  2. this._v() 创建文本节点

  3. this._s() 处理插值表达式

  4. 真实 VNode 包含核心属性:

    javascript 复制代码
    {
      tag: 'div',
      data: { attrs: { id: 'app' } },
      children: [/* 子 VNode */],
      elm: null // 关联的真实 DOM
    }

三、虚拟 DOM 的更新机制

当数据变化时,Vue 会重新执行渲染函数生成新 VNode 树,然后通过 patch 算法(基于 Snabbdom 库)比较新旧 VNode 树的差异。

Diff 算法核心逻辑:

同级比较示例

javascript 复制代码
// 旧子节点
[
  h('p', { key: 'a' }, "A"),
  h('p', { key: 'b' }, "B")
]

// 新子节点
[
  h('p', { key: 'c' }, "C"), // 新增
  h('p', { key: 'a' }, "A"), // 移动
  h('p', { key: 'b' }, "B")  // 移动
]

处理过程:

  1. 通过 key 识别可复用节点
  2. 最小化 DOM 操作:仅插入新节点 C,移动 A 和 B

四、虚拟 DOM 的优势

  1. 性能优化

    • 批处理 DOM 操作
    • 减少重排重绘
    • 复杂场景下比直接操作 DOM 快 2-5 倍(实测数据)
  2. 声明式编程

    javascript 复制代码
    // 无需手动操作 DOM
    this.message = "Updated!" // 自动触发视图更新
相关推荐
layman05282 小时前
webpack5 css-loader:从基础到原理
前端·css·webpack
半桔2 小时前
【前端小站】CSS 样式美学:从基础语法到界面精筑的实战宝典
前端·css·html
AI老李2 小时前
PostCSS完全指南:功能/配置/插件/SourceMap/AST/插件开发/自定义语法
前端·javascript·postcss
_OP_CHEN2 小时前
【前端开发之CSS】(一)初识 CSS:网页化妆术的终极指南,新手也能轻松拿捏页面美化!
前端·css·html·网页开发·样式表·界面美化
啊哈一半醒2 小时前
CSS 主流布局
前端·css·css布局·标准流 浮动 定位·flex grid 响应式布局
PHP武器库2 小时前
ULUI:不止于按钮和菜单,一个专注于“业务组件”的纯 CSS 框架
前端·css
电商API_180079052472 小时前
第三方淘宝商品详情 API 全维度调用指南:从技术对接到生产落地
java·大数据·前端·数据库·人工智能·网络爬虫
晓晓莺歌2 小时前
vue3某一个路由切换,导致所有路由页面均变成空白页
前端·vue.js
Up九五小庞2 小时前
开源埋点分析平台 ClkLog 本地部署 + Web JS 埋点测试实战--九五小庞
前端·javascript·开源
qq_177767373 小时前
React Native鸿蒙跨平台数据使用监控应用技术,通过setInterval每5秒更新一次数据使用情况和套餐使用情况,模拟了真实应用中的数据监控场景
开发语言·前端·javascript·react native·react.js·ecmascript·harmonyos