vue3中的toRaw API

文章目录

    • 什么是toRaw API?
    • 为什么需要toRaw?
    • 如何使用toRaw?
    • 实际应用场景


在这里插入图片描述

这两天在写项目的时候,发现了一个之前没用过的api,于是上网查了一下,发现这个api还是挺常用,所以在这记录一下

什么是toRaw API?

toRaw 是 Vue 3 中的新工具,用于获取一个响应式对象的原始对象。Vue 3 中引入了响应式代理,这意味着我们通常处理的是被代理的对象,而不是原始对象。toRaw 提供了一种方式,可以绕过代理,直接访问和操作原始数据。

为什么需要toRaw?

在某些情况下,直接操作原始对象比操作响应式代理更有效。以下是一些常见的场景:

  • 调试和日志记录:在调试或记录对象时,直接输出代理对象可能会导致混淆,使用toRaw可以更清晰地看到原始数据。
  • 性能优化:有时我们需要跳过代理机制进行一些性能关键的操作,这时toRaw可以派上用场。
  • 库和插件开发:如果你在开发Vue插件或库,可能需要处理原始对象而不是响应式代理。

如何使用toRaw?

使用toRaw非常简单。它是一个从vue包中导出的函数,接受一个响应式对象并返回其原始对象。以下是一个基本示例:

import { reactive, toRaw } from 'vue';

const state = reactive({
  count: 0,
  nested: {
    message: 'Hello, Vue 3!'
  }
});

// 获取原始对象
const rawState = toRaw(state);

console.log(rawState); // { count: 0, nested: { message: 'Hello, Vue 3!' } }

// 修改原始对象不会触发响应式更新
rawState.count = 1;
console.log(state.count); // 0

// 修改响应式对象会正常工作
state.count = 2;
console.log(state.count); // 2
console.log(rawState.count); // 2

在这个示例中,我们首先创建了一个响应式对象state。然后,我们使用toRaw获取了这个响应式对象的原始对象rawState。可以看到,对原始对象的修改不会触发响应式更新,而对响应式对象的修改则会同步到原始对象。

实际应用场景

1、调试和日志记录
在调试复杂的响应式对象时,直接查看代理对象可能会让人困惑。使用toRaw可以更清晰地查看对象的实际结构。

import { reactive, toRaw } from 'vue';

const state = reactive({
  user: {
    name: 'Alice',
    age: 25
  }
});
console.log(toRaw(state));

2、性能优化
在处理大量数据时,跳过响应式代理进行操作可以提高性能。例如,在大型列表的批量更新中,直接操作原始对象会更高效。

import { reactive, toRaw } from 'vue';

const list = reactive([...Array(10000).keys()]);

const rawList = toRaw(list);

// 直接操作原始数组,提高性能
rawList.forEach((item, index) => {
  rawList[index] = item * 2;
});

console.log(list[0]); // 0,因为没有触发响应式更新
console.log(rawList[0]); // 0,因为我们直接修改的是原始对象

3、库和插件开发
在开发Vue插件或库时,可能需要处理原始对象而不是代理对象。例如,在创建一个深拷贝函数时,使用toRaw可以避免循环引用和代理对象带来的问题。

import { reactive, toRaw } from 'vue';

function deepClone(obj) {
  if (obj === null || typeof obj !== 'object') {
    return obj;
  }

  const cloned = Array.isArray(obj) ? [] : {};

  for (const key in obj) {
    cloned[key] = deepClone(toRaw(obj[key]));
  }

  return cloned;
}

const state = reactive({
  user: {
    name: 'Bob',
    age: 30
  }
});

const clonedState = deepClone(state);
console.log(clonedState); // { user: { name: 'Bob', age: 30 } }

总的来说,toRaw 是 Vue 3 中一个非常有用的工具,它允许我们直接访问和操作响应式对象的原始数据。在调试、性能优化以及库和插件开发中,toRaw 都能发挥重要作用。通过本文的介绍,希望你对toRaw有了更深入的理解,并能在实际项目中灵活运用它。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/658006.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++容器之栈(std::stack)

目录 1 概述2 使用实例3 接口使用3.1 construct3.2 empty3.3 size3.4 top3.5 push3.6 emplace3.7 pop3.8 swap1 概述 堆栈是一种容器适配器,专门设计用于在后进先出(后进先出)环境中操作,其中元素仅从容器的一端插入和提取。   堆栈被实现为容器适配器,容器适配器是使用…

界面控件DevExtreme v23.2亮点 - 标签、表单、编辑器功能升级

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NET Core,jQuery,Knockout等)构建交互式的Web应用程序。从Angular和Reac&#xff0c…

爬虫在金融领域的应用:股票数据收集

介绍 在金融领域,准确及时的数据收集对于市场分析和投资决策至关重要。股票价格作为金融市场的重要指标之一,通过网络爬虫技术可以高效地从多个网站获取实时股票价格信息。本文将介绍网络爬虫在金融领域中的应用,重点讨论如何利用Scrapy框架…

推券客CMS淘宝优惠券网站源码

推券客CMS淘宝优惠券网站源码是一个以PHPMySQL进行开发的PHP淘宝客优惠券网站。支持电脑站、手机站以及微信公众号查券。支持多级代理返利和阿里妈妈最新的渠道管理等功能。 五大优势 一、全开源 推券客cms网站程序数据库完全开源,目前市场上基本都是以下2种淘宝客系统 第一…

免费插件集-illustrator插件-Ai插件-文本对象分行

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件,加强illustrator使用人员工作效率,进行文本对象分行。首先从下载网址下载这款插件 https://download.csdn.net/download/m0_67316550/87890501&…

简单3步,ERP、OA、CRM等客户端,安全远程访问服务端

