总结Vue3中的响应式原理实现

93 阅读2分钟

前言

之前跟着视频完成了Vue3中的reactiveeffect的简单版实现,但是一直感觉对于响应式原理的理解有些模糊,没有一个系统、直观的概念,故今天来总结一下。

(不含代码,具体代码详见前文)

reactive

先来说说reactive,它是用于将数据包装成经Proxy代理的数据(对象类型),简单来讲就是为数据添加拦截器,如果数据是一栋房子,那Proxy就像一个房子的管家,对于代理过的数据进行的任何操作都会由Proxy经手(包含访问和修改数据两种操作),先前在Vue2中,使用的是defineProperty()来实现响应式,但是它的性能不如Proxy,前者只能一次监听对象的一个属性,而后者可以直接监听整个对象。

Proxy中可以通过自定义gettersetter来实现用户对于数据的操作的劫持。并且对于其属性有复杂数据类型的对象,reactive还可以实现递归遍历,保证整个对象内的每个属性(包含嵌套),都实现被代理。

effect

至于effect,它接收一个函数里面包含响应式数据),该函数用于创建一个副作用函数,这个副作用函数会在响应式数据发生变化时重新执行。在副作用函数执行期间,会收集依赖,也就是记录哪些响应式数据被访问了。

我们平时在代码中几乎不会直接使用effect,所以可能有点抽象,毕竟为effect传入函数的操作都是Vue自动完成的。

二者联系

简单来讲,就是reactive数据能够知道自己被访问、修改;effect则是用于监控reactive,当effect中调用/修改reactive数据时,reactive就会知道有人监控了自己,下一次对它进行操作时,就会通知effect(也就是track()trigger()),让effect收集的依赖(副作用函数)重新执行,完成更新。如此完成响应式。