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

响应式原理二:响应式依赖收集

一、响应式依赖收集

  1. 依赖收集机制:
    • 1.1. 存储结构:使用数组reactiveFns存储所有依赖函数
    • 1.2. 注册函数:通过watchFn函数将依赖函数注册到数组中
    • 1.3. 自动执行:注册时会立即执行一次函数,确保初始状态正确
    • 示例代码如下:
      // 设置一个专门执行响应式函数的一个函数
      const reactiveFns = []
      function watchFn (fn) {// 把所有依赖的东西,统一收集到一个数组中(reactiveFns), 方便进行管理reactiveFns.push(fn)// 传入函数后立即执行一次,类似watchEffect()fn()
      }   
      
  2. 应用示例:
    • 2.1. 当对象属性obj.nameobj.age变化时
    • 2.2. 自动执行所有依赖这些属性的函数(如foo()bar()
    • 2.3.通过遍历reactiveFns数组统一执行所有依赖函数
    •    	const obj = {name: 'why',age: 18}// 设置一个专门执行响应式函数的一个函数const reactiveFns = []function watchFn (fn) {// 把所有依赖的东西,统一收集到一个数组中(reactiveFns), 方便进行管理reactiveFns.push(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的属性console.log('name发生变化时----------------------------------------');obj.name = 'kobe'// 当依赖发生变化时,会执行对应的响应式函数reactiveFns.forEach(fn => {fn()}) 
      
  3. 执行流程:
    • 3.1. 属性修改触发更新
    • 3.2. 从依赖数组中取出所有相关函数
    • 3.3.依次执行每个依赖函数
  4. 设计特点:
    • 4.1. 手动收集:目前需要显式调用watchFn注册依赖函数
    • 4.2. 统一管理:所有依赖函数集中存储在数组中便于统一触发
    • 4.3. 自动执行:注册时立即执行确保初始状态,变化时再次执行更新状态
  5. watchFnVue的关系:
    • 5.1. 类似Vue3的watchEffect机制
    • 5.2. 区别在于当前实现是手动收集依赖
    • 5.3. 后续会优化为自动依赖收集

小结

知识点核心内容易混淆点/难点代码示例/关键实现
响应式机制原理通过监听对象属性变化触发依赖函数重新执行手动收集依赖 vs 自动收集依赖watchFn(fn) 函数封装与依赖数组管理
依赖收集实现将依赖函数统一存入 reactiveFns 数组,属性变化时遍历执行依赖函数初次执行时机(立即执行 vs 延迟执行)reactiveFns.push(fn); fn()
WatchFn 设计函数注册机制:标记需响应式的函数并自动执行一次非响应式函数误注册问题(后续优化点)watchFn(() => { console.log(obj.name) })
响应式触发流程1. 修改属性值 → 2. 从依赖数组提取函数 → 3. 批量执行多属性依赖时的执行效率(未优化)obj.name = “copy” 触发 foo() 和 bar()
与 WatchEffect 对比类似 Vue 的 watchEffect,但依赖需手动声明自动依赖追踪的实现差异(当前未实现)无自动依赖关系分析
http://www.dtcms.com/a/271183.html

相关文章:

  • 前端进阶之路-从传统前端到VUE-JS(第四期-VUE-JS页面布局与动态内容实现)(Element Plus方式)
  • Higress 上架 KubeSphere Marketplace,助力企业构建云原生流量入口
  • 海信IP501H_GK6323处理器免拆卡刷包和线刷救砖包_当贝纯净版
  • 类模板的语法
  • 计算机网络实验——网线的制作和测试
  • 网安-SSRF-pikachu
  • RNN及其变体的概念和案例
  • Vue响应式原理一:认识响应式逻辑
  • python 为什么推荐使用虚拟环境(如 venv)?它解决了什么问题?
  • doris2.1.8连接报错ERROR 1203 (42000): Reach limit of connections解决办法
  • 使用 Docker Compose 简化 INFINI Console 与 Easysearch 环境搭建
  • Oracle:使用ONLINE选项创建索引
  • 【内核基础精讲】I2C 子系统核心概念与结构全解析
  • 类与对象【下篇】-- 关于类的其它语法
  • 蓝凌EKP产品:属性转换器系统优化
  • c语言学习_函数递归2
  • 70、【OS】【Nuttx】【构建】配置 stm32 工程
  • STM32继电器万能控制设备
  • 【04】MFC入门到精通——MFC 自己手动新添加对话框模板 并 创建对话框类
  • SpringBoot集成文件 - 大文件的上传(异步,分片,断点续传和秒传)
  • 数据结构基础准备:包装类 泛型 泛型的上界 密封类
  • 零知开源——STM32F407VET6驱动SHT41温湿度传感器完整教程
  • 2023年全国青少年信息素养大赛Python编程小学组复赛真题+答案解析-北京赛区
  • idea 常用快捷键
  • Mysql中的日志-undo/redo/binlog详解
  • 学习open62541 --- [79] 在docker中运行open62541工程
  • pytorch chunk 切块
  • 【C++】容器适配器 + stack/queue/deque详解
  • Java基础,反射破坏封装性 - 单例模式的崩塌
  • 掌握PDF转CAD技巧,提升工程设计效率