当前位置: 首页 > news >正文

vue3之 shallowRef、markRaw

shallowRef 用于创建一个浅层响应式引用,只对顶层属性进行响应式处理。
markRaw 用于标记一个对象,使其完全跳过 Vue 的响应式系统。

这两者都可以用于优化性能,避免不必要的响应式开销,特别是在处理大型对象或第三方库对象时。

shallowRef

shallowRef 是 Vue 3 中的一个 API,用于创建一个浅层响应式引用。与 ref 不同,shallowRef 只会对其值的顶层进行响应式处理,而不会递归地将其内部的对象变成响应式的。

用法
import { shallowRef } from 'vue';const state = shallowRef({nested: {count: 0}
});// 只有 state 自身是响应式的,state.nested 不是响应式的
state.value.nested.count++; // 不会触发响应式更新
适用场景
  • 当你有一个复杂的对象,但只需要对其顶层属性进行响应式处理时。
  • 当你需要避免对大型对象进行深层次的响应式处理以提高性能时。

markRaw

markRaw 是 Vue 3 中的一个 API,用于标记一个对象,使其永远不会被 Vue 的响应式系统处理。被标记为 markRaw 的对象将完全跳过响应式转换。

用法
import { markRaw } from 'vue';const rawObject = markRaw({nested: {count: 0}
});// rawObject 及其所有嵌套属性都不是响应式的
rawObject.nested.count++; // 不会触发响应式更新
适用场景
  • 当你有一个对象不需要响应式处理时。
  • 当你需要将第三方库的对象(如 DOM 元素、图表实例等)排除在响应式系统之外时。

下面的例子不能使用 refref 会将其值变成响应式对象,而组件对象不应该是响应式的。为了避免这个问题,可以使用 shallowRef 或者 markRaw 来处理组件对象。

示例:在 Vue 组件中使用 shallowRefmarkRaw

使用 shallowRef
<template><div><button @click="toggleComponent">Toggle Component</button><component :is="currentComponent" /></div>
</template><script setup>
import { shallowRef } from 'vue';
import ComponentA from './components/ComponentA.vue';
import ComponentB from './components/ComponentB.vue';const currentComponent = shallowRef(ComponentA);const toggleComponent = () => {currentComponent.value = currentComponent.value === ComponentA ? ComponentB : ComponentA;
};
</script>
使用 markRaw
<template><div><button @click="toggleComponent">Toggle Component</button><component :is="currentComponent" /></div>
</template><script setup>
import { ref, markRaw } from 'vue';
import ComponentA from './components/ComponentA.vue';
import ComponentB from './components/ComponentB.vue';const ComponentA_raw = markRaw(ComponentA);
const ComponentB_raw = markRaw(ComponentB);const currentComponent = ref(ComponentA_raw);const toggleComponent = () => {currentComponent.value = currentComponent.value === ComponentA_raw ? ComponentB_raw : ComponentA_raw;
};
</script>
http://www.lryc.cn/news/461155.html

相关文章:

  • 影刀RPA实战:操作Mysql数据库
  • 【c++】c++11多线程开发
  • PW37R_V1 产品规格书
  • android11 usb摄像头添加多分辨率支持
  • 【开源免费】基于SpringBoot+Vue.JS房屋租赁系统(JAVA毕业设计)
  • JavaScript全面指南(二)
  • Nginx:Linux配置Nginx
  • WebRTC音频 04 - 关键类
  • Elasticsearch:Redact(编辑) processor
  • O2OA结合备份脚本和定时任务进行数据库的备份,我们以MySQL数据库为例
  • Python自动化办公:批量提取PDF中的表格到Excel
  • selenium有多个frame页时的操作方法(5)
  • 谷歌外链的周期性维护!
  • CATIA软件许可管理最佳实践
  • 大华智能云网关注册管理平台 SQL注入漏洞复现(CNVD-2024-38747)
  • 什么是思维导图,手把手教你做经典思维导图
  • 使用GSEA读‘gmt文件‘时最后一行未遂问题解决
  • C++中vector常用函数总结
  • 手撕数据结构 —— 队列(C语言讲解)
  • Java知识巩固(五)
  • C# 中 yield关键字的使用
  • YoloDotNet 的基本使用方法详解
  • 0x12 Dapr Dashboard configurations 未授权访问漏洞 CVE-2022-38817
  • Android activity 启动流程
  • 使用 Go 语言实现 WebSocket的核心逻辑
  • Linux下的杀毒软件介绍
  • JSONP详解
  • Leetcode—1115. 交替打印 FooBar【中等】(多线程)
  • Visual Studio Code基础:使用debugpy调试python程序
  • 超全!一文详解大型语言模型的11种微调方法