【VUE】在vue中,Watcher与Dep的关系

关于vue中的WatcherDep的关系讨论。

这两者相互依赖,形成了一个比较完备的响应式系统。

  1. 一个组件实例对应一个Watcher(负责视图更新)
  2. 每个响应式属性,对应一个Dep
  3. 计算属性(computed)以及监听器(watch)都会创建各自的 watcher

1.数据属性 & Dep

js 复制代码
data() {
  return {
    count: 0,    // 会创建一个 Dep
    user: {      // user 对象和其每个属性都会创建各自的 Dep
      name: 'John',  // 一个 Dep
      age: 25     // 一个 Dep
    }
  }
}

对于一个对象,自身有一个Dep,其内在的每个属性都会有一个Dep,所以上述的user对象中,存在3个Dep。

2.watcher的类型

  1. 每个组件实例,都会创建一个watcher
  2. 依赖属性存在计算属性computed,也会存在一个watcher
  3. 监听器watch

3.依赖收集的过程

访问时的过程 ------> getter

js 复制代码
<div>{{ count }}</div>

// 渲染 Watcher 执行前,Dep.target 设置为渲染 Watcher
// 访问 count 时:
1. count 的 getter 被触发
2. 将当前 Dep.target (渲染 Watcher) 添加到 count 的 Dep 中
3. 同时这个 Watcher 也会记录这个 Dep
js 复制代码
Component Instance
│
├── Render Watcher (负责视图更新)
│   ├── 订阅了 count 的 Dep
│   ├── 订阅了 user.name 的 Dep
│   └── 订阅了其他模板中用到的数据的 Dep
│
├── Computed Watcher (如果有计算属性)
│   ├── 订阅了计算依赖的数据的 Dep
│   └── ...
│
└── User Watcher (如果有 watch 选项)
    ├── 订阅了被监听数据的 Dep
    └── ...

触发更新时的过程 ------> setter

当数据变化时:

  1. 数据的 setter 被触发
  2. 通知对应的 Dep
  3. Dep 通知所有订阅它的 Watcher
  4. Watcher 根据类型执行不同操作:
    • 渲染 Watcher → 触发组件重新渲染
    • 计算属性 Watcher → 重新计算
    • 用户 Watcher → 执行回调函数

总结起来

一个Watcher中存在多个Dep,依组件中的data中的属性而看

一个Dep中也可存在多个Watcher,如果此时的属性被computed或者watch依赖,那么就会存在多个Watcher

相关推荐
LaughingZhu5 小时前
Product Hunt 每日热榜 | 2026-05-21
前端·人工智能·经验分享·chatgpt·html
怕浪猫6 小时前
Electron 开发实战(一):从零入门核心基础与环境搭建
前端·electron·ai编程
Mahir086 小时前
Spring 循环依赖深度解密:从问题本质到三级缓存源码级解析
java·后端·spring·缓存·面试·循环依赖·三级缓存
小鹏linux6 小时前
Ubuntu 22.04 部署开源免费具有精美现代web页面的Casdoor账号管理系统
linux·前端·ubuntu·开源·堡垒机
前端若水7 小时前
会话管理:创建、切换、删除对话历史
前端·人工智能·python·react.js
绝知此事7 小时前
【算法突围 01】线性结构与哈希表:后端开发的收纳术
java·数据结构·算法·面试·jdk·散列表
Bigger7 小时前
mini-cc:一个轻量级 AI 编程助手的诞生
前端·ai编程·claude
涵涵(互关)8 小时前
Naive-ui树型选择器只显示根节点
前端·ui·vue
BY组态8 小时前
Ricon组态系统最佳实践:从零开始构建物联网监控平台
前端·物联网·iot·web组态·组态
BY组态8 小时前
Ricon组态系统vs传统组态软件:为什么选择新一代Web组态平台
前端·物联网·iot·web组态·组态