vue3.0中的shallowReactive与shallowRef

shallowReactive:
在vue3.0中,通过reactive可以将对象变为响应式的,即当视图已经生成之后,数据对象属性值在发生变化的时候,视图也会跟着更新。reactive可以做到深层次属性变为响应式,但是有的时候如果包装的对象有过多属性而又不需要设置相应,无疑是性能浪费,这个时候可以用到shallowReactive。

用法如下图:

<template>
  <div>
    <h2>shallowreactive和shallowref</h2>
    <h3>m1:{{m1}}</h3>
    <h3>m2:{{m2}}</h3>
    <button @click="update">更新数据</button>
  </div>
</template>


<script lang="ts">
import { computed, defineComponent,reactive,ref, 
  shallowReactive,   } from 'vue'
export default defineComponent({
    setup(){
      const m1 = reactive({
        name:'鸣人',
        age:20,
        car:{
          name:'奔驰',
          color:'red'
        }
      })
      const m2 = shallowReactive({
        name:'鸣人',
        age:20,
        car:{
          name:'奔驰',
          color:'red',
          car1:{
            name:'奔驰',
            color:'red'
          }
        }
      })
      const update = () => {
        m2.car.car1.name += '---'
        console.log(m2)
      }
      return {
        m1,m2,m3,m4,
        update
      }
    }
})
</script>

这是初始效果图:
在这里插入图片描述
点击按钮,更新数据,car的名字发生了变化
在这里插入图片描述
接下来咱们修改一下代码

const update = () => {
  m2.car.name += '---'
}

点击按钮,可以看到m2的第二层属性值并没有发生变化
在这里插入图片描述
细节:
如果被shallowReactive包裹的对象的第一层同时跟着发生变化,这一特效会消失

const update = () => {
  m2.name += '---'
  m2.car.name += '---'
}

可以看到m2的第一层和第二层属性值都进行了更新:
在这里插入图片描述
shallowRef:
shallowRef只进行value的响应式处理,不进行对象的reactive处理,ref也可以包裹对象,是进行了reactive处理的

const m3 = ref({
   name:'鸣人',
   age:20,
   car:{
     name:'奔驰',
     color:'red',
     
   }
 })
 const m4 = shallowRef({
   name:'鸣人',
   age:20,
   car:{
     name:'奔驰',
     color:'red'
   }
 })

ref第一层和深层次都会起到响应式效果,而shallowRef完全没有响应式效果
ref的效果验证:
浅层次:

const update = () => {
  m3.value.name += '---'
}

效果图:
点击按钮,m3的第一层发生了变化

在这里插入图片描述
**深层次:

const update = () => {
  m4.value.car.name += '---'
}

效果图:

点击按钮,m3的第二层发生了变化
在这里插入图片描述

shallowRef的效果验证:
浅层次:

const update = () => {
  m4.value.name += '---'
}

效果图:
点击按钮,m4的第一层没有跟着变化
在这里插入图片描述
深层次:

const update = () => {
  m4.value.car.name += '---'
}

效果图:
点击按钮,m4的第二层没有跟着变化
在这里插入图片描述
总结:
(1)被ref和reactive包裹的对象浅层次和深层次都会做到响应式
(2)shallowReactive包裹的对象深层次做不到响应式
(3)shallowRef包裹的对象浅层次和深层次都做不到响应式

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Realistic-er

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值