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

vue实现海报

vue实现海报

Vue 实现海报生成方案 使用 html2canvas 库 html2canvas 是一个将 HTML 元素转换为 Canvas 的库,适合将 Vue 组件渲染为海报图片 安装依赖: npm in…

vue翻页实现

vue翻页实现

Vue翻页实现方法 基础分页组件实现 使用v-for和计算属性实现基础分页逻辑: <template> <div> <ul> <li…

vue实现radio

vue实现radio

Vue 实现 Radio 按钮 在 Vue 中实现 Radio 按钮可以通过 v-model 进行数据绑定,结合 input 元素的 type="radio" 属性。以下是一个基本示例: <t…

vue实现换页

vue实现换页

Vue实现页面切换的方法 在Vue中实现页面切换通常可以通过Vue Router来完成。Vue Router是Vue.js官方的路由管理器,用于构建单页面应用(SPA)。以下是几种常见的实现方式:…

vue 实现上传

vue 实现上传

Vue 实现文件上传 使用 Vue 实现文件上传可以通过原生 HTML 的 <input type="file"> 或第三方库(如 axios、vue-upload-component)完…