当前位置:首页 > VUE

vue 监听实现原理

2026-01-17 10:17:20VUE

Vue 监听实现原理

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

数据劫持

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

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 操作。同一事件循环内的多次数据变更会合并为一次视图更新。

vue 监听实现原理

监听 API 实现

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

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

相关文章

vue实现签约合作弹窗

vue实现签约合作弹窗

实现签约合作弹窗的步骤 使用Vue实现签约合作弹窗可以通过组件化方式完成,结合模态框和表单交互逻辑。以下是具体实现方法: 1. 创建弹窗组件 新建一个Vue组件文件(如SignContractDia…

vue实现visual

vue实现visual

Vue 实现可视化(Visual)的常见方法 在 Vue 中实现可视化通常涉及数据可视化库的集成,以下是几种主流方案: 使用 ECharts ECharts 是一个强大的 JavaScript 图表…

vue实现全屏

vue实现全屏

Vue 实现全屏功能的方法 在 Vue 中实现全屏功能可以通过浏览器提供的 Fullscreen API 来实现。以下是几种常见的实现方式: 使用原生 Fullscreen API 通过调用 doc…

vue实现webapp

vue实现webapp

Vue 实现 WebApp 的基本步骤 环境准备 确保已安装 Node.js 和 npm/yarn。通过 Vue CLI 或 Vite 创建项目: npm install -g @vue/cli v…

vue实现api

vue实现api

Vue 实现 API 调用 在 Vue 中调用 API 通常涉及使用 axios 或 fetch 发送 HTTP 请求,并结合 Vue 的响应式特性管理数据。以下是常见的实现方式: 安装 axios…

vue实现监控

vue实现监控

Vue 实现监控功能的方法 在 Vue 中实现监控功能通常涉及数据变化监听、事件监听或第三方监控工具集成。以下是几种常见实现方式: 使用 Vue 的 watch 监听数据变化 通过 watch 可以…