1. roRaw
作用: 将一个由reactive生成的响应式对象转化为普通对象。
使用场景: 用于读取响应式对象对应的普通对象, 这个普通对象的所有操作, 不会引起页面的更新。
<script>import { reactive, toRefs, shallowReadonly, toRaw } from 'vue'export default {setup() {let person = reactive({name:'IRIC',age:12,sex:'女',job:{salery:20},address:''})const p = toRaw(person)console.log(p) //{name: 'IRIC', age: 12, sex: '女', job: {…}, address: ''}return { ...toRefs(person) }},}</script>
2. markRaw
作用:标记一个对象, 使其永远不会称为响应式对象。
应用场景:
当有些值不应该被设置为响应式的, 例如复杂的第三方类库等待;
当渲染具有不可变数据源的大列表时, 体哦爱国响应式转换可以提高性能。
<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><h2>当前的值:{{sum}}</h2><button @click="sum++">点我+1</button><hr><hr><h2>{{person.car}}</h2><button @click='addCar'>加一台车</button><button @click="changeCarName">修改车名</button></template><script>import { reactive, toRefs, shallowReadonly, toRaw, markRaw } from 'vue'export default {setup() {let person = reactive({name:'IRIC',age:12,sex:'女',job:{salery:20},address:''})const p = toRaw(person)console.log(p) //{name: 'IRIC', age: 12, sex: '女', job: {…}, address: ''}function addCar(){person.car = markRaw({name:'奔驰',price:40})//console.log(person)//加了car属性之后, 自动就会变为响应式的, 因为对象借用了proxy代理。能够捕获对象的任何一个操作。//如果car属性不想变为响应式的, 那么可以使用markRaw. car属性永远不会是响应式的。// 详单于在一个proxy对象上面, 有一个属性不是响应式的。}function changeCarName(){person.car.name += '@'console.log(person.car)}//需要把person暴露出来,因为setup只会执行一次, 当添加一辆车之后, 不会再次执行, 所以需要把person报出路来。return { person,...toRefs(person),addCar, changeCarName }},}</script>
