当前位置:首页 > 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 实现看板功能 使用 Vue 实现看板功能可以通过组件化开发、状态管理和拖拽库结合完成。以下是一个完整的实现方案: 基础项目结构 src/ ├── components/ │ ├── Ka…

vue 实现注册

vue 实现注册

Vue 实现注册功能 注册功能通常包括表单验证、数据提交和用户反馈。以下是实现注册功能的步骤: 1. 创建注册表单组件 在 Vue 项目中创建一个注册表单组件,包含用户名、邮箱、密码等输入字段。…

vue实现弹幕

vue实现弹幕

Vue 实现弹幕功能 弹幕功能通常包括动态生成、滚动显示、颜色和速度随机化等特性。以下是基于 Vue 3 的实现方法。 核心思路 使用 CSS 动画控制弹幕从右向左滚动。 动态生成弹幕数据,随机设置…

vue实现阻塞

vue实现阻塞

Vue 实现阻塞的方法 在 Vue 中实现阻塞操作通常涉及异步控制、状态管理或生命周期钩子的使用。以下是几种常见方法: 使用 async/await 处理异步阻塞 通过 async/await 可…

vue 实现登录验证

vue 实现登录验证

Vue 实现登录验证的方法 使用 Vue Router 进行路由守卫 在 Vue 项目中,可以通过 Vue Router 的路由守卫(Navigation Guards)实现登录验证。路由守卫可以在路…

vue实现全屏滚动

vue实现全屏滚动

实现全屏滚动的 Vue 方法 使用第三方库 vue-fullpage.js 安装 vue-fullpage.js: npm install vue-fullpage.js 在 Vue 项目中引入并注…