当前位置:首页 > VUE

vue响应式怎么实现

2026-01-20 19:15:11VUE

Vue 响应式实现原理

Vue 的响应式系统通过 数据劫持依赖收集 实现,核心基于 Object.defineProperty(Vue 2)或 Proxy(Vue 3)。以下是具体实现机制:

数据劫持

Vue 2 使用 Object.defineProperty 拦截对象的属性访问和修改,Vue 3 改用 Proxy 代理整个对象,覆盖更多操作(如数组方法、新增属性)。

Vue 2 示例:

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

Vue 3 示例:

const reactive = (target) => {
  return new Proxy(target, {
    get(target, key) {
      console.log(`读取 ${key}`);
      return Reflect.get(target, key);
    },
    set(target, key, value) {
      console.log(`更新 ${key}`);
      return Reflect.set(target, key, value);
    }
  });
};

依赖收集与派发更新

  1. 依赖收集:在属性被访问时(getter),将当前执行的组件渲染函数或计算属性作为依赖存入“订阅者列表”。
  2. 派发更新:属性被修改时(setter),通知所有订阅者重新执行(如触发组件重新渲染)。

简化实现:

class Dep {
  constructor() {
    this.subscribers = new Set();
  }
  depend() {
    if (activeEffect) this.subscribers.add(activeEffect);
  }
  notify() {
    this.subscribers.forEach(effect => effect());
  }
}

let activeEffect = null;
function watchEffect(effect) {
  activeEffect = effect;
  effect(); // 首次执行触发依赖收集
  activeEffect = null;
}

数组响应式处理

Vue 2 通过重写数组的变异方法(如 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);
    console.log(`数组方法 ${method} 被调用`);
    dep.notify(); // 触发更新
    return result;
  };
});

响应式 API 对比

特性 Vue 2 (Object.defineProperty) Vue 3 (Proxy)
对象新增属性 需手动调用 Vue.set 自动支持
数组响应式 重写变异方法 直接拦截
性能 递归遍历对象属性 惰性劫持

注意事项

  • Vue 2 限制:无法检测到对象属性的添加或删除,需通过 Vue.setVue.delete 处理。
  • Vue 3 优势Proxy 支持深层响应式,且能拦截更多操作(如 in 操作符、deleteProperty)。

通过上述机制,Vue 实现了数据变化到视图更新的自动化绑定。

vue响应式怎么实现

标签: vue
分享给朋友:

相关文章

vue实现tab标签

vue实现tab标签

Vue 实现 Tab 标签的方法 使用动态组件和 v-for 渲染标签 通过 v-for 循环生成标签页标题,结合 v-bind:class 动态切换激活状态。使用 v-show 或动态组件 <…

vue实现菜单调用

vue实现菜单调用

Vue 实现动态菜单的常见方法 基于路由配置生成菜单 Vue Router 的路由配置可以天然转化为菜单结构,适合权限与路由绑定的系统: // router/index.js const rout…

vue表格重置怎么实现

vue表格重置怎么实现

重置表格数据的方法 在Vue中重置表格数据通常需要操作绑定的数据源,以下是几种常见实现方式: 直接重置数据源 // 假设表格绑定的是tableData this.tableData = [...t…

vue实现列表显示

vue实现列表显示

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

vue设计与实现 书

vue设计与实现 书

vue设计与实现 书 《Vue.js设计与实现》是一本深入探讨Vue.js框架内部原理和设计思想的书籍,适合希望深入理解Vue.js的开发者。以下是关于这本书的详细信息: 书籍内容 《Vue…

vue实现录音文件播放

vue实现录音文件播放

使用 Vue 实现录音文件播放 准备工作 确保项目中已安装必要的依赖,如 vue-audio-recorder 或原生 Web Audio API。录音文件播放通常涉及录音、存储和播放三个核心环节。…