当前位置:首页 > 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 实现好评弹框的方法 使用 Vue 实现好评弹框可以通过组件化方式完成,结合动态数据绑定和事件处理。以下是具体实现步骤: 1. 创建弹框组件 新建一个 RatingDialog.vue…

前端vue登录功能实现

前端vue登录功能实现

Vue 登录功能实现步骤 创建登录表单组件 在 Vue 项目中创建一个登录组件,通常命名为 Login.vue。该组件包含用户名和密码输入框以及提交按钮。 <template> &l…

vue实现适老化样式

vue实现适老化样式

Vue 实现适老化样式的关键方法 全局字体与字号调整 通过 CSS 变量或主题配置统一放大基础字号,建议正文不小于 18px,标题更大。在 App.vue 中设置全局样式: :root { -…

vue实现活动倒计时

vue实现活动倒计时

实现活动倒计时的基本思路 在Vue中实现活动倒计时通常需要获取当前时间与活动结束时间的差值,并将其转换为天、小时、分钟、秒的格式展示。通过定时器每秒更新显示的时间。 定义倒计时数据 在Vue组件的…

vue实现ai

vue实现ai

Vue 实现 AI 功能 Vue.js 可以通过集成第三方 AI 服务或本地 AI 模型来实现 AI 功能。以下是几种常见的方法: 集成第三方 AI API 使用 Vue 调用如 OpenAI、G…

vue实现递归

vue实现递归

Vue 实现递归组件的方法 在 Vue 中实现递归组件通常用于处理树形结构数据(如菜单、评论列表、文件目录等)。以下是具体实现方法: 定义递归组件 通过 name 选项让组件可以递归调用自身:…