vue3-ref与reactive创建响应式对比

 1.先了解什么是响应式

往往认为只要数据发生变化 页面发生变化就是响应式 。其实并不然 这句话说的不太准确 当一个数据所依赖的函数发生变化 会重新渲染并更新页面。其实这句话已经很明确 往往数据是根据所依赖的函数发生变化 才叫做响应式。

Vue3响应式

72cf6b8b406640b2b0d2a7fb1dfa1ee1.png

98e3c1dfbffe4b319a32dd4ed3bb7d12.png

可以看出控制台已经发生了改变 但页面并没有变化 因为并没有进行响应 此时要提起两个API ref 和 reactive 

先来看ref创建响应式

635f6ffc252a418f89f7bd56a2f0e22a.png

在函数中price+=10 报错了 先来看输出控制台brand price

b3a0858e3f7d4b3a8bb591f4d8db7dc0.png

此时我们看到出现refImpL  是一个实例对象

4f94285edd8d48719c4c447f052ac3ed.png

展开来可以看到数据都在这 当然真正的数据在value身上

0caf5f835f654d0aa9b0fe69c7ac52b7.png

给price.value就已经是响应式了 可以得出一个结论 只要是ref创建的都要.value 

reactive创建响应式

42d2551b140645d6bb5062966236bdb4.png

可以看到全面报错 根据上述将ref创建响应式 是和reactive是有区别 ref创建的是基本数据类型的响应式 而reactive创建的是对象式响应式

42024a36b2c640209dc2fedde2187836.png

现在已经不报错了 先来看控制台输出car

c5aed60857af4aed9d2cdb24e4f062b9.png

其实这个proxy实现数据代理 ES6 原生提供 Proxy 构造函数 用来生成 Proxy 实例 相对于vue2来说 Object.defineProperty()实现数据代理 ES6原生提供 用来定义一个对象 之前写的内容讲过 可以来之前vue2数据代理 

31de1f99d18d42beaefd3ff709882ccf.png

此时可以看到数据都在这里 来看点击修改汽车是不是响应式

dbc6e444e8574e4caeeb01b3ef751ee3.png

b57e3f5ecf26422d9a865f8f28a8e1cc.png

已经发生了响应式 可以得出一个结论 只要是reactive 可以用来创建对象式响应式

区别:

1.ref 创建的变量必须使用.value

2.reactive 重新分配一个新对象 会失去响应式 

第二点 看代码

7b0728bc686c474f9074cd866bf02afa.png

00b7c35e9e99431093df32ceb8bca816.png

307f91b193b54ab0be01828df06bca42.png

数据源里面是reative定义的一个响应式数据 当在函数中又写了reactive去定义一个响应式数据 把之前的响应式对象直接断了 开了一个新的响应式对象 由此失去了响应式 在ES6中一个API Object.assign()方法 作用一个对象分配另一个对象

3721b1baaab04ed696a4011bcc3b0645.png

fb2abf52edc94f5da3fed0344d9cf6a7.png

可以看到 页面已经发生变化 

有一个小点 ref也可以用来定义对象式响应式 看代码

e0e21ae716264a85967ae32611149070.png

 b80574fe94ee426b8608e7a533580f5c.png

同理发生了变化 相比reactive比较麻烦 而ref直接.value就可以直接修改 在这里我加一个sum求和例子

442c9e9492c144d9a08e60f2304b6c23.png

 4c58ad42f7ea477f8f34be14ea116579.png

如果改成这样 可行吗

2b0f8705ee5c44a1b66ef5300057173b.png

 bf9c0152fdb740dba5b5e835b600c260.png

可以看出并不行 因为并没有.value 直接越过了.value直接修改了值

得出结论:

1.若需要一个基本类型的响应式数据 必须使用 ref 必须.value

2.若需要响应式对象 层次不身 ref reactive 都可以

3.若需要一个响应式对象 且层次较深 推荐使用 reactive

官方解释:如果将一个对象赋值给 ref,那么这个对象将通过 reactive() 转为具有深层次响应式的对象。这也意味着如果对象中包含了嵌套的 ref,它们将被深层地解包。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值