当前位置:首页 > VUE

vue实现依赖收集

2026-03-28 15:36:50VUE

Vue 依赖收集的实现原理

Vue 的依赖收集主要通过响应式系统完成,核心涉及 ObserverDepWatcher 三个类。以下是具体实现方式:

响应式数据初始化

通过 Object.definePropertyProxy 对数据对象进行劫持,拦截属性的读取和修改操作。Vue 2.x 使用前者,Vue 3.x 使用后者。

// Vue 2.x 的 defineProperty 实现
function defineReactive(obj, key, val) {
  const dep = new Dep() // 每个属性对应一个 Dep 实例

  Object.defineProperty(obj, key, {
    get() {
      if (Dep.target) { // 当前 Watcher 存在时收集依赖
        dep.depend()
      }
      return val
    },
    set(newVal) {
      if (newVal === val) return
      val = newVal
      dep.notify() // 数据变化时通知更新
    }
  })
}

Dep 依赖管理器

Dep 类负责管理一组 Watcher,实现依赖的添加和通知。

class Dep {
  constructor() {
    this.subs = [] // 存储 Watcher 实例
  }

  depend() {
    if (Dep.target) {
      Dep.target.addDep(this) // Watcher 记录 Dep
    }
  }

  notify() {
    const subs = this.subs.slice()
    for (let i = 0; i < subs.length; i++) {
      subs[i].update() // 触发 Watcher 更新
    }
  }
}
Dep.target = null // 静态属性指向当前 Watcher

Watcher 观察者

Watcher 实例在初始化时会触发 getter 函数,从而触发依赖收集。

class Watcher {
  constructor(vm, expOrFn, cb) {
    this.vm = vm
    this.getter = parsePath(expOrFn)
    this.cb = cb
    this.value = this.get()
  }

  get() {
    Dep.target = this // 设置当前 Watcher
    const value = this.getter.call(this.vm, this.vm) // 触发 getter
    Dep.target = null // 收集完成后清除
    return value
  }

  addDep(dep) {
    dep.addSub(this) // Dep 记录 Watcher
  }

  update() {
    // 触发组件更新或回调
    this.run()
  }
}

依赖收集流程

  1. 组件渲染时创建 Watcher 实例,触发 get() 方法
  2. Dep.target 被设置为当前 Watcher
  3. 访问数据属性时触发 getter,调用 dep.depend()
  4. Watcher 记录所有关联的 Dep,同时 Dep 记录 Watcher
  5. 数据变更时通过 dep.notify() 通知所有关联 Watcher 更新

Vue 3 的改进

Vue 3 改用 Proxy 实现响应式,依赖收集原理类似但更高效:

const reactive = (target) => {
  return new Proxy(target, {
    get(target, key, receiver) {
      track(target, key) // 依赖收集
      return Reflect.get(target, key, receiver)
    },
    set(target, key, value, receiver) {
      Reflect.set(target, key, value, receiver)
      trigger(target, key) // 触发更新
    }
  })
}

关键区别在于:

vue实现依赖收集

  • 无需递归遍历对象属性
  • 可自动检测新增/删除属性
  • 性能更好,尤其对大型对象

标签: vue
分享给朋友:

相关文章

vue表单实现搜索

vue表单实现搜索

实现Vue表单搜索功能 在Vue中实现表单搜索功能通常涉及表单绑定、事件处理和搜索逻辑。以下是具体实现方法: 数据绑定与表单结构 使用v-model实现表单与Vue数据的双向绑定: <tem…

vue实现编辑

vue实现编辑

Vue 实现编辑功能 在 Vue 中实现编辑功能通常涉及表单绑定、状态管理和事件处理。以下是一个常见的实现方法: 双向数据绑定 使用 v-model 指令实现表单元素与数据的双向绑定: <i…

vue底层实现

vue底层实现

Vue.js 的底层实现原理 Vue.js 是一个渐进式 JavaScript 框架,其核心实现主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是其关键实现细节: 响应式系统 Vue 2…

vue filter 实现

vue filter 实现

在 Vue.js 中,过滤器(Filter)是一种用于文本格式化的功能,可以在模板中直接使用。以下是实现过滤器的详细方法: 全局过滤器注册 通过 Vue.filter 方法注册全局过滤器,可在所有组…

vue实现vr

vue实现vr

Vue 实现 VR 的方法 Vue 可以与 WebVR 或 WebXR API 结合使用,通过 Three.js、A-Frame 等库实现 VR 效果。以下是几种常见方法: 使用 A-Frame 框…

vue实现页面

vue实现页面

Vue 实现页面的基本方法 创建 Vue 项目 使用 Vue CLI 快速初始化项目,运行以下命令安装并创建项目: npm install -g @vue/cli vue create my-pro…