Vue中 toRaw 和 markRaw 的使用

Vue3响应式进阶:toRaw与markRaw的实战解析 本文深入解析Vue3中toRaw与markRaw两个高级API的核心原理与实战应用。toRaw用于获取响应式代理的原始对象,适用于性能敏感读取或与第三方库交互;markRaw则永久标记对象为非响应式,是集成复杂第三方实例或优化大型不可变数据性能的关键工具。掌握它们能帮助开发者在享受响应式便利的同时,实现更精细的性能控制和架构设计。 阅读详情

背景

针对一些特殊的需求,在项目里,需要将响应式数据变为普通原始类型数据,这种情况是有的

在 Vue 中,能够将普通数据类型的数据变为响应式数据,也能将响应式类型数据变为普通类型数据,用于提升数据的性能

toRaw()

用于获取响应式对象的原始版本,它能够从由 reactive 或 ref 创建的响应式代理对象中提取出原始的对象或值

使用场景: 用于提取响应式对象的原始对象或值,对这个普通对象的所有操作,不会引起页面的更新

const originalObject = { name: 'Vue', version: '3.0' }
const reactiveObject = reactive(originalObject)

// 获取响应式对象的原始版本
const rawObject = toRaw(reactiveObject)
console.log(rawObject === originalObject) // true

注意事项:

1)对非响应式对象无效:如果 toRaw 的参数本来就不是响应式对象,它会直接返回该参数本身

2)适用于 reactive 或 ref:可以用于由 reactive 创建的响应式对象,也可以用于由 ref 创建的响应式引用对象

3)不会解除响应式:toRaw 只是获取原始对象的引用,并不会解除响应式对象的响应性,原始对象和响应式对象仍然共享相同的内存位置

markRaw()

用于标记一个对象或组件,使其不被 Vue 的响应式系统处理。换句话说,被 markRaw 标记的对象或组件不会被 Vue 转换为响应式对象,也不会被追踪其属性的变化

将一个对象标记为不可被转为代理,返回该对象本身

应用场景:

1)某些对象或组件本身不需要响应式功能,例如第三方库的实例、静态配置对象或动态加载的组件

2)当渲染具有不可变数据源的大列表时,跳过响应式转换可以提高性能

3)某些情况下,响应式转换可能会导致意外行为,例如某些库或框架内部的状态管理

const foo = markRaw({})
console.log(isReactive(reactive(foo))) // false

// 也适用于嵌套在其他响应性对象
const bar = reactive({ foo })
console.log(isReactive(bar.foo)) // false

注意事项:

1)适用范围:markRaw 只适用于对象或组件,对基本数据类型(如字符串、数字)没有效果

2)已存在的响应式对象:如果对象已经被 Vue 转换为响应式对象,markRaw 不会将其变回非响应式

对象身份风险

Vue 的响应式系统默认会将对象及其所有嵌套属性都转换为响应式对象(深度响应式),使用markRaw()与shallowReactive()这样浅层式 API,可以选择性地避免这种深度转换,将某些对象标记为非响应式或仅对对象的第一层属性进行响应式处理。 通过这些 API,可以在响应式状态中嵌入原始的、未被代理的对象,以满足特定的性能优化或功能需求

1)嵌套对象的代理问题

如果将一个嵌套的、没有标记为原始的对象设置为响应式对象,Vue 会将其及其嵌套对象都转换为代理对象

  1. 当再次访问这个嵌套对象时,获取到的是代理版本,而不是原始对象

2)对象身份不一致的问题

  1. 当执行依赖于对象身份的操作时,如果同时使用了同一对象的原始版本和代理版本,可能会导致问题

通过以下例子来理解:

foo 被标记为原始对象,但它的嵌套属性 nested 并没有被标记。当将 foo.nested 设置为响应式对象 bar.nested 时,foo.nested 是原始对象,而 bar.nested 是代理对象

因此,foo.nested === bar.nested 返回 false,表明它们是不同的对象实例

const foo = markRaw({
  nested: {}
})

const bar = reactive({
  // 尽管 `foo` 被标记为了原始对象,但 foo.nested 却没有
  nested: foo.nested
})

