当前位置:首页 > 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。

编译流程

  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.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);

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

vue底层原理实现

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 rooter 实现原理

vue rooter 实现原理

Vue Router 实现原理 Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。其核心实现原理包括路由匹配、组件渲染和导航守卫等机制。 路由匹配与动态路由 V…

vue动画实现原理

vue动画实现原理

Vue动画实现原理 Vue的动画系统基于CSS过渡和动画,结合Vue的响应式系统,提供声明式的方式管理元素进入/离开的动画效果。核心原理分为以下几个部分: 过渡类名自动应用 Vue在元素插入/删除时…

vue cli实现原理

vue cli实现原理

Vue CLI 的实现原理 Vue CLI 是一个基于 Node.js 的工具链,用于快速搭建 Vue.js 项目。其核心实现原理涉及模块化设计、插件系统、Webpack 封装等多个方面。 核心模块…

Vue实现原理详解

Vue实现原理详解

Vue 实现原理核心解析 Vue.js 的核心实现基于响应式系统、虚拟 DOM 和组件化设计。以下是关键原理的分解: 响应式系统 通过 Object.defineProperty(Vue 2)或 P…

vue 监听实现原理

vue 监听实现原理

Vue 监听实现原理 Vue 的监听机制主要通过 Object.defineProperty 或 Proxy 实现数据劫持,结合观察者模式(Observer-Watcher-Dep)完成依赖收集和派发…

vue组件实现原理

vue组件实现原理

Vue 组件实现原理 Vue 组件的核心实现基于以下机制: 组件注册与模板解析 Vue 组件通过 Vue.component() 或单文件组件(.vue 文件)注册。模板会被编译成渲染函数,最终生成…