网站首页 > 博客文章 正文
vue的核心是响应式对象,那么它是如何实现的呢?
我们可以将每一次数据变化需要作的修改称为effect,要实现一个响应式对象,需要有三个步骤:
- 保存effect
- 监测值的改变
- 执行trigger effect
核心API Proxy
vue3响应式实现使用了proxy,基础使用如下:
proxy接收两个参数:目标对象和对象处理句柄,上图为person与handler,核心操作在handler中的get、set。两个属性可以在对象读取和修改时触发。
伪代码表述响应式的三个步骤
我们假设一个变量total的值是根据对象product的属性值得来的,它需要在product属性更改时被更新,此时被更新的操作就是一个effect,代码如下:
上图中我们定义了product对象,他有两个属性price、count。另外我们定义了一个effect函数,它根据product属性计算了total的值。可以看到,我们执行了effect得到了一次total的结果,当我们修改product.price后,需要再执行了一次effect,重新计算total的结果。
effect的保存和触发
在实际应用中,我们不可能只有一个effect,所以我们需要有一个保存effect的地方。它通常可以是一个存放effect的数组或者时一个Set集合。
我们定义一个dep集合存储需要在响应式发生时执行的effect,track方法将effect添加到dep集合中,trigger方法则循环了所有的dep集合,并执行了存储的effect函数。如此我们实现了effect的保存和触发。
effect的自动触发与自动收集
在上述伪代码中,我们实现了响应式对象的三个核心步骤,然而,不管是effect的收集还是触发,都是我们手动去调用方法的执行,如何实现effect自动触发与收集呢,这时候我们就要使用前面说的proxy了(vue2为definePropety)。
我们定义了reactive方法,它返回一个proxy。当我们需要一个响应式对象时,我们可以调用reactive方法,将对象作为参数传入,如上图的product。首次执行effect()方法时,代码触发了proxy的get方法,此时我们调用了track方法将effect添加到了dep集合中,当我们执行product.price=10时则触发了set方法,此时set方法中调用了trigger方法为我们执行了所有的effect。
实际情况中我们还需要根据key属性的修改作进一步的判断,同时还要考虑get、set值时是否需要收集和触发effect,以上就是响应式对象实现的基本原理了。
猜你喜欢
- 2025-08-01 无虚拟 DOM、原生级性能、渐进式迁移——Vue 进入双运行时新纪元
- 2025-08-01 Vue3+Bootstrap5整合:企业级后台管理系统实战
- 2025-08-01 自学前端踩了30个坑,终于整理出这份新手避坑指南
- 2025-08-01 vue3.0性能提升主要通过那几方面体现的?
- 2025-08-01 Vue 3.6 虚拟 DOM 移除!Vapor 到来
- 2025-08-01 基于Vue3新标准,打造后台综合解决方案_实战课程_慕课网
- 2025-08-01 面试官:你说你精通Vue3?这10道题能答对3道算我输!
- 2025-08-01 搞定Nginx反向代理,Java和前端从此“听话”了!
- 2025-08-01 面试官:你知道 Vue3 的响应式为什么比 Vue2 更强吗?
- 2025-08-01 如何让 Vue 支持组件 Namespace 形式调用?
你 发表评论:
欢迎- 08-03 Docker 命令入门实战:搞懂这些才算真正入门!
- 08-03Docker 常用命令分类汇总
- 08-03docker常用命令大全,看这一篇就够了
- 08-03Docker命令大全详解(39个常用命令)
- 08-03Docker 常用命令手册
- 08-03Docker命令最全详解(39个最常用命令)
- 08-03Docker命令最全详解(29个最常用命令)
- 08-03C++语法进阶-字符:字符变量(char)
- 最近发表
- 标签列表
-
- ifneq (61)
- 字符串长度在线 (61)
- googlecloud (64)
- flutterrun (59)
- powershellfor (73)
- messagesource (71)
- plsql64位 (73)
- vueproxytable (64)
- npminstallsave (63)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- nacos启动失败 (64)
- ssh-add (70)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- qcombobox样式表 (68)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)