《Vuejs设计与实现》6.2 响应丢失的问题

129 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第26天,点击查看活动详情

其实,在我们刚上手vue3的时候,基本都碰见过这个问题,比如,我们解构props,如果你不注意,或者是为了简便,你直接使用扩展运算符...

const props = defineProps({a:Number,b:Number})
const {a,b} = {...props}

当你第一次使用的时候,没问题,然后你很快会发现,子组件不会变化了,这时候你打印一下propsa就能看到原因:解构时只提取了值,它不再是Proxy,自然无法响应。

在vue3文档中,会告诉你用toRefs解决,那么你知道toRefs是怎么解决的吗?我们大概模拟一下,当然这是我的思路,不一定对.

image.png

对于Props来说,组件初始化时就存在,也没有什么多余的副作用函数,我觉得这样实现时没问题的,但是对于其他的reactive变量来说,你无法确定它的副作用函数有多少,因此我这样做还是会丢失响应性。

为了不丢失响应性,我们需要一个指向,把所有对于a的操作指向props.a,这样才能通过reactive结构保证响应性。于是我们开始设计这样一种指向的结构

image.png

我们可以发现,无论有多少属性,它们实现的方式基本上一样的,因此我们可以封装出来一个toRef,实现了toRef,我们就可以再去实现一下toRefs

image.png

这样我们就基本解决了响应式丢失的问题,同时了解到了为什么会出现这个问题,和解决的思路。当然这只是思路而已,vue3中源代码肯定比这复杂很多。