当前位置:首页 > 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中重置表格数据通常需要操作绑定的数据源,以下是几种常见实现方式: 直接重置数据源 // 假设表格绑定的是tableData this.tableData = [...t…

vue 实现复选

vue 实现复选

Vue 实现复选功能 在 Vue 中实现复选功能可以通过多种方式完成,以下是常见的几种方法: 使用 v-model 绑定数组 通过 v-model 绑定一个数组,可以自动收集用户选择的复选框值。…

vue  select实现

vue select实现

Vue Select 实现方法 在 Vue 中实现下拉选择功能可以使用原生 <select> 标签或第三方库如 vue-select。以下是两种方法的详细说明: 原生 HTML Sel…

vue实现同步

vue实现同步

Vue 实现同步的方法 在 Vue 中实现同步操作通常涉及数据绑定、状态管理和异步操作的处理。以下是几种常见的方法: 使用计算属性(Computed Properties) 计算属性基于响应式依赖进…

vue实现图册

vue实现图册

Vue实现图册功能 在Vue中实现图册功能通常涉及图片展示、切换、缩放等交互效果。以下是常见的实现方法和关键代码示例: 基础图册组件结构 使用Vue单文件组件构建基础结构: <templat…

vue实现RTMP

vue实现RTMP

Vue 中实现 RTMP 流播放 RTMP(Real-Time Messaging Protocol)是一种用于实时音视频流传输的协议。在 Vue 中实现 RTMP 播放通常需要借助第三方库或播放器。…