当前位置:首页 > 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实现aop切面

vue实现aop切面

Vue 实现 AOP 切面编程的方法 在 Vue 中实现 AOP(面向切面编程)可以通过多种方式,以下是几种常见的实现方法: 使用 Vue 混入(Mixins) Vue 的混入机制可以用于实现横切…

vue实现网页切换

vue实现网页切换

Vue 实现网页切换的方法 在 Vue 中实现网页切换通常可以通过以下几种方式完成,具体取决于项目需求和路由管理方式。 使用 Vue Router Vue Router 是 Vue.js 官方提供的…

vue伪函数实现

vue伪函数实现

Vue 伪函数实现方法 伪函数(Mock Function)在 Vue 中常用于测试或模拟某些逻辑,以下是几种常见的实现方式: 使用 Jest 的 jest.fn() 在单元测试中,可以通过 Je…

vue实现多个tab

vue实现多个tab

Vue 实现多个 Tab 的方法 使用动态组件切换 在 Vue 中可以通过动态组件 <component :is="currentTab"> 结合 v-for 和 v-bind 实现多个…

vue表格实现教学

vue表格实现教学

Vue 表格实现方法 使用原生HTML表格 在Vue模板中直接使用HTML的<table>标签,结合v-for动态渲染数据: <template> <table&g…

vue实现前端注册

vue实现前端注册

Vue 实现前端注册功能 注册表单设计 使用 Vue 的模板语法创建注册表单,包含用户名、邮箱、密码和确认密码字段。表单需绑定 v-model 实现双向数据绑定。 <template>…