当前位置:首页 > VUE

vue observer实现

2026-03-27 14:33:48VUE

Vue Observer 实现原理

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

Vue 2.x 的 Observer

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

function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    get() {
      console.log('get:', key);
      return val;
    },
    set(newVal) {
      if (newVal === val) return;
      console.log('set:', key);
      val = newVal;
    }
  });
}

依赖收集 每个属性维护一个 Dep 实例,用于存储依赖(Watcher):

class Dep {
  constructor() {
    this.subs = new Set();
  }
  addSub(sub) {
    this.subs.add(sub);
  }
  notify() {
    this.subs.forEach(sub => sub.update());
  }
}

Observer 类 递归观测整个对象:

class Observer {
  constructor(value) {
    this.walk(value);
  }
  walk(obj) {
    Object.keys(obj).forEach(key => {
      defineReactive(obj, key, obj[key]);
    });
  }
}

Vue 3.x 的 Observer

Proxy 实现 改用 Proxy 实现数据劫持,解决 Vue 2.x 的局限性(如数组检测、新增属性等):

function reactive(obj) {
  return new Proxy(obj, {
    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;
    }
  });
}

Effect 系统 使用 effect 替代 Watcher,基于 Proxy 的响应式更高效:

vue observer实现

let activeEffect;
function effect(fn) {
  activeEffect = fn;
  fn();
  activeEffect = null;
}

关键差异对比

  • 性能:Proxy 无需递归初始化全部属性,按需响应
  • 数组处理:Proxy 直接支持数组索引修改和 push 等方法
  • API 设计:Vue 3.x 的 reactive/ref 更灵活,兼容组合式 API

实现注意事项

  1. 避免循环引用导致栈溢出
  2. __proto__ 等特殊属性需做安全处理
  3. 嵌套对象的深度观测需要惰性化以优化性能

完整实现需结合虚拟 DOM 和调度系统,但以上代码已展示核心响应式原理。实际开发中建议直接使用 Vue 提供的 API,而非手动实现。

标签: vueobserver
分享给朋友:

相关文章

vue实现添加用户

vue实现添加用户

Vue 实现添加用户功能 数据绑定与表单设计 在 Vue 中实现添加用户功能,首先需要设计一个表单,用于收集用户输入的数据。通过 v-model 实现双向数据绑定,确保表单数据与 Vue 实例中的数据…

vue实现iframe

vue实现iframe

Vue 中实现 iframe 的方法 在 Vue 项目中,可以通过多种方式实现 iframe 的嵌入。以下是几种常见的方法: 使用原生 HTML iframe 标签 直接在 Vue 组件的模板中使用…

甘特图vue实现

甘特图vue实现

甘特图 Vue 实现方法 使用开源库 vue-ganttastic 安装依赖: npm install vue-ganttastic 基础实现代码: <template> <…

vue 实现excel

vue 实现excel

Vue 实现 Excel 功能 前端导出 Excel 使用 xlsx 库可以轻松实现前端 Excel 导出功能。安装依赖: npm install xlsx 导出 Excel 示例代码: impo…

node vue实现

node vue实现

Node.js 与 Vue.js 实现方案 环境搭建 安装 Node.js(建议 LTS 版本),通过 npm 或 yarn 初始化项目。Vue.js 可通过 Vue CLI 快速搭建: npm…

vue怎么实现 tab

vue怎么实现 tab

Vue 实现 Tab 的方法 使用动态组件和 v-if 通过动态组件或 v-if 指令切换不同 Tab 内容,结合点击事件改变当前激活的 Tab。 <template> &l…