1. shallowRef
shallowRef:只处理基本数据类型的响应式, 不进行对象的响应式处理。
如果传入基本类型, 那么ref和shallowRef没有任何区别:
<template>
<h2>当前的值:{{sum}}</h2>
<button @click="sum++">点我+1</button>
</template>
<script>
import { reactive, toRefs, shallowReactive, shallowRef, ref } from 'vue'
export default {
setup() {
const sum = ref(0)
return {sum }
},
}
</script>
如果传入引用类型则不生效。因为value对应的时一个Object类型, 并不是引用类型。
<template>
<!-- <button @click="job.salery ++">修改薪资</button> -->
<h2>当前的值:{{sum.x}}</h2>
<button @click="sum.x++">点我+1</button>
</template>
<script>
import { reactive, toRefs, shallowReactive, shallowRef, ref } from 'vue'
export default {
setup() {
const sum = shallowRef({
x:0
})
console.log(sum)
return { sum }
},
}
</script>
2. shallowReactive
shallowReactive:只处理对象最外层属性的响应式(浅响应式)。
所以修改姓名和年龄可以生效,但是修改薪资时, 无法生效。因为只有在第一层才会生效
<template>
<h2>姓名:{{name}}</h2>
<h2>年龄:{{age}}</h2>
<h2>性别:{{sex}}</h2>
<h2>薪资:{{job.salery}}</h2>
<hr>
<button @click="name += '@'">修改姓名</button>
<button @click="age ++">修改年龄</button>
<button @click="job.salery ++">修改薪资</button>
</template>
<script>
import { reactive, toRefs, shallowReactive } from 'vue'
export default {
setup() {
const person = shallowReactive({
name:'IRIC',
age:12,
sex:'女',
job:{
salery:20
},
address:''
})
return { ...toRefs(person) }
},
}
</script>
3. 总结
:::success
- shallowReactive:只处理对象最外层属性的响应式(浅响应式)。
- shallowRef:只处理基本数据类型的响应式, 不进行对象的响应式处理。
- 什么时候使用?
- 如果有一个对象数据,结构比较深, 但变化时只是外层属性变化 ===> shallowReactive。
- 如果有一个对象数据,后续功能不会修改该对象中的属性,而是生新的对象来替换 ===> shallowRef。 :::