前言: 在阅读 vueuse 的源码时,发现 customRef 竟然能这么用,又学到了一招,废话不多说,我们先来看下 customRef 的基础介绍
算了,基础的内容大家自行翻阅文档吧,这里我给贴个官网对这个 Api 的介绍
使用 customRef 实现增强版 toRefs
toRefs 代理 reactive 的数据
我们先来看看 toRefs 来解构 reactive 的数据,代码如下
效果如下:
这里我们利用了 toRefs 做了一层代理,代理了 reactive 的数据,如代码中 xRef.value ++,本质上会变成这样 mouse.x ++
toRefs 代理 ref 的数据
上面我们实现了 toRefs 代理 reactive 定义的数据,那能不能代理 ref 定义的数据呢?
我们将代码稍微改造一下,代码如下
效果同上,依然可以改变。(PS: 说了这么多,还以为效果不一样呢,结果确一样,那说个锤子啊~)
效果一样,那是因为 ref 的特性,ref 接受的参数如果是一个对象类型,内部还是会用 reactive 这个 api 去定义数据 (PS:口说无凭,代码贴上)
可以看到,ref 中定义的参数会调用 toReactive 方法来处理,那我们来看下 toReactive 的实现吧
看到了吧,这就是证据~~(PS: 所以呢,你想表达什么?)
那如果我寄出这样的代码,阁下该如何应对?
嘿嘿~我直接传入一个 ref,要求实现跟上面一样的效果,怎么解?
customRef 闪亮登场
想实现跟上面一样的效果,解决办法中的某一个就是我们可以借助 customRef 来做一层转发(PS:talk is cheap,show me the code)
大功告成,打完收工~ (PS:代码不难,思路比较开阔,如有分析错误之处,请指正,谢谢!)