当前位置:首页 > VUE

vue监听实现原理

2026-01-17 19:24:29VUE

Vue 监听实现原理

Vue 的监听机制主要依赖于响应式系统和依赖收集,通过 Object.definePropertyProxy 实现数据劫持,并在数据变化时触发更新。

核心概念:响应式系统

Vue 的响应式系统通过劫持数据的访问和修改,在数据变化时自动更新依赖该数据的视图或计算属性。以下是实现的关键步骤:

  1. 数据劫持
    对于对象属性,Vue 使用 Object.defineProperty(Vue 2)或 Proxy(Vue 3)拦截属性的读取和设置操作。

    • Object.defineProperty 示例:
      Object.defineProperty(obj, key, {
        get() {
          // 依赖收集
          return val
        },
        set(newVal) {
          // 触发更新
          val = newVal
        }
      })
    • Proxy 示例(Vue 3):
      new Proxy(obj, {
        get(target, key) { /* 依赖收集 */ },
        set(target, key, newVal) { /* 触发更新 */ }
      })
  2. 依赖收集
    在属性的 getter 中,Vue 会将当前正在执行的“依赖”(如组件的渲染函数、计算属性等)记录到一个全局的依赖管理器中(如 Dep 类)。

    vue监听实现原理

    • 每个属性对应一个 Dep 实例,用于存储所有依赖它的“订阅者”(Watcher 实例)。
    • 当属性被访问时,当前 Watcher 会被添加到 Dep 的订阅列表中。
  3. 触发更新
    当属性被修改时,setter 会通知对应的 Dep 实例,遍历所有订阅的 Watcher 并执行其更新逻辑(如重新渲染组件)。

监听的具体实现

Vue 提供了 watchcomputed 两种监听方式,底层均基于上述响应式系统:

  1. watch 的实现

    vue监听实现原理

    • 创建一个 Watcher 实例,传入回调函数和监听的属性路径。
    • 在初始化时,Watcher 会主动触发一次属性的 getter,从而完成依赖收集。
    • 当属性变化时,Watcher 的回调函数会被调用。
  2. computed 的实现

    • 计算属性本质是一个惰性求值的 Watcher,仅在依赖的属性变化时重新计算。
    • 计算属性会缓存结果,避免重复计算。

示例代码解析

以下是一个简化的 WatcherDep 实现:

class Dep {
  constructor() {
    this.subscribers = []
  }
  depend() {
    if (target && !this.subscribers.includes(target)) {
      this.subscribers.push(target)
    }
  }
  notify() {
    this.subscribers.forEach(sub => sub())
  }
}

let target = null

function watchEffect(fn) {
  target = fn
  fn() // 触发依赖收集
  target = null
}

const depsMap = new WeakMap()

function reactive(obj) {
  return new Proxy(obj, {
    get(target, key) {
      let dep = depsMap.get(target)
      if (!dep) {
        dep = new Dep()
        depsMap.set(target, dep)
      }
      dep.depend()
      return Reflect.get(target, key)
    },
    set(target, key, newVal) {
      Reflect.set(target, key, newVal)
      const dep = depsMap.get(target)
      if (dep) dep.notify()
      return true
    }
  })
}

总结

Vue 的监听机制通过以下步骤实现:

  • 数据劫持拦截属性的读写操作。
  • 依赖收集在属性访问时记录依赖关系。
  • 触发更新在属性修改时通知所有依赖项。
  • watchcomputed 基于相同的响应式系统,但分别适用于异步回调和高性能计算场景。

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

相关文章

vue按钮实现截屏

vue按钮实现截屏

Vue 按钮实现截屏的方法 在 Vue 项目中实现截屏功能可以通过多种方式完成,以下是几种常见的方法: 使用 html2canvas 库 安装 html2canvas 库: npm install…

vue实现画圆弧并着色

vue实现画圆弧并着色

在 Vue 中实现画圆弧并着色 使用 Canvas API 绘制圆弧 在 Vue 组件的 mounted 钩子中,通过 Canvas API 绘制圆弧。创建一个 canvas 元素并获取其上下文:…

vue实现route

vue实现route

Vue 路由实现方法 Vue 中实现路由通常使用 vue-router 库,这是 Vue 官方推荐的路由管理器。以下是具体实现步骤: 安装 vue-router 通过 npm 或 yarn 安装…

vue实现机制

vue实现机制

Vue 实现机制的核心原理 Vue.js 的核心实现机制主要基于响应式系统、虚拟 DOM 和组件化设计。以下是关键实现细节: 响应式系统 Vue 通过 Object.defineProperty(V…

vue  实现tab

vue 实现tab

实现 Tab 切换功能 在 Vue 中实现 Tab 切换功能可以通过动态组件或条件渲染完成。以下是两种常见方法: 使用 v-if 或 v-show 实现条件渲染 通过绑定 currentTab 变量…

lua 实现vue

lua 实现vue

在 Lua 中实现类似 Vue 的响应式框架需要模拟 Vue 的核心功能,包括数据绑定、模板渲染和依赖追踪。以下是实现的关键思路和代码示例: 响应式数据绑定 使用 Lua 的 __index 和 _…