当前位置:首页 > VUE

vue实现响应式

2026-02-19 07:18:58VUE

Vue 响应式原理

Vue 的响应式系统是其核心特性之一,允许数据变化时自动更新视图。以下是 Vue 实现响应式的关键机制:

vue实现响应式

数据劫持与依赖收集

Vue 2 使用 Object.defineProperty 对数据对象的属性进行劫持。当访问属性时,会触发 getter 收集依赖(Watcher);当修改属性时,会触发 setter 通知依赖更新。

vue实现响应式

// 简化版数据劫持示例
function defineReactive(obj, key, val) {
  const dep = new Dep(); // 依赖管理
  Object.defineProperty(obj, key, {
    get() {
      dep.depend(); // 收集当前 Watcher
      return val;
    },
    set(newVal) {
      if (newVal === val) return;
      val = newVal;
      dep.notify(); // 通知更新
    }
  });
}

依赖管理(Dep 和 Watcher)

  • Dep:每个响应式属性对应一个 Dep 实例,用于存储所有依赖该属性的 Watcher。
  • Watcher:代表一个依赖项,可能是组件渲染函数、计算属性或用户自定义的侦听器。

数组响应式处理

Vue 2 通过重写数组的 pushpopsplice 等方法来触发更新。这些方法被包裹以实现响应式通知。

// 数组方法重写示例
const arrayProto = Array.prototype;
const arrayMethods = Object.create(arrayProto);
['push', 'pop', 'splice'].forEach(method => {
  const original = arrayProto[method];
  arrayMethods[method] = function(...args) {
    const result = original.apply(this, args);
    dep.notify(); // 触发更新
    return result;
  };
});

Vue 3 的 Proxy 优化

Vue 3 改用 Proxy 实现响应式,解决了 Vue 2 中无法检测新增属性和数组索引变化的问题。

// Vue 3 响应式示例
const reactive = (target) => {
  return new Proxy(target, {
    get(target, key, receiver) {
      track(target, key); // 收集依赖
      return Reflect.get(target, key, receiver);
    },
    set(target, key, value, receiver) {
      Reflect.set(target, key, value, receiver);
      trigger(target, key); // 触发更新
      return true;
    }
  });
};

响应式 API 对比

特性 Vue 2 (Object.defineProperty) Vue 3 (Proxy)
检测新增属性 需使用 Vue.set 直接支持
数组索引变化 部分方法需重写 直接支持
性能 稍慢(递归劫持) 更快

实践注意事项

  • 避免直接修改数组索引或对象未声明的属性(Vue 2)。
  • 复杂数据结构可通过 Vue.setthis.$set 确保响应式(Vue 2)。
  • Vue 3 的 refreactive 已内置深度响应式处理。

标签: vue
分享给朋友:

相关文章

在线脑图 vue 实现

在线脑图 vue 实现

在线脑图 Vue 实现方案 使用开源库实现 推荐使用 mind-elixir 或 jsmind 这类开源库,它们专为脑图设计且支持 Vue 集成。 安装依赖: npm install mind…

vue实现画圆弧并着色

vue实现画圆弧并着色

在 Vue 中实现画圆弧并着色 使用 Canvas API 绘制圆弧 在 Vue 组件的 mounted 钩子中,通过 Canvas API 绘制圆弧。创建一个 canvas 元素并获取其上下文:…

vue 指令实现

vue 指令实现

Vue 指令实现 Vue 指令是 Vue.js 提供的特殊属性,用于在 DOM 元素上添加特殊行为。指令以 v- 前缀开头,例如 v-model、v-if、v-for 等。以下是实现自定义指令和常用内…

antd vue 实现

antd vue 实现

使用 Ant Design Vue 实现功能 Ant Design Vue 是基于 Vue.js 的 UI 组件库,提供了丰富的组件和设计规范。以下是一些常见功能的实现方法。 安装 Ant Des…

vue实现bootstrap

vue实现bootstrap

Vue 中集成 Bootstrap 的方法 在 Vue 项目中集成 Bootstrap 可以通过以下方式实现,涵盖样式、组件和交互功能。 安装 Bootstrap 依赖 通过 npm 或 yarn…

vue页面实现

vue页面实现

Vue 页面实现方法 创建 Vue 组件 使用 Vue 单文件组件(SFC)方式创建页面,文件扩展名为 .vue。一个基本的 Vue 组件包含三个部分:模板(template)、脚本(script)和…