专业的编程技术博客社区

网站首页 > 博客文章 正文

全网首发:Vue3.5 源码 useTemplateRef #vue

baijin 2024-10-04 13:25:23 博客文章 6 ℃ 0 评论

哈喽大家好,

1. 就在昨天,vill 三点五的正式版终于发布了。

2. 前几天分享了 vill 三点五系的新特性,其中有一个特性叫做 use company 的 rife,这样的一个 api 被很多同学所关注。

3. 那么这个 api 在原码之中究竟是怎么去进行实现的?今天就来看一下。

4. 首先去了解一下柚子 tom play 的 raf 的作用。柚子 tom play 的 raf 是用来专门去获取 dom 或者是组建实力的。

5. 在没有这个 api 之前,如果想要去获取 dom 或组建的实力,需要这样去做。

6. 先为 dom 去指定一个 raf 属性,并且给定一个 value 的值。在这些字之中声明 value 的值的变量,然后给定初始值为空的 raf。

7. 但是这种方案存在一个问题,那就是 raf 通常用来去声明响应式的数据。当 raf 不光作为响应式声明,还被作为 dom 实力的时候,就难免让人有点困惑了。

8. 所以在 vivo 三点五之后,vivo 就推出了这样一个全新的品牌叫做 youthtempt rife,来去解决这个问题。

9. 在这个代码之中可以使用 youthtempt rife 平替掉 rife,直接获取掉 dom 或组建的势力。

10. 明确好了当前的 api 的作用之后,接下来就来看一下它的原码实现。

11. 根据 vivo 三点五最新的原码所示,英子 temper 的 raf 实现上面并不复杂,本质上依然是基于 raf 的实现,只不过是在 raf 上面进行了一些封童装。

12. 打开 view 三点五的原码,当前的 use company 的 ref 文件就位于当前原码的 packages 下面,有一个叫做 run time koi 下面的 srchypes 下面。在这里可以直接在这找到柚子 top 的 raf,这个 api 的原码。

13. 当前大家所看到的这一篇的内容其实就是柚子 top 的原码的实现。目前如果直接从通过原码去看,可以发现它的代码其实还是有点复杂的。可以把代码给大家简化一下,剔除掉对应的边缘逻辑。

14. 然后来看一下剔除之后的代码,把整个的内容一换,整个替换完之后大家有没有发现整个代码就会讲很多了。这就是剔除了所有的边缘逻辑之后的代码的内容。根据这个代码来看一下,主要看三个地方。

15. 第一个就是当前的入餐,也就是这个 k,把后面就删掉它。

16. 第二个就是这两个变量,这是内部的声明的变量。

17. 第三块就是返回值。

18. 看这三部分。

19. 首先先去看当前的 k,当前的这个 k 表示的其实就是传入的这个 ref,也就是 rife 的值。

20. 比如在刚才所描述的视力里面,如果针对于这样的一段代码,给大家截个图,大家来看。针对于当前这样的一段代码,在是以这样的方式去进行使用的时候,这个 k 所对应的其实就是这里传入的这个 el,这个大家应该是可以比较清楚的。

21. 明确好了入餐之后,接下来就来看这里的两个内部声明的变量。

22. 首先第一个就是这个 i,这个 i 是通过 get current instance 这个方法去进行获取的。根据这个方法名,其实也可以看到这个 i,其实大家可以理解为 instance,也就是当前的一个上下文的实例。

23. 得到了这个 i 之后,接下来去进行了一个 if 的判断。如果这个 i 存在,它干了个什么事?从这个 i 里面去取了一个 is,这个代码的意思就是如果当前的这个 i 点 refs 是一个空的 object,就是空的对象,就直接给它复制为空对象,否则就取它,就把这个 ifs 值给它取出来,复制给 ifs。

24. 就可以知道了当前这个 ifs 其实就是 i 点 ifs,也就是从上下文里面去取出的所有的 rife 的实例。

25. 拿到这个 ref 实例之后干了一个什么事?object 的点抵犯 property refs key。知道 object 的点抵犯 property 是可以监听指定对象,就是它的指定属性里面的 get 和 set 行为的。

26. 有了这个代码也就意味着当前会去监听 refs 里面的这个 k,也就是这个 el,监听它,然后从这个 k 里面监听它的 get 和 set 的行为。当为它去触发 set 行为的时候,大家来看我干了一个什么事?我拿到当前 set 的这个 value,这个 value 是什么?其实就是 r

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表