当前位置:首页 > VUE

vue vnode实现

2026-02-10 02:59:03VUE

Vue VNode 实现原理

VNode(虚拟节点)是 Vue 中用于描述真实 DOM 的轻量级 JavaScript 对象。Vue 通过 VNode 实现高效的 DOM 更新和渲染。

VNode 的核心结构

VNode 是一个普通的 JavaScript 对象,包含以下关键属性:

{
  tag: 'div', // 标签名
  data: { attrs: { id: 'app' } }, // 属性、样式、事件等数据
  children: [], // 子节点数组
  text: 'Hello', // 文本内容(如果是文本节点)
  elm: null, // 对应的真实 DOM 节点
  key: undefined // 用于优化 diff 算法的 key
}

VNode 的创建过程

Vue 通过 createElement 函数(通常缩写为 h)创建 VNode。在编译阶段,模板会被编译成渲染函数,渲染函数中包含 h 调用:

// 模板
<div id="app">{{ message }}</div>

// 编译后的渲染函数
function render() {
  return h('div', { attrs: { id: 'app' } }, [this.message])
}

VNode 的 Diff 算法

当数据变化时,Vue 会生成新的 VNode 树,并与旧的 VNode 树进行对比(diff),找出最小化的 DOM 操作:

  1. 同级比较:只比较同一层级的节点,不跨层级比较
  2. key 优化:通过 key 识别可复用的节点
  3. 双端比较:从新旧子节点的两端向中间比较

VNode 的 Patch 过程

Diff 完成后,Vue 会执行 patch 操作将变化应用到真实 DOM:

function patch(oldVnode, vnode) {
  if (sameVnode(oldVnode, vnode)) {
    // 相同节点,执行更新
    patchVnode(oldVnode, vnode)
  } else {
    // 不同节点,替换整个节点
    const parent = oldVnode.parentNode
    const elm = createElm(vnode)
    parent.insertBefore(elm, oldVnode)
    parent.removeChild(oldVnode)
  }
}

自定义 VNode 实现

可以手动创建简单的 VNode 实现:

vue vnode实现

class VNode {
  constructor(tag, data, children, text, elm) {
    this.tag = tag
    this.data = data
    this.children = children
    this.text = text
    this.elm = elm
  }
}

function createElement(tag, data, children) {
  return new VNode(tag, data, children, undefined, undefined)
}

VNode 的性能优势

  1. 减少直接 DOM 操作:批量处理 DOM 更新
  2. 跨平台能力:VNode 可以渲染到不同平台(Web、Native 等)
  3. 高效的更新策略:通过 diff 算法最小化 DOM 操作

VNode 是 Vue 响应式系统和渲染机制的核心,理解 VNode 有助于深入掌握 Vue 的工作原理。

标签: vuevnode
分享给朋友:

相关文章

vue实现效果

vue实现效果

以下是Vue实现常见效果的几种典型方法,分为不同场景说明: 数据绑定与响应式更新 使用v-model实现表单双向绑定: <template> <input v-model="…

vue实现海报

vue实现海报

Vue 实现海报生成方案 使用 html2canvas 库 html2canvas 是一个将 HTML 元素转换为 Canvas 的库,适合将 Vue 组件渲染为海报图片 安装依赖: npm in…

vue实现必填

vue实现必填

Vue 实现表单必填验证的方法 在Vue中实现表单必填验证可以通过多种方式完成,以下是几种常见的方法: 使用HTML5原生属性 最简单的必填验证可以通过HTML5的required属性实现: &l…

vue实现api

vue实现api

Vue 实现 API 调用 在 Vue 中调用 API 通常涉及使用 axios 或 fetch 发送 HTTP 请求,并结合 Vue 的响应式特性管理数据。以下是常见的实现方式: 安装 axios…

vue实现上划

vue实现上划

Vue 实现上划功能 在Vue中实现上划功能,可以通过监听触摸事件(touchstart、touchmove、touchend)来判断用户的手势方向。以下是实现上划功能的几种方法: 监听触摸事件 通…

vue实现监控

vue实现监控

Vue 实现监控功能的方法 在 Vue 中实现监控功能通常涉及数据变化监听、事件监听或第三方监控工具集成。以下是几种常见实现方式: 使用 Vue 的 watch 监听数据变化 通过 watch 可以…