1. shallowRef

shallowRef:只处理基本数据类型的响应式, 不进行对象的响应式处理。
如果传入基本类型, 那么refshallowRef没有任何区别:

  1. <template>
  2. <h2>当前的值:{{sum}}</h2>
  3. <button @click="sum++">点我+1</button>
  4. </template>
  5. <script>
  6. import { reactive, toRefs, shallowReactive, shallowRef, ref } from 'vue'
  7. export default {
  8. setup() {
  9. const sum = ref(0)
  10. return {sum }
  11. },
  12. }
  13. </script>

如果传入引用类型则不生效。因为value对应的时一个Object类型, 并不是引用类型。

  1. <template>
  2. <!-- <button @click="job.salery ++">修改薪资</button> -->
  3. <h2>当前的值:{{sum.x}}</h2>
  4. <button @click="sum.x++">点我+1</button>
  5. </template>
  6. <script>
  7. import { reactive, toRefs, shallowReactive, shallowRef, ref } from 'vue'
  8. export default {
  9. setup() {
  10. const sum = shallowRef({
  11. x:0
  12. })
  13. console.log(sum)
  14. return { sum }
  15. },
  16. }
  17. </script>

image.png

2. shallowReactive

shallowReactive:只处理对象最外层属性的响应式(浅响应式)。
所以修改姓名和年龄可以生效,但是修改薪资时, 无法生效。因为只有在第一层才会生效

  1. <template>
  2. <h2>姓名:{{name}}</h2>
  3. <h2>年龄:{{age}}</h2>
  4. <h2>性别:{{sex}}</h2>
  5. <h2>薪资:{{job.salery}}</h2>
  6. <hr>
  7. <button @click="name += '@'">修改姓名</button>
  8. <button @click="age ++">修改年龄</button>
  9. <button @click="job.salery ++">修改薪资</button>
  10. </template>
  11. <script>
  12. import { reactive, toRefs, shallowReactive } from 'vue'
  13. export default {
  14. setup() {
  15. const person = shallowReactive({
  16. name:'IRIC',
  17. age:12,
  18. sex:'女',
  19. job:{
  20. salery:20
  21. },
  22. address:''
  23. })
  24. return { ...toRefs(person) }
  25. },
  26. }
  27. </script>

3. 总结

:::success

  • shallowReactive:只处理对象最外层属性的响应式(浅响应式)。
  • shallowRef:只处理基本数据类型的响应式, 不进行对象的响应式处理。
  • 什么时候使用?
    • 如果有一个对象数据,结构比较深, 但变化时只是外层属性变化 ===> shallowReactive。
    • 如果有一个对象数据,后续功能不会修改该对象中的属性,而是生新的对象来替换 ===> shallowRef。 :::