当前位置:首页 > VUE

vue observer实现

2026-01-07 20:12:38VUE

Vue Observer 实现原理

Vue 的响应式系统核心是通过 Object.defineProperty(Vue 2)或 Proxy(Vue 3)实现的 Observer 模式。以下是关键实现细节:

数据劫持(Vue 2)

通过 Object.defineProperty 递归地将对象的属性转换为 getter/setter:

vue observer实现

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

依赖收集与触发

  1. 依赖收集:在 getter 中通过 Dep 类收集依赖(Watcher):

    class Dep {
    constructor() {
     this.subscribers = [];
    }
    depend() {
     if (target && !this.subscribers.includes(target)) {
       this.subscribers.push(target);
     }
    }
    notify() {
     this.subscribers.forEach(sub => sub());
    }
    }
  2. 触发更新:在 setter 中通知依赖更新:

    vue observer实现

    set(newVal) {
    if (val === newVal) return;
    val = newVal;
    dep.notify(); // 触发所有依赖的 Watcher
    }

数组响应式处理(Vue 2)

重写数组的变异方法(如 push/pop):

const arrayProto = Array.prototype;
const arrayMethods = Object.create(arrayProto);
['push', 'pop'].forEach(method => {
  const original = arrayProto[method];
  arrayMethods[method] = function(...args) {
    const result = original.apply(this, args);
    dep.notify(); // 手动触发更新
    return result;
  };
});

Proxy 实现(Vue 3)

使用 Proxy 替代 Object.defineProperty

function reactive(obj) {
  return new Proxy(obj, {
    get(target, key) {
      track(target, key); // 依赖收集
      return Reflect.get(target, key);
    },
    set(target, key, value) {
      Reflect.set(target, key, value);
      trigger(target, key); // 触发更新
    }
  });
}

关键点总结

  • 递归劫持:Vue 2 需递归遍历对象的所有属性。
  • 性能优化:Vue 3 的 Proxy 无需递归,按需响应。
  • 数组处理:Vue 2 需特殊处理数组方法,Vue 3 的 Proxy 天然支持。

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

标签: vueobserver
分享给朋友:

相关文章

vue实现选择季度

vue实现选择季度

Vue 实现选择季度的几种方法 使用下拉选择框(Select) 在 Vue 中可以通过 v-model 绑定一个下拉选择框来实现季度选择。数据可以预先定义为一个包含季度选项的数组。 <tem…

vue实现条件判断

vue实现条件判断

Vue 条件判断实现方法 Vue 提供了多种方式实现条件判断,可以根据不同场景选择合适的方式。 v-if / v-else-if / v-else 这是 Vue 中最常用的条件渲染指令,根据表达式…

vue 指令实现

vue 指令实现

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

vue实现rtc

vue实现rtc

Vue 实现 RTC 的步骤 安装依赖 在 Vue 项目中安装 WebRTC 相关依赖,如 simple-peer 或 peerjs,用于简化 WebRTC 的实现。 运行以下命令安装 simple-…

vue实现表白

vue实现表白

Vue 实现表白页面 使用 Vue 可以快速创建一个动态、交互式的表白页面。以下是一个简单的实现方案: 基础结构 创建一个 Vue 项目或单文件组件,包含以下核心部分: <templat…

vue实现频道

vue实现频道

Vue实现频道功能的方法 使用Vue Router动态路由 通过Vue Router的动态路由功能可以轻松实现频道切换。在路由配置中定义动态参数,组件内通过this.$route.params获取当前…