当前位置:首页 > VUE

vue为啥能实现监听

2026-01-07 02:11:43VUE

Vue 实现监听的原理

Vue 的监听能力主要基于其响应式系统,该系统通过数据劫持和依赖收集实现。当数据变化时,系统能自动触发视图更新或执行回调函数。

核心机制:Object.defineProperty 或 Proxy

Vue 2.x 使用 Object.defineProperty 对对象的属性进行劫持,通过定义 getter 和 setter 实现数据监听。当属性被访问时,getter 会收集依赖(如模板中的渲染函数或计算属性);当属性被修改时,setter 会通知依赖进行更新。

Vue 3.x 改用 Proxy 代理整个对象,能直接监听对象和数组的变化,无需递归遍历属性或重写数组方法。Proxy 提供了更全面的拦截能力,支持动态新增属性的监听。

vue为啥能实现监听

依赖收集与派发更新

依赖收集:在 getter 中,当前执行的 Watcher(如组件渲染函数)会被记录为属性的依赖。Vue 通过一个全局的 Dep 类管理依赖关系。

派发更新:在 setter 或 Proxy 的拦截器中,当数据变化时,会触发 Dep.notify() 通知所有 Watcher 执行更新。Watcher 可能重新渲染组件、执行计算属性或用户定义的 watch 回调。

vue为啥能实现监听

示例代码:Vue 2.x 的响应式实现片段

function defineReactive(obj, key, val) {
  const dep = new Dep(); // 管理依赖的实例
  Object.defineProperty(obj, key, {
    get() {
      if (Dep.target) { // 当前运行的 Watcher
        dep.addSub(Dep.target); // 收集依赖
      }
      return val;
    },
    set(newVal) {
      if (newVal === val) return;
      val = newVal;
      dep.notify(); // 通知更新
    }
  });
}

数组的特殊处理

Vue 2.x 中,由于 Object.defineProperty 无法监听数组索引变化,Vue 重写了数组的 pushpop 等原型方法。这些方法被调用时会手动触发更新通知。

Vue 3.x 的 Proxy 可以直接监听数组索引和长度变化,无需特殊处理。

异步更新队列

为提高性能,Vue 将数据变更后的更新操作放入异步队列。多次数据修改会合并为一次视图更新,通过 nextTick 机制确保更新完成后执行用户回调。

标签: vue
分享给朋友:

相关文章

vue实现简单的弹窗

vue实现简单的弹窗

使用 Vue 实现简单弹窗 组件基础结构 创建一个名为 Modal.vue 的组件文件,包含模板、脚本和样式部分: <template> <div class="mod…

vue实现防抖节流

vue实现防抖节流

Vue 中实现防抖(Debounce) 防抖的核心是延迟执行函数,在连续触发时取消前一次的调用,只执行最后一次。适用于输入框搜索、窗口大小调整等场景。 方法1:使用 Lodash 的 _.debou…

vue element实现

vue element实现

Vue Element UI 实现 Vue Element UI 是基于 Vue.js 的组件库,提供丰富的 UI 组件,适合快速开发企业级中后台产品。以下是一些关键实现方法和步骤: 安装 Vue…

vue 实现拖动

vue 实现拖动

Vue 实现拖动的几种方法 在Vue中实现拖动功能可以通过多种方式,包括原生HTML5的拖放API、第三方库如vuedraggable等。以下是几种常见的实现方法: 使用HTML5拖放API HTM…

vue实现路径

vue实现路径

Vue 实现路径的方法 在 Vue 中实现路径管理通常涉及 Vue Router 的使用,以下是一些常见的实现方法: 安装 Vue Router 通过 npm 或 yarn 安装 Vue Route…

vue 实现异步加载

vue 实现异步加载

Vue 实现异步加载的方法 使用动态 import 实现组件懒加载 在 Vue 中可以通过动态 import() 语法实现组件的异步加载,这会使得组件在需要时才被加载,减少初始加载时间。 const…