1. roRaw

作用: 将一个由reactive生成的响应式对象转化为普通对象。
使用场景: 用于读取响应式对象对应的普通对象, 这个普通对象的所有操作, 不会引起页面的更新。

  1. <script>
  2. import { reactive, toRefs, shallowReadonly, toRaw } from 'vue'
  3. export default {
  4. setup() {
  5. let person = reactive({
  6. name:'IRIC',
  7. age:12,
  8. sex:'女',
  9. job:{
  10. salery:20
  11. },
  12. address:''
  13. })
  14. const p = toRaw(person)
  15. console.log(p) //{name: 'IRIC', age: 12, sex: '女', job: {…}, address: ''}
  16. return { ...toRefs(person) }
  17. },
  18. }
  19. </script>

2. markRaw

作用:标记一个对象, 使其永远不会称为响应式对象。
应用场景:
当有些值不应该被设置为响应式的, 例如复杂的第三方类库等待;
当渲染具有不可变数据源的大列表时, 体哦爱国响应式转换可以提高性能。

  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. <h2>当前的值:{{sum}}</h2>
  11. <button @click="sum++">点我+1</button>
  12. <hr>
  13. <hr>
  14. <h2>{{person.car}}</h2>
  15. <button @click='addCar'>加一台车</button>
  16. <button @click="changeCarName">修改车名</button>
  17. </template>
  18. <script>
  19. import { reactive, toRefs, shallowReadonly, toRaw, markRaw } from 'vue'
  20. export default {
  21. setup() {
  22. let person = reactive({
  23. name:'IRIC',
  24. age:12,
  25. sex:'女',
  26. job:{
  27. salery:20
  28. },
  29. address:''
  30. })
  31. const p = toRaw(person)
  32. console.log(p) //{name: 'IRIC', age: 12, sex: '女', job: {…}, address: ''}
  33. function addCar(){
  34. person.car = markRaw({
  35. name:'奔驰',
  36. price:40
  37. })
  38. //
  39. console.log(person)
  40. //加了car属性之后, 自动就会变为响应式的, 因为对象借用了proxy代理。能够捕获对象的任何一个操作。
  41. //如果car属性不想变为响应式的, 那么可以使用markRaw. car属性永远不会是响应式的。
  42. // 详单于在一个proxy对象上面, 有一个属性不是响应式的。
  43. }
  44. function changeCarName(){
  45. person.car.name += '@'
  46. console.log(person.car)
  47. }
  48. //需要把person暴露出来,因为setup只会执行一次, 当添加一辆车之后, 不会再次执行, 所以需要把person报出路来。
  49. return { person,...toRefs(person),addCar, changeCarName }
  50. },
  51. }
  52. </script>