Vue3 的响应式设计原理

提问

使用 Vue3 中,我们最常使用的就是 reactiveref。但是我们有时候会觉得为什么使用 ref 的时候,需要每次通过 value 属性来改变值,而使用 reactive 的时候,一定要是一个对象,今天我们来讲解一下其背后的设计原理。

DefineProperty

使用 Vue2 的同学们都知道,Vue 的属性双向绑定是通过 Object 的 DefineProperty 实现的,那这个设计思想其实也是有延续到 Vue3 的,这也就是为什么 Vue3 中的 ref 要通过 value 属性来进行赋值。因为一个单一的 primitive 变量是不具备属性的监听和拦截,但是一个 Object 可以通过 DefineProperty 来进行属性的拦截,当我们为一个 Object 的属性进行 setget 的时候,我们可以通过拦截,进行 side effect。这也就是为什么 ref 需要有一个 value 属性。虽然我们在使用 ref 的时候,都是传入 primitive value,也就是基础类型,比如 boolean, number 或者 string,但是背后都是依托于 Object 来进行响应式赋值,并且 value 属性本身是不被 return,也就是说,我们不会去使用 value 属性,这个属性创建了一个我们可以拦截的桥。但在 Vue3 中,已经使用 Proxy 来进行对象数据的拦截功能。

Proxy

再来说一下 reactive 为什么一定要是对象,其原理是通过 Proxy 来实现 reactive 的响应式,我们传入的 reactive 的初始值是作为 Proxy 的 target,而 Proxy 的 handler 则是实现的真正操作。

以上,就是 refreactive 设计思路,大家也可以去仔细看一下 Proxy 的使用方法,

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值