你可能不知道的 customRef,竟然能这么用?

183 阅读2分钟

前言: 在阅读 vueuse 的源码时,发现 customRef 竟然能这么用,又学到了一招,废话不多说,我们先来看下 customRef 的基础介绍

算了,基础的内容大家自行翻阅文档吧,这里我给贴个官网对这个 Api 的介绍

customRef-api.png

使用 customRef 实现增强版 toRefs

toRefs 代理 reactive 的数据

我们先来看看 toRefs 来解构 reactive 的数据,代码如下

reactive-toRefs-code.png

效果如下:

reactive-toRefs.gif

这里我们利用了 toRefs 做了一层代理,代理了 reactive 的数据,如代码中 xRef.value ++,本质上会变成这样 mouse.x ++

toRefs 代理 ref 的数据

上面我们实现了 toRefs 代理 reactive 定义的数据,那能不能代理 ref 定义的数据呢? 我们将代码稍微改造一下,代码如下

ref-toRefs-code.png

效果同上,依然可以改变。(PS: 说了这么多,还以为效果不一样呢,结果确一样,那说个锤子啊~)

效果一样,那是因为 ref 的特性,ref 接受的参数如果是一个对象类型,内部还是会用 reactive 这个 api 去定义数据 (PS:口说无凭,代码贴上)

ref.png

可以看到,ref 中定义的参数会调用 toReactive 方法来处理,那我们来看下 toReactive 的实现吧

toReactive.png

看到了吧,这就是证据~~(PS: 所以呢,你想表达什么?)

那如果我寄出这样的代码,阁下该如何应对?

toRefs-ref.png

嘿嘿~我直接传入一个 ref,要求实现跟上面一样的效果,怎么解?

customRef 闪亮登场

想实现跟上面一样的效果,解决办法中的某一个就是我们可以借助 customRef 来做一层转发(PS:talk is cheap,show me the code)

_toRefs.png

大功告成,打完收工~ (PS:代码不难,思路比较开阔,如有分析错误之处,请指正,谢谢!)