网站首页 > 精选文章 正文
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,以上就是响应式对象实现的基本原理了。
- 上一篇: 分享 15 个 Vue3 全家桶开发的避坑经验
- 下一篇: 高级前端必会的34道Vue面试题解析
猜你喜欢
- 2025-03-10 19《Vue 入门教程》Vue 渲染函数
- 2025-03-10 如何在 Vue 中使用 JSX 以及使用它的原因
- 2025-03-10 Vue进阶(三十五):vue中watch详细用法
- 2025-03-10 Vuex原理深度剖析:状态管理的架构设计与实现
- 2025-03-10 你只会用前端数据埋点 SDK 吗?
- 2025-03-10 Web前端面试中,经常会被问到的Vue面试题
- 2025-03-10 10个Vue开发技巧「实践」
- 2025-03-10 模拟 Vue 中 JS 动态表达式在模版中被动态解析的实现
- 2025-03-10 最全的 Vue 面试题+详解答案
- 2025-03-10 SpringBoot + Vue (四)文件上传 + 拦截器
- 最近发表
- 标签列表
-
- 向日葵无法连接服务器 (32)
- git.exe (33)
- vscode更新 (34)
- dev c (33)
- git ignore命令 (32)
- gitlab提交代码步骤 (37)
- java update (36)
- vue debug (34)
- vue blur (32)
- vscode导入vue项目 (33)
- vue chart (32)
- vue cms (32)
- 大雅数据库 (34)
- 技术迭代 (37)
- 同一局域网 (33)
- github拒绝连接 (33)
- vscode php插件 (32)
- vue注释快捷键 (32)
- linux ssr (33)
- 微端服务器 (35)
- 导航猫 (32)
- 获取当前时间年月日 (33)
- stp软件 (33)
- http下载文件 (33)
- linux bt下载 (33)