当前位置:首页 > VUE

vue响应式实现

2026-03-26 17:55:55VUE

Vue 响应式实现原理

Vue 的响应式系统基于 Object.defineProperty(Vue 2)或 Proxy(Vue 3)实现,核心是通过数据劫持和依赖收集机制自动追踪数据变化并触发视图更新。

数据劫持

在 Vue 2 中,通过 Object.defineProperty 递归遍历对象的属性,将其转换为 getter/setter:

function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    get() {
      console.log(`读取 ${key}`);
      return val;
    },
    set(newVal) {
      if (newVal !== val) {
        console.log(`设置 ${key}`);
        val = newVal;
      }
    }
  });
}

在 Vue 3 中,使用 Proxy 代理整个对象,无需递归遍历:

vue响应式实现

function reactive(obj) {
  return new Proxy(obj, {
    get(target, key) {
      console.log(`读取 ${key}`);
      return target[key];
    },
    set(target, key, newVal) {
      if (target[key] !== newVal) {
        console.log(`设置 ${key}`);
        target[key] = newVal;
      }
      return true;
    }
  });
}

依赖收集与派发更新

Vue 通过依赖收集(Dependency Tracking)建立数据与视图的关联:

  1. Watcher:每个组件实例对应一个 Watcher,负责监听数据变化并触发更新。
  2. Dep:每个响应式属性关联一个 Dep(依赖管理器),用于存储所有依赖该属性的 Watcher。

当数据被读取时,触发 getter 并将当前 Watcher 添加到 Dep 中:

vue响应式实现

get() {
  if (Dep.target) { // 当前 Watcher
    dep.addSub(Dep.target); // 收集依赖
  }
  return val;
}

当数据被修改时,触发 setter 并通知所有关联的 Watcher 更新:

set(newVal) {
  val = newVal;
  dep.notify(); // 通知所有 Watcher
}

数组响应式处理

Vue 对数组方法(如 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);
    dep.notify(); // 触发更新
    return result;
  };
});

性能优化

  1. 异步更新队列:Vue 将多次数据变化合并为一次更新,通过 nextTick 实现批量 DOM 渲染。
  2. 虚拟 DOM:通过 Diff 算法最小化 DOM 操作,提升渲染效率。

总结

Vue 响应式系统的核心是通过数据劫持和依赖收集实现自动更新。Vue 2 使用 Object.defineProperty,Vue 3 升级为 Proxy,解决了深层嵌套和数组监听的问题,同时优化了性能。

标签: vue
分享给朋友:

相关文章

vue实现功能

vue实现功能

Vue 功能实现方法 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。以下是实现常见功能的几种方法: 数据绑定与响应式更新 在 Vue 中,数据绑定通过 v-model…

vue轮询实现

vue轮询实现

Vue 轮询实现方法 在 Vue 中实现轮询可以通过以下几种方式: 使用 setInterval data() { return { pollInterval: null } },…

vue原理实现

vue原理实现

Vue 原理实现的核心机制 Vue.js 的核心原理基于响应式系统、虚拟 DOM 和模板编译。以下是其核心实现机制的分解: 响应式系统 Vue 使用 Object.defineProperty(Vu…

vue实现抖动

vue实现抖动

Vue 实现抖动效果 在 Vue 中实现抖动效果可以通过 CSS 动画或 JavaScript 动画库来实现。以下是几种常见的方法: 使用 CSS 动画 通过定义 @keyframes 动画并在 V…

vue实现Siri

vue实现Siri

Vue 实现 Siri 风格语音交互 实现类似 Siri 的语音交互功能需要结合语音识别、语音合成和前端交互逻辑。Vue 作为前端框架,可以很好地管理这些功能的交互状态。 语音识别集成 使用 Web…

vue scrolltop 实现

vue scrolltop 实现

实现 Vue 中的 scrollTop 在 Vue 中实现滚动到顶部功能可以通过多种方式完成,包括使用原生 JavaScript、Vue 指令或第三方库。以下是几种常见的实现方法: 使用原生 Jav…