当前位置:首页 > VUE

vue为啥能实现监听

2026-02-09 13:59:29VUE

Vue 监听机制的核心原理

Vue 实现监听的核心依赖于 JavaScript 的 Object.defineProperty(Vue 2.x)或 Proxy(Vue 3.x)特性。通过劫持数据对象的属性访问和修改,触发依赖收集与更新通知。

基于 Object.defineProperty 的实现(Vue 2.x)

通过定义属性的 gettersetter 拦截操作:

  • 依赖收集:在 getter 中记录当前依赖(如 Watcher 实例)。
  • 触发更新:在 setter 中通知依赖进行更新,执行重新渲染或回调函数。

示例代码逻辑:

function defineReactive(obj, key) {
  let value = obj[key];
  const dep = new Dep(); // 依赖管理容器

  Object.defineProperty(obj, key, {
    get() {
      if (Dep.target) dep.depend(); // 收集依赖
      return value;
    },
    set(newVal) {
      if (newVal === value) return;
      value = newVal;
      dep.notify(); // 通知更新
    }
  });
}

基于 Proxy 的实现(Vue 3.x)

Proxy 提供更全面的拦截能力,支持数组和动态新增属性:

  • 拦截操作:代理对象的读取(get)、修改(set)、删除(deleteProperty)等操作。
  • 性能优化:避免递归遍历对象属性,按需响应。

示例代码逻辑:

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;
    }
  });
};

依赖管理机制

  • Watcher 与 Dep:每个响应式属性关联一个 Dep 实例,用于存储依赖的 Watcher(如组件渲染函数、计算属性等)。
  • 派发更新:数据变化时,Dep 通知所有 Watcher 执行更新,可能触发虚拟 DOM 的重新渲染或用户定义的回调。

数组的特殊处理

Vue 2.x 中通过重写数组方法(如 pushpop)实现监听:

vue为啥能实现监听

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);
    this.__ob__.dep.notify(); // 手动触发更新
    return result;
  };
});

总结对比

  • Vue 2.x:基于 Object.defineProperty,需递归初始化属性,对数组需特殊处理。
  • Vue 3.x:基于 Proxy,支持动态属性,性能更高,但需环境支持 ES6。

标签: vue
分享给朋友:

相关文章

vue分类实现

vue分类实现

Vue分类实现方法 在Vue中实现分类功能通常涉及数据分组、动态渲染和交互逻辑。以下是几种常见的实现方式: 基于计算属性的分类 通过计算属性对原始数据进行分组处理,适合静态或少量数据分类: com…

vue实现 hover

vue实现 hover

实现 Vue 中的 hover 效果 在 Vue 中实现 hover 效果可以通过多种方式完成,以下是常见的几种方法: 使用 CSS 伪类 最简单的方式是直接使用 CSS 的 :hover 伪类,无…

vue实现ide

vue实现ide

Vue 实现 IDE 的基本思路 使用 Vue 构建一个简易的集成开发环境(IDE)需要整合代码编辑器、文件管理、终端模拟等功能。以下是关键实现步骤和推荐工具。 核心功能模块 代码编辑器 使用…

vue如何实现排序

vue如何实现排序

实现数组排序 在Vue中实现数组排序可以通过computed属性或methods来处理。假设有一个数组items,可以创建一个计算属性返回排序后的数组: data() { return {…

用vue实现全选

用vue实现全选

实现全选功能的基本思路 在Vue中实现全选功能通常涉及以下核心逻辑:通过一个布尔值控制全选状态,遍历子选项并同步其选中状态。以下是具体实现方法。 使用v-model绑定全选状态 在模板中,使用v-m…

vue实现导航栏

vue实现导航栏

使用 Vue 实现导航栏 基础导航栏结构 在 Vue 中实现导航栏通常使用 <router-link> 或自定义组件。以下是一个基础示例: <template> <…