当前位置:首页 > VUE

vue 实现原理

2026-01-13 08:43:30VUE

Vue 实现原理

Vue.js 是一个渐进式 JavaScript 框架,其核心实现原理主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。

响应式系统

Vue 使用 Object.defineProperty(Vue 2)或 Proxy(Vue 3)实现数据劫持。当数据发生变化时,依赖该数据的视图会自动更新。

Vue 2 的响应式实现示例:

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 改用 Proxy 实现:

function reactive(obj) {
  return new Proxy(obj, {
    get(target, key) {
      console.log(`get ${key}`);
      return Reflect.get(target, key);
    },
    set(target, key, value) {
      console.log(`set ${key}:${value}`);
      return Reflect.set(target, key, value);
    }
  });
}

虚拟 DOM

Vue 通过虚拟 DOM 提高渲染效率。当状态变化时,Vue 会生成新的虚拟 DOM 树,通过 diff 算法比较新旧虚拟 DOM,计算出最小更新操作,然后批量更新真实 DOM。

vue 实现原理

虚拟 DOM 的简单实现:

function createVNode(tag, props, children) {
  return { tag, props, children };
}

function patch(oldVNode, newVNode) {
  // diff 算法实现
}

模板编译

Vue 的模板会被编译成渲染函数。这个过程包括:

  1. 解析器将模板转换为 AST(抽象语法树)
  2. 优化器标记静态节点
  3. 代码生成器将 AST 转换为渲染函数

示例编译结果:

vue 实现原理

function render() {
  with(this) {
    return _c('div', { attrs: { id: 'app' } }, [
      _c('h1', [_v(message)]),
      _c('button', { on: { click: handleClick } }, [_v('Click me')])
    ]);
  }
}

组件化机制

Vue 组件是可复用的 Vue 实例。每个组件都有独立的响应式数据、模板和生命周期。组件系统通过以下方式实现:

  1. 组件注册和继承机制
  2. 组件通信(props/emit)
  3. 插槽系统
  4. 生命周期管理

组件示例:

Vue.component('my-component', {
  props: ['title'],
  template: '<div>{{ title }}</div>'
});

依赖收集与派发更新

Vue 通过 Watcher 和 Dep 类实现依赖收集:

  1. 每个响应式属性都有一个 Dep 实例
  2. 当属性被访问时,当前 Watcher 会被添加到 Dep 中
  3. 当属性变化时,Dep 会通知所有 Watcher 更新

简化实现:

class Dep {
  constructor() {
    this.subs = [];
  }
  addSub(sub) {
    this.subs.push(sub);
  }
  notify() {
    this.subs.forEach(sub => sub.update());
  }
}

class Watcher {
  update() {
    // 执行更新
  }
}

这些核心机制共同构成了 Vue 的响应式、高效和组件化的特性。

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

相关文章

vue实现放大镜原理

vue实现放大镜原理

Vue 实现放大镜效果 放大镜效果常见于电商网站的商品展示,通过鼠标悬停或移动实现局部放大。以下是基于 Vue 的实现方法: 核心原理 布局结构:主容器包含小图区域和放大镜区域。 事件监听:…

vue实现递归

vue实现递归

Vue 实现递归组件的方法 在 Vue 中实现递归组件通常用于处理树形结构数据(如菜单、评论列表、文件目录等)。以下是具体实现方法: 定义递归组件 通过 name 选项让组件可以递归调用自身:…

vue实现拖放

vue实现拖放

Vue 实现拖放功能 Vue 中实现拖放功能通常可以通过 HTML5 的原生拖放 API 或第三方库(如 vuedraggable)来实现。以下是两种方法的详细说明。 使用 HTML5 原生拖放…

vue实现签章

vue实现签章

Vue 实现签章功能 签章功能通常包括手写签名、电子印章等。以下是基于 Vue 的实现方法: 使用 canvas 实现手写签名 安装依赖(如需要): npm install signature…

vue实现编辑

vue实现编辑

Vue 实现编辑功能 在 Vue 中实现编辑功能通常涉及表单绑定、状态管理和事件处理。以下是一个常见的实现方法: 双向数据绑定 使用 v-model 指令实现表单元素与数据的双向绑定: <…

vue nexttick实现

vue nexttick实现

Vue 中 nextTick 的实现原理 Vue 的 nextTick 是一个用于在下次 DOM 更新循环结束之后执行延迟回调的方法。它的核心实现依赖于 JavaScript 的事件循环机制。 基…