当前位置:首页 > 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:

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 中通知依赖更新:

    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

vue observer实现

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 实现发表功能 在 Vue 中实现发表功能通常涉及表单处理、数据绑定和网络请求。以下是实现步骤和代码示例: 表单设计与数据绑定 创建一个表单用于输入发表内容,使用 v-model 进行数据双向…

vue实现轮询

vue实现轮询

实现轮询的基本方法 在Vue中实现轮询可以通过setInterval或setTimeout配合递归调用完成。轮询通常用于定期向服务器请求数据更新。 使用setInterval的简单示例: data…

实现 vue ssr

实现 vue ssr

Vue SSR 实现方法 Vue SSR(Server-Side Rendering)通过服务器端渲染 Vue 应用,提升首屏加载速度和 SEO 友好性。以下是核心实现方法: 基础配置 安装必要依赖…

vue实现拍照

vue实现拍照

Vue实现拍照功能 在Vue中实现拍照功能通常需要结合浏览器的MediaDevices API和Canvas元素。以下是具体实现方法: 安装依赖(可选) 如果需要更简单的封装,可以安装vue-web…

vue实现 toast

vue实现 toast

Vue 实现 Toast 组件 在 Vue 中实现 Toast 组件可以通过多种方式完成,以下是几种常见的方法: 使用全局组件和事件总线 创建一个全局的 Toast 组件,并通过事件总线或 Vue…

vue实现逻辑

vue实现逻辑

Vue 实现逻辑的核心概念 Vue.js 是一个渐进式 JavaScript 框架,其核心逻辑围绕数据驱动和组件化开发。通过响应式系统、虚拟 DOM 和组件生命周期等机制,Vue 实现了高效的前端开发…