当前位置:首页 > 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 实现的基本步骤 安装 Vue.js 可以通过 npm 或 CDN 引入。使用 npm 安装适合大型项目,CDN 适合快速原型开发。 npm install vue 在 HTML 文件中引入…

实现.vue文件

实现.vue文件

创建.vue文件的基本结构 一个标准的.vue文件包含三个部分:模板(template)、脚本(script)和样式(style)。这种结构允许开发者在一个文件中管理组件的HTML、JavaScrip…

vue实现伸缩

vue实现伸缩

Vue实现伸缩功能的方法 使用CSS过渡和Vue的v-if或v-show 通过CSS的transition属性结合Vue的条件渲染指令(v-if或v-show)可以实现元素的伸缩效果。定义一个CSS类…

vue实现文章滚动

vue实现文章滚动

Vue 实现文章滚动效果 使用 CSS 实现基础滚动 通过 CSS 的 overflow 和 height 属性控制滚动区域,适用于静态内容滚动。在 Vue 模板中定义固定高度的容器,内容超出后自动滚…

vue实现选择置顶

vue实现选择置顶

Vue 实现选择置顶功能 在 Vue 中实现选择置顶功能,可以通过操作数据数组或结合 CSS 样式来实现。以下是几种常见的实现方法: 数组排序法 通过操作数据数组,将被选中的项移动到数组首位: /…

vue如何实现排序

vue如何实现排序

实现数组排序 在Vue中实现数组排序可以通过computed属性或methods来处理。假设有一个数组items,可以创建一个计算属性返回排序后的数组: data() { return {…