当前位置:首页 > VUE

vue响应式实现

2026-01-11 20:44:54VUE

Vue 响应式实现原理

Vue 的响应式系统是其核心特性之一,通过数据劫持和依赖收集实现。以下是 Vue 2.x 和 Vue 3.x 响应式实现的主要机制:

vue响应式实现

Vue 2.x 的响应式实现

Vue 2.x 使用 Object.defineProperty 实现数据劫持,通过 getter 和 setter 拦截属性的访问和修改。

vue响应式实现

function defineReactive(obj, key, val) {
  const dep = new Dep(); // 依赖收集器

  Object.defineProperty(obj, key, {
    get() {
      if (Dep.target) {
        dep.depend(); // 收集依赖
      }
      return val;
    },
    set(newVal) {
      if (newVal === val) return;
      val = newVal;
      dep.notify(); // 通知更新
    }
  });
}
  • 依赖收集:在 getter 中通过 Dep.target(当前 Watcher)收集依赖。
  • 派发更新:在 setter 中通过 dep.notify() 通知所有 Watcher 更新。

Vue 3.x 的响应式实现

Vue 3.x 使用 Proxy 替代 Object.defineProperty,解决了 Vue 2.x 无法监听新增属性和数组变化的问题。

function reactive(obj) {
  return new Proxy(obj, {
    get(target, key, receiver) {
      track(target, key); // 收集依赖
      return Reflect.get(target, key, receiver);
    },
    set(target, key, value, receiver) {
      const result = Reflect.set(target, key, value, receiver);
      trigger(target, key); // 触发更新
      return result;
    }
  });
}
  • tracktrigger:分别用于依赖收集和派发更新。
  • Reflect API:配合 Proxy 实现更规范的拦截行为。

依赖收集与派发更新

  • Dep 类:管理依赖(Watcher),通过 depend 收集和 notify 派发。
  • Watcher 类:观察数据变化并执行回调(如更新视图)。
class Dep {
  constructor() {
    this.subscribers = new Set();
  }
  depend() {
    if (Dep.target) this.subscribers.add(Dep.target);
  }
  notify() {
    this.subscribers.forEach(watcher => watcher.update());
  }
}

数组的响应式处理

Vue 2.x 通过重写数组方法(如 pushpop)实现响应式:

const arrayProto = Array.prototype;
const arrayMethods = Object.create(arrayProto);

['push', 'pop', 'shift'].forEach(method => {
  const original = arrayProto[method];
  arrayMethods[method] = function(...args) {
    const result = original.apply(this, args);
    this.__ob__.dep.notify(); // 手动触发更新
    return result;
  };
});

总结对比

  • Vue 2.x:基于 Object.defineProperty,需递归遍历对象,无法监听新增属性。
  • Vue 3.x:基于 Proxy,支持动态属性监听,性能更优。

响应式系统的核心是通过数据劫持自动追踪依赖,在数据变化时高效更新相关视图或逻辑。

标签: vue
分享给朋友:

相关文章

vue实现条件判断

vue实现条件判断

Vue 条件判断实现方法 Vue 提供了多种方式实现条件判断,可以根据不同场景选择合适的方式。 v-if / v-else-if / v-else 这是 Vue 中最常用的条件渲染指令,根据表达式…

vue实现好评弹框

vue实现好评弹框

Vue 实现好评弹框的方法 使用 Vue 实现好评弹框可以通过组件化方式完成,结合动态数据绑定和事件处理。以下是具体实现步骤: 1. 创建弹框组件 新建一个 RatingDialog.vue…

vue如何实现到期提醒

vue如何实现到期提醒

实现 Vue 到期提醒功能 使用计算属性计算剩余时间 在 Vue 组件中定义一个计算属性,计算目标日期与当前日期的差值。通过 Date 对象获取时间戳并计算剩余天数或小时数。 computed: {…

vue 实现在线预览

vue 实现在线预览

Vue 实现在线预览的常见方法 使用 iframe 嵌入 通过 iframe 标签可以嵌入多种类型的文件,如 PDF、图片、网页等。需要确保文件地址可访问。 <template>…

vue无限菜单怎么实现

vue无限菜单怎么实现

实现 Vue 无限菜单的方法 递归组件实现嵌套菜单 使用 Vue 的递归组件特性可以轻松实现无限级嵌套菜单。通过组件调用自身的方式处理嵌套数据。 <template> <ul&…

vue实现一个系统

vue实现一个系统

Vue 系统实现步骤 项目初始化与配置 使用 Vue CLI 或 Vite 创建项目: npm init vue@latest my-system 选择需要的配置(Router、Pinia 等)。…