当前位置:首页 > VUE

vue底层原理实现

2026-03-29 02:59:33VUE

Vue 的响应式原理

Vue 的响应式系统是其核心特性之一,通过数据劫持和依赖收集实现。当数据变化时,视图自动更新。

Object.defineProperty Vue 2.x 使用 Object.defineProperty 劫持对象的属性访问和修改。通过 getter 收集依赖(Watcher),在 setter 中触发更新。

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

Proxy Vue 3.x 改用 Proxy 实现响应式,解决了 Vue 2.x 对数组和新增属性的监听限制。

function reactive(obj) {
  return new Proxy(obj, {
    get(target, key) {
      console.log('get', key);
      return Reflect.get(target, key);
    },
    set(target, key, val) {
      console.log('set', key);
      return Reflect.set(target, key, val);
    }
  });
}

虚拟 DOM 与 Diff 算法

Vue 通过虚拟 DOM 优化渲染性能,减少直接操作真实 DOM 的开销。

虚拟 DOM 结构 虚拟 DOM 是轻量化的 JavaScript 对象,描述 DOM 结构。

const vnode = {
  tag: 'div',
  props: { id: 'app' },
  children: [
    { tag: 'span', children: 'hello' }
  ]
};

Diff 算法 Diff 算法比较新旧虚拟 DOM 的差异,最小化 DOM 操作。采用同层比较策略,通过 patch 函数更新。

function patch(oldVnode, newVnode) {
  if (oldVnode === newVnode) return;
  const el = oldVnode.el;
  if (sameVnode(oldVnode, newVnode)) {
    patchProps(el, oldVnode.props, newVnode.props);
    patchChildren(el, oldVnode.children, newVnode.children);
  } else {
    replaceVnode(el, newVnode);
  }
}

模板编译

Vue 的模板通过编译器转换为渲染函数,最终生成虚拟 DOM。

vue底层原理实现

编译流程

  1. 解析模板为 AST(抽象语法树)。
  2. 优化 AST(标记静态节点)。
  3. 生成渲染函数代码。
const ast = parse(template);
optimize(ast);
const code = generate(ast);

渲染函数示例 模板 <div>{{ msg }}</div> 编译为:

function render() {
  return h('div', this.msg);
}

组件化实现

Vue 的组件是独立的模块,通过选项对象定义,支持生命周期和数据通信。

组件定义 组件通过 Vue.component 或单文件组件(SFC)定义。

vue底层原理实现

Vue.component('my-component', {
  template: '<div>{{ message }}</div>',
  data() {
    return { message: 'Hello' };
  }
});

生命周期钩子 组件从创建到销毁的各个阶段触发钩子函数,如 createdmounted 等。

export default {
  created() {
    console.log('Component created');
  },
  mounted() {
    console.log('Component mounted');
  }
};

事件系统

Vue 的事件系统基于发布-订阅模式,支持组件间通信。

自定义事件 通过 $emit 触发事件,$on 监听事件。

// Parent
this.$on('event', handler);

// Child
this.$emit('event', payload);

事件总线 全局事件总线用于跨组件通信。

const bus = new Vue();
bus.$emit('global-event');
bus.$on('global-event', callback);

总结

Vue 的底层实现结合了响应式数据绑定、虚拟 DOM、模板编译和组件化设计。Vue 2.x 基于 Object.defineProperty,Vue 3.x 升级为 Proxy,性能与功能均有显著提升。理解这些原理有助于更好地使用 Vue 并解决开发中的问题。

标签: 底层原理
分享给朋友:

相关文章

vue中样式的实现原理

vue中样式的实现原理

Vue 中样式的实现原理 Vue 的样式处理机制基于其核心的响应式系统和虚拟 DOM 技术,通过编译、作用域隔离和动态绑定实现高效的样式管理。 样式作用域隔离 Vue 的单文件组件(SFC)通过 s…

vue watch 实现 原理

vue watch 实现 原理

Vue Watch 实现原理 Vue 的 watch 功能用于监听数据变化并执行回调函数。其核心原理基于 Vue 的响应式系统,依赖 Object.defineProperty 或 Proxy(Vue…

vue底层原理实现

vue底层原理实现

Vue 底层原理实现 Vue.js 的核心原理主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是其底层实现的关键点: 响应式系统 Vue 2.x 使用 Object.defineProp…

vue ref实现原理

vue ref实现原理

Vue 3 中 ref 的实现原理 ref 是 Vue 3 响应式系统的核心 API 之一,用于将基本类型或对象转换为响应式引用。以下是其实现原理的关键点: 核心机制 ref 通过创建一个包装对象(…

vue computed实现原理

vue computed实现原理

Vue computed 实现原理 Vue 的 computed 属性是基于响应式依赖进行缓存的计算属性,其核心实现依赖于 Vue 的响应式系统和 Watcher 机制。 初始化阶段 在 Vue 实…

vue 指令实现原理

vue 指令实现原理

Vue 指令的实现原理 Vue 指令是 Vue.js 提供的一种特殊属性,用于在 DOM 元素上绑定特定的行为。指令的实现原理主要涉及以下几个核心机制: 指令的注册与解析 Vue 通过 Vue.di…