当前位置:首页 > VUE

vue原理实现

2026-03-07 05:11:04VUE

Vue 的核心原理实现

Vue.js 的核心原理主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是关键实现细节:

响应式系统

Vue 2.x 使用 Object.defineProperty 实现数据劫持。通过递归遍历数据对象,为每个属性添加 getter/setter,在属性被访问或修改时触发依赖收集和更新通知。

function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    get() {
      console.log(`get ${key}:${val}`);
      return val;
    },
    set(newVal) {
      if (newVal !== val) {
        console.log(`set ${key}:${newVal}`);
        val = newVal;
      }
    }
  });
}

Vue 3.x 改用 Proxy 实现,解决了数组和新增属性的监听问题:

vue原理实现

const reactive = (target) => {
  return new Proxy(target, {
    get(target, key, receiver) {
      const res = Reflect.get(target, key, receiver);
      track(target, key); // 依赖收集
      return res;
    },
    set(target, key, value, receiver) {
      const res = Reflect.set(target, key, value, receiver);
      trigger(target, key); // 触发更新
      return res;
    }
  });
};

虚拟 DOM 与 Diff 算法

Vue 将模板编译为渲染函数,生成虚拟 DOM 树。当数据变化时,通过 Diff 算法比较新旧虚拟 DOM,计算出最小更新量。

function patch(oldVnode, vnode) {
  if (sameVnode(oldVnode, vnode)) {
    patchVnode(oldVnode, vnode);
  } else {
    const parent = oldVnode.parentNode;
    parent.replaceChild(createElm(vnode), oldVnode);
  }
}

模板编译

Vue 的模板编译器将 HTML 模板转换为渲染函数:

vue原理实现

  1. 解析器:将模板字符串转换为 AST(抽象语法树)
  2. 优化器:标记静态节点用于后续优化
  3. 代码生成器:将 AST 转换为可执行的渲染函数代码
// 示例编译结果
with(this){
  return _c('div', {attrs:{"id":"app"}}, [
    _c('p', [_v(_s(message))])
  ])
}

组件系统

Vue 组件本质上是带有预设选项的 Vue 实例。组件初始化过程包括:

  • 合并选项(mixins/extends)
  • 初始化生命周期
  • 初始化事件系统
  • 调用 beforeCreate 钩子
  • 初始化注入(provide/inject)
  • 初始化状态(props/data/computed等)
  • 调用 created 钩子

实现简易 Vue 示例

以下是一个极简版的 Vue 实现框架:

class Vue {
  constructor(options) {
    this.$options = options;
    this.$data = options.data;

    observe(this.$data);
    proxy(this, '$data');

    new Compile(options.el, this);
  }
}

function observe(obj) {
  if (typeof obj !== 'object' || obj == null) return;

  Object.keys(obj).forEach(key => {
    defineReactive(obj, key, obj[key]);
  });
}

性能优化相关实现

Vue 通过以下机制优化性能:

  • 组件级更新:每个组件都有自己的渲染 watcher
  • 异步更新队列:使用 nextTick 批量更新
  • 静态树提升:标记不会变化的节点跳过 Diff
  • 事件缓存:避免重复创建事件处理器

这些核心机制共同构成了 Vue 的高效响应式框架,使其能够自动管理状态与视图的同步,同时保持优秀的性能表现。

标签: 原理vue
分享给朋友:

相关文章

vue实现粘贴

vue实现粘贴

Vue 实现粘贴功能的方法 在 Vue 中实现粘贴功能通常涉及监听粘贴事件并处理剪贴板数据。以下是几种常见的实现方式: 监听原生粘贴事件 通过 @paste 指令或原生 addEventListen…

vue实现看板

vue实现看板

Vue 实现看板功能 使用 Vue 实现看板功能可以通过组件化开发、状态管理和拖拽库结合完成。以下是一个完整的实现方案: 基础项目结构 src/ ├── components/ │ ├── Ka…

vue实现CRUD

vue实现CRUD

Vue 实现 CRUD 操作 Vue 提供了响应式数据绑定和组件化开发能力,结合后端 API 可以轻松实现 CRUD(增删改查)功能。以下是基于 Vue 3 和 Axios 的完整实现方案。 安装依…

vue实现treetable

vue实现treetable

Vue实现TreeTable的方法 使用第三方组件库(如Element UI) Element UI的el-table组件支持树形表格展示,通过设置row-key和tree-props属性即可实现。…

vue数据劫持实现

vue数据劫持实现

Vue 数据劫持的实现原理 Vue 的数据劫持主要通过 Object.defineProperty 或 Proxy 实现,用于监听数据变化并触发视图更新。以下是核心实现方式: 使用 Object.d…

vue实现部门树

vue实现部门树

Vue 实现部门树的方法 使用递归组件实现树形结构 递归组件是 Vue 中实现树形结构的常见方式。通过组件自身调用自身,可以轻松构建多层级的部门树。 <template> <d…