当前位置:首页 > 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.js实现轮播

vue.js实现轮播

vue.js实现轮播的方法 使用第三方库(如Swiper) 安装Swiper库: npm install swiper 在Vue组件中引入Swiper: <template>…

vue实现视频开场

vue实现视频开场

使用 Vue 实现视频开场动画 在 Vue 中实现视频开场动画可以通过结合 HTML5 的 <video> 标签和 Vue 的过渡效果或生命周期钩子来完成。以下是具体实现方法: 安装依赖…

vue实现检测数组

vue实现检测数组

Vue 中检测数组变化的方法 Vue 的响应式系统无法直接检测到数组的某些变化,因为 JavaScript 的限制。以下是一些解决方案: 使用 Vue.set 或 this.$set Vue…

vue前端实现搜索

vue前端实现搜索

实现搜索功能的基本方法 在Vue中实现搜索功能通常涉及以下几个关键步骤,结合数据绑定、计算属性和方法调用来动态过滤和显示结果。 数据绑定与输入处理 使用v-model双向绑定搜索输入框的值,监听用…

vue实现菜单调用

vue实现菜单调用

Vue 实现动态菜单的常见方法 基于路由配置生成菜单 Vue Router 的路由配置可以天然转化为菜单结构,适合权限与路由绑定的系统: // router/index.js const rout…

vue怎么实现选中删除

vue怎么实现选中删除

实现选中删除功能的方法 在Vue中实现选中删除功能通常涉及以下几个关键步骤: 数据绑定与选中状态管理 使用v-model或v-for指令绑定列表数据,结合复选框或单选按钮实现选中状态管理。例如:…