console.log(foo.nested === bar.nested) // false
Vue3性能优化实战:toRaw和markRaw的正确使用姿势(附避坑指南) 本文深入探讨了Vue3中toRaw和markRaw两个API在性能优化中的实战应用。通过分析响应式代理的成本,结合大型列表渲染、第三方库集成、数据序列化等具体场景,详细阐述了如何正确使用它们来减少不必要的代理开销,提升应用性能,并提供了关键的避坑指南。 阅读详情

相关推荐

知识笔记(八十五)———Vue 3中toRaw和markRaw的使用

toRaw是Vue 3中的一个全局函数,它接受一个reactive或ref对象,并返回该对象的原始不代理版本。但是请注意,尽管proxy是响应性的,但original的修改不会触发代理的更新。toRaw和markRaw是Vue 3中引入的新API,用于更精细地控制对象的代理和响应性。根据您的具体需求,您可以选择是绕过代理对象,提高性能,还是禁用响应性,以便更好地管理您的应用程序状态。当您需要将Vue应用程序与不支持Vue的第三方库或原生浏览器API集成时,toRaw和markRaw非常有用。

lrx276的博客 976

vue3中markRaw详解

在 Vue 3 中,`markRaw` 是一个用于告诉 Vue 的响应性系统不要对某个对象进行转换或追踪其响应性的函数。当你有一个对象,并且你确定你不需要它成为响应性对象时,你可以使用 `markRaw` 来标记它

Br不二 4375

【Vue3 第六章】ref、toRef、toRefs、toRaw 方法应用

ref、toRef、toRefs、toRaw 方法应用

前端知识分享喵 7096

全面讲解Vue中的toRaw函数

toRaw是Vue 3 Composition API中的一个函数,它接收一个由reactive或readonly方法创建的响应式代理对象,并返回该代理对象对应的原始对象。这意味着,通过toRaw函数获取的对象,对其进行的任何修改都不会触发Vue的响应式系统,从而不会引起页面的更新。

4265

vue3 toRaw和markRaw使用原理教程

应用场景,mock数据,data获取的table数据列表。不需要改变 也不允许改变。

jieweiwujie的博客 617

第四篇:关于python程序打包的问题-找不到fsspec

这个问题困扰了我将近两天的时间一直找不到什么好的办法,甚至打算放弃。主要原因是身边没有可以述说的人,也没有可以请教的人。正在想要放弃的时候找到了解决办法。 打包后运行程序是这样的, 大概意思是找不见fsspec这个依赖,刚接触python说实话对于这些第三方库理解不是很到位,我的理解就是:类似于java程序中的jar包,程序找不见了。可怎么让他找见了,刚开始以为我自己没有安装fsspec,在cmd中进行了安装,结果如下图所示 很明显,已经安装并且安装目录都有,跟着网上的一些解决办法,在打包的时候把这.

weixin_47861710的博客 5866

Vue 3中toRaw和markRaw的使用

Vue 3中toRaw和markRaw的使用

weixin_58070962的博客 1090

ROS实践(四)机器人SLAM建图(gmapping)

本文介绍了SLAM技术及其实现方法。SLAM(同步定位与地图构建)让机器人在未知环境中通过传感器数据自主定位并构建地图。文章详细讲解了激光雷达、RGBD相机等常用传感器,以及gmapping和map_server这两个ROS功能包的使用方法。重点阐述了SLAM建图实验步骤:配置gmapping节点参数、启动机器人仿真、运行gmapping节点、使用rviz可视化工具、通过键盘遥控机器人完成地图构建并保存。实验结果表明,该方法能有效实现机器人自主建图功能,为后续导航等应用奠定基础。

qq_1033275663的博客 4338

vueJs中toRaw与markRaw函数的使用比较

01toRaw()函数接收一个reactive响应式数据,将一个响应式的数据变为普通类型的数据,转化为非响应式数据,相当于还原对象,reactive相当于制作,但对于ref响应式数据不起作用将一个由reactive生成的响应式对象转为普通(原始)对象toRaw()可以返回由reactive(),readonly(),shallowReactive()或shallowReadonly()创建的代理对...

itclanCoder 3677

评价模型——层次分析法(AHP)与熵权法(EWM)

