当前位置:首页 > VUE

vue 监听实现原理

2026-01-17 10:17:20VUE

Vue 监听实现原理

Vue 的监听机制主要通过 Object.definePropertyProxy 实现数据劫持,结合观察者模式(Observer-Watcher-Dep)完成依赖收集和派发更新。

vue 监听实现原理

数据劫持

对于 Vue 2.x,使用 Object.defineProperty 递归遍历对象的属性,将其转换为 getter/setter:

vue 监听实现原理

function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    get() {
      console.log('读取属性', key);
      return val;
    },
    set(newVal) {
      if (newVal === val) return;
      console.log('更新属性', key);
      val = newVal;
    }
  });
}

Vue 3.x 改用 Proxy 代理整个对象,无需递归初始化:

const observed = new Proxy(obj, {
  get(target, key) {
    console.log('读取属性', key);
    return Reflect.get(target, key);
  },
  set(target, key, value) {
    console.log('更新属性', key);
    return Reflect.set(target, key, value);
  }
});

依赖收集与派发更新

  1. Observer:递归将数据对象转为响应式,为每个属性创建 Dep 实例(依赖管理器)。
  2. Watcher:在模板编译或手动调用 $watch 时创建,触发 getter 时将自身存入当前 Dep
  3. Dep:维护一个订阅者数组(Watcher 列表),数据变更时通过 setter 触发 dep.notify() 通知所有 Watcher 更新。

异步更新队列

Vue 通过 nextTick 实现异步批量更新,避免频繁 DOM 操作。同一事件循环内的多次数据变更会合并为一次视图更新。

监听 API 实现

  • $watch:内部创建 Watcher 实例,绑定回调函数。
  • watch 选项:组件初始化时遍历监听属性,为每个属性创建 Watcher。
  • 计算属性:基于 Watcher 的惰性求值,依赖变化时标记为脏数据,下次访问时重新计算。

标签: 原理vue
分享给朋友:

相关文章

vue路由实现原理

vue路由实现原理

Vue 路由实现原理 Vue Router 是 Vue.js 官方的路由管理器,其核心原理基于前端路由的实现方式,主要包括哈希模式(Hash Mode)和历史模式(History Mode)。以下是其…

vue实现添加用户

vue实现添加用户

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

vue实现tab换行

vue实现tab换行

Vue实现Tab切换的常见方法 使用Vue实现Tab切换功能可以通过多种方式完成,以下是几种常见的方法: 动态组件结合v-if或v-show 通过v-if或v-show控制不同Tab内容的显示与隐…

vue实现无线滚动列表

vue实现无线滚动列表

无限滚动列表的实现方法 在Vue中实现无限滚动列表通常结合监听滚动事件和动态加载数据。以下是几种常见方法: 使用自定义指令 创建自定义指令v-infinite-scroll监听滚动事件: Vu…

vue异步组建实现原理

vue异步组建实现原理

Vue 异步组件实现原理 Vue 的异步组件允许将组件按需加载,通常用于代码分割或延迟加载非关键组件。其核心原理基于 Promise 和动态导入。 基本实现方式 通过 defineAsyncComp…

vue实现画圆弧并着色

vue实现画圆弧并着色

在 Vue 中实现画圆弧并着色 使用 Canvas API 绘制圆弧 在 Vue 组件的 mounted 钩子中,通过 Canvas API 绘制圆弧。创建一个 canvas 元素并获取其上下文:…