如今,企业员工出差远程办公和分支机构的协同工作变得越来越普遍。然而,如何确保在不同地点的员工都能安全、便捷地访问公司内网的C/S(Client/Server)架构办公系统,是一个亟待解决的问题。 贝锐花生壳内网穿透服务提供…

postgressql——Tuple学习(2)

Tuple含义 作用 PG并没有像Oracle那样的undo来存放旧数据,而且PG没有真正意义上的delete,而是将旧版本直接存放于relation文件中,也就是成为了dead tuple。我们可以理解成“过期的数据”含义 tuple就相当于一个存储数据的小容器,…

Android Compose 九:interactionSource 的使用

先上官方文档 InteractionSource InteractionSource represents a stream of Interactions corresponding to events emitted by a component. These Interactions can be used to change how components appear in different states, such as when a component is pressed or…

DL/ML/RL/TL/FL机器学习框架总结

前言 本文总结了DL/深度学习、ML/机器学习、DML/分布式机器学习、AutoML/自动化机器学习、RL/强化学习、MLaaS/机器学习及服务、SR/语音识别领域的机器学习框架,可作为学习、研究、研发的参考资料。 1.DL/深度学习框架 PyTorch PyTorch是一个开源的Python机器学…

让 AI 回答更精准 来学学这些Prompt入门小技巧

🎥前言 最近一直在研究各种 AI 提问相关的方法,一顿输入后,get到了好多有趣又好玩的提问小技巧。今天就来和小伙伴们安利下,平常在向AI提问时,最最基础,且最最实用的6种提示词方法。 那废话不多说&#x…

vue3-api之provide与inject

传值&#xff1a; 父组件 > 子组件 > 孙组件 // 父组件 <template><div class"app"><h3>我是app组件(祖) --- {{ name }} {{ price }}</h3><child /></div> </template><script> import { reactive, toRefs,…

手机信息恢复:应对数据丢失的策略与技术

由于各种原因&#xff0c;我们经常会遭遇到手机数据丢失的困境。如何有效地应对数据丢失&#xff0c;找回那些对我们来说至关重要的信息&#xff1f;这就需要我们了解和掌握手机信息恢复的策略与技巧。本文将为您揭示信息数据恢复的奥秘&#xff0c;介绍应对数据丢失的实用方法…

第十三周 5.27面向对象的三大特性(封装、继承、多态)(三)

3.instanceof避免类型转换异常: (1)语法:引用名 instanceof 类名 (2)执行:判断引用中存储的实际对象类型是否兼容于后面的类型(是否为后面类型的一种)&#xff0c;兼容一true&#xff0c;不兼容—false (3)作用:可以在程序设计中避免类型转换异常 直接使用案例…

pytorch-16 复现经典网络:LeNet5与AlexNet

一、相关概念 对于&#xff08;10,3,227,227&#xff09;数据表示&#xff0c;10张3通道的图&#xff0c;图的大小&#xff08;特征数&#xff09;为227*227. 通道数&#xff1a;作为卷积的输入通道数和输出通道数。 特征数&#xff1a;特征图的大小 步长stride和填充padding&…

【Unity入门】认识Unity编辑器

Unity 是一个广泛应用于游戏开发的强大引擎&#xff0c;从 1.0 版本开始到现在&#xff0c;其编辑器的基本框架一直保持稳定。其基于组件架构的设计&#xff0c;使得界面使用起来直观且高效。为了更好地理解 Unity 的界面&#xff0c;我们可以将其比喻为搭建一个舞台。以下是对…

K8s 小白入门|从电影配乐谈起,聊聊容器编排和 K8s

来听听音乐 电影&#xff0c;是我们生活中的重要调味剂。 配乐&#xff0c;是电影中不可或缺的一部分。 有的时候&#xff0c;配乐可以跟剧情共振&#xff0c;让你按捺不住自己的情绪&#xff0c;或眼含热泪、或慷慨激昂、或人仰马翻、或怅然若失&#xff1b; 有的时候&…

AI图书推荐:基于ChatGPT API和Python开发应用程序的详细指南

ChatGPT已经以其革命性的能力引起了人们的关注&#xff0c;利用其API可能会成为你的游戏规则改变者。这不仅仅是关于编码&#xff1b;它是关于为您的创作添加一层智能&#xff0c;将它们提升到之前无法想象的水平。《基于ChatGPT API和Python开发应用程序的详细指南》&#xff…

让EXCEL VBA支持鼠标滚轮,vb6 IDE鼠标滚轮插件原理

vb6 IDE鼠标滚轮插件怎么运行的(适用于VBA) 使用 Spy&#xff0c;我发现代码窗口正在获取 WM_MOUSEWHEEL 事件&#xff0c;但没有触发 WM_VSCROLL 消息。因此&#xff0c;我编写了一个简单的消息钩子&#xff0c;当它捕获鼠标滚轮事件时触发滚动事件。 我从 Spy 得知代码窗口的…

从零自制docker-14-【实现 mydocker commit 打包容器成镜像】

文章目录 目标注意exec.Commandtar代码结果 目标 piveroot切换工作目录到/merged后&#xff0c;通过docker commit将此时工作目录的文件系统保存下来&#xff0c;使用tar包将该文件系统打包为tar文件 命令类似 ./mydocker commit myimage然后当前目录下会得到myimage.tar 注意…

SA316系列音频传输模块-传输距离升级音质不打折

SA316是思为无线研发的一款远距离音频传输模块&#xff0c;音频采样率为48K&#xff0c;传输距离可达200M。为了满足更多用户需求&#xff0c;思为无线在SA316基础上进一步增加传输距离推出SA316F30。相比SA316性能&#xff0c;同样其采用48K采样&#xff0c;-96dBm灵敏度&…