层次分析法是定性与定量结合的多准则决策、评价方法。将决策的有关元素分解成目标层、准则层和方案层,并通过人们的判断对决策方案的优劣进行排序,在此基础上进行定性和定量分析。它把人的思维过程层次化、数量化,并用数学为分析、决策、评价、预报和控制提供定量的依据。

好好学习 天天向上 2万+

安卓-折叠屏平行视界适配(多厂商兼容与优先级实战)

本文详细解析了安卓折叠屏平行视界适配的现状与挑战,重点探讨了多厂商兼容性策略和优先级冲突的实战解决方案。通过对比Google的Embedding方案和国内厂商的EasyGo标准,提供了检测设备支持方案、处理优先级冲突及双方案共存的最佳实践,帮助开发者高效完成折叠屏适配。

weixin_29190169的博客 165

vue toRaw和markRaw的使用

在上面的例子中,我们将obj对象通过markRaw函数标记为“非响应式”,然后将它作为data对象的属性。即使obj被修改,data.obj的值仍然保持不变。toRaw和markRaw都是Vue中的响应式辅助函数。

2401_82373036的博客 1132

华为MA5626 ONU开局配置实战:从零到业务就绪的完整命令手册

本文详细介绍了华为MA5626 ONU设备的开局配置全流程,包括物理连接、命令行初始化、业务VLAN划分、PoE功能配置及故障排查。通过实战命令手册,帮助网络工程师快速完成从设备上电到业务就绪的完整配置,特别适合FTTB场景部署。

weixin_26934905的博客 561

【vue3练习 -13】vue3使用toraw(),markRaw()

vue3使用toraw(),markRaw()

weixin_52941842的博客 1279

在 Mac OS 上编译 WebRTC 教程

在 Mac OS 上编译 WebRTC 教程

iShare_Carlos的博客 1249

Open Dynamics Engine(ODE)物理引擎基础教程(I)——特点介绍

下一教程 Open Dynamics Engine(ODE)物理引擎基础教程(II)——相关概念 (在这一教程中将学习刚体、关节、碰撞的概念在ODE中的特点) 本文结构引言介绍特点使用ODE总结 引言 本文翻译自ODE官方教程英文版,有些地方增加了自己的理解。这一节介绍ODE的相关概念。 基础教程英文原版链接【http://ode.org/wiki/index.php?title=Manua...

腿足机器人领域 1680

【Vue3】toRaw与markRaw的使用和示例(转)

【Vue3】toRaw与markRaw的使用和示例(转)

【敦厚的曹操】的专栏 1267

【第三方互联】3、腾讯QQ授权第三方登录

当我们创建的 QQ 互联应用成功后,我们便可以开始使用该应用来实现 QQ 互联 一、获取 APP ID 和 APP Key 1、找到我的应用 2、点击应用,进入详情 这样,我们就获取到了 APP ID 和 APP Key 二、进行开发 1、将 APP ID 、APP Key,以及该应用的信息放入项目中的配置文件中,我使用的是SpringBoot,我放在了 application.y...

JACKAL 22万+

Vue3中toRaw 与 markRaw的使用

toRaw: 作用:将一个由reactive生成的响应式对象转为普通对象。 使用场景:用于读取响应式对象对应的普通对象,对这个普通对象的所有操作,不会引起页面更新。 markRaw: 作用:标记一个对象,使其永远不会再成为响应式对象。 应用场景: 有些值不应被设置为响应式的,例如复杂的第三方类库等。 当渲染具有不可变数据源的大列表时,跳过响应式转换可以提高性能。 代码演示 大气 ...

李公子的博客 4006

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Vue3的toRaw和markRaw

文章目录使用toRaw不使用markRaw使用markRaw toRaw,将响应式对象(由 reactive定义的响应式)转换为普通对象。 markRaw,标记一个对象,使其不能成为一个响应式对象。 使用toRaw main.js import { createApp } from 'vue' import App from './App.vue' createApp(App).mount('#app') App.vue <template> <Demo/> <

richest_qi的博客 9149

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: vue3源码分析 -- h
下一篇: HTML5新特性
ZoeLandia
博客等级 码龄6年 734粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值