当前位置: 首页 > news >正文

Vue响应式原理三:响应式依赖收集-类

前提:实际开发中,响应式对象肯定是不止一个对象的, 使用数组reactiveFns, 所有依赖的函数都放到数组里面,是满足不了多个响应式对象,使用类单独来管理一个对象所有的依赖

1. 响应式依赖收集-类

  • 1.1. 类结构:创建Depend类来管理响应式依赖,包含reactiveFns数组存储依赖函数
  • 1.2. 核心方法:
  • addDepend(fn):添加依赖函数到数组,会先判断fn是否存在
  • notify():遍历执行所有收集的依赖函数
  • 代码如下:
	// 使用类单独来管理一个对象所有的依赖class Depend {constructor() {this.reactiveFns = [];}addDepend (fn) {if(fn) {// 将依赖函数添加到数组,this.reactiveFns.push(fn);}}notify () {this.reactiveFns.forEach(fn => {// 遍历执行所有收集的依赖函数fn()})}}
  • 1.3. 优势: 相比单一数组管理,可以针对不同对象创建独立的Depend实例,避免所有依赖混在一起
  • 1.4. 执行过程
    • 创建Depend实例:const dep = new Depend()
    • 收集依赖:通过watchFn函数调用dep.addDepend(fn)
    • 触发更新:修改属性后手动调用dep.notify()
    • 示例代码如下:
    	// 创建Depend实例const dep = new Depend()function watchFn (fn) {dep.addDepend(fn)// 传入函数后立即执行一次,类似watchEffect()fn()}// 响应式函数watchFn(function foo () {console.log('foo: ', obj.name);console.log('foo: ', obj.age);console.log('foo function');})watchFn(function bar () {console.log('bar: ', obj.name + ' hello');console.log('bar: ', obj.age + 10);console.log('bar function');})// 修改obj的属性obj.name = 'kobe'// 当依赖发生变化时,会执行对应的响应式函数dep.notify()```
    
  • 1.5. 当前问题:
  • 每次属性修改后需要手动调用dep.notify()
  • 容易遗漏导致依赖不更新
  • 多个属性变更时需要多次调用
	// 参考上面的代码...// 修改obj的属性console.log('name发生变化时----------------------------------------');obj.name = 'kobe'// 当依赖发生变化时,会执行对应的响应式函数dep.notify()// 再次修改obj的属性obj.name = 'james'// 每次手动通知,一旦忘记就不是响应式了// dep.notify()
  • 1.6. 后续改进:
  • 将展示如何自动创建依赖收集器
  • 实现属性变更自动通知机制
http://www.xdnf.cn/news/1092187.html

相关文章:

  • 【Python】FastApi
  • 腾讯云COS,阿里云OSS对象存储服务-删除操作的响应码204
  • S7-1500——(一)西门子PLC编程从入门到精通4、SCL间接寻址
  • 项目进度受制于资源分配,如何动态调配资源
  • LeetCode 138题解 | 随机链表的复制
  • 5202年安装TensorFlow纪实
  • 向量空间 线性代数
  • 解锁HTML5页面生命周期API:前端开发的新视角
  • 超越公有云:在裸金属服务器上构建低成本、高性能的静态资源服务
  • STM32 使用HAL库获取us时间
  • 【使用Flask基于PaddleOCR3.0开发一个接口 调用时报错RuntimeError: std::exception】
  • HCIP(综合实验)
  • 代码随想录总结
  • css 设置 input 插入光标样式
  • 20250709: WSL+Pycharm 搭建 Python 开发环境
  • C++11 future、promise实现原理
  • 基于Matlab多特征融合的可视化指纹识别系统
  • 微算法科技从量子比特到多级系统,Qudits技术革新引领量子计算新时代
  • 三、Docker常用命令
  • React、Vue、Angular的性能优化与源码解析概述
  • upload-labs靶场通关详解:第19关 条件竞争(二)
  • Mysql组合索引的update在多种情况下的间隙锁的范围(简单来说)
  • 嵌入式调试LOG日志输出(以STM32为例)
  • 自建ELK vs 云商日志服务:成本对比分析
  • [Backlog] Git操作 | 任务数据结构 | Markdown 处理
  • Hugging Face Agents Course unit1笔记
  • 【科研绘图系列】R语言绘制解剖图
  • 解锁DevOps潜力:如何选择合适的CI/CD工作流工具
  • 【RK3568+PG2L50H开发板实验例程】FPGA部分 | 键控LED实验
  • 闲庭信步使用图像验证平台加速FPGA的开发:第六课——测试图案的FPGA实现