当前位置:首页 > 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 CLI 快速初始化项目,安装必要依赖如 Vue Router、Vuex、Axios。 创建核心目录结构:components(通用组件)、views(页…

课程表vue实现

课程表vue实现

实现课程表的Vue组件 创建课程表需要设计数据结构、布局和交互逻辑。以下是一个基于Vue 3的实现方案: 数据结构设计 const timetableData = ref([ { ti…

vue实现访问量

vue实现访问量

Vue 实现访问量统计的方法 使用前端计数 在 Vue 中可以通过简单的计数器实现页面访问量的统计。这种方法适合小型项目或演示用途。 // 在 Vue 组件中 data() { return…

vue登录业务的实现

vue登录业务的实现

实现登录业务的基本流程 在Vue中实现登录业务通常涉及前端界面设计、表单验证、API请求交互、状态管理以及路由控制等环节。以下是核心实现步骤: 登录表单设计与验证 创建包含用户名和密码输入框的登录组…

vue实现无线滚动列表

vue实现无线滚动列表

无限滚动列表的实现方法 在Vue中实现无限滚动列表通常结合监听滚动事件和动态加载数据。以下是几种常见方法: 使用自定义指令 创建自定义指令v-infinite-scroll监听滚动事件:…

vue实现列表显示

vue实现列表显示

Vue 实现列表显示的方法 在 Vue 中实现列表显示通常使用 v-for 指令,结合数组或对象数据渲染动态列表。以下是几种常见的实现方式。 基本列表渲染 通过 v-for 指令遍历数组,动态生成列…