1、概念
toRaw
返回由 reactive 或 readonly 方法转换成响应式代理的普通对象。这是一个还原方法,可用于临时读取,访问不会被代理/跟踪,写入时也不会触发界面更新。
markRaw
标记一个对象,使其永远不会转换为代理。返回对象本身。
应用场景
有些值不应被设置为响应式的,例如复杂的第三方类实例或 Vue 组件对象。当渲染具有不可变数据源的大列表时,跳过代理转换可以提高性能。
2、示例代码
<template>
<h2>toRaw和markRaw</h2>
<h3>state:{{ state }}</h3>
<hr />
<button @click="testToRaw">测试toRaw</button>
<button @click="testMarkRaw">测试markRaw</button>
</template>
import { defineComponent, markRaw, reactive, toRaw } from "vue";
interface UserInfo {
name: string;
age: number;
likes?: string[];
}
export default defineComponent({
name: "App",
setup() {
const state = reactive<UserInfo>({
name: "小明",
age: 20,
});
const testToRaw = () => {
const user = toRaw(state);
user.name += "==";
console.log("哈哈,我好帅哦");
};
const testMarkRaw = () => {
const likes = ["吃", "喝"];
state.likes = markRaw(likes);
setInterval(() => {
if (state.likes) {
state.likes[0] += "=";
console.log("定时器走起来");
}
}, 1000);
};
return {
state,
testToRaw,
testMarkRaw,
};
},
});