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有了更深入的理解,并能在实际项目中灵活运用它。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Postman接口测试】第二节.Postman界面功能介绍(上)

文章目录 前言一、Postman前言介绍二、Postman界面导航说明三、使用Postman发送第一个请求四、Postman 基础功能介绍 4.1 常见类型的接口请求 4.1.1 查询参数的接口请求 4.1.2 表单类型的接口请求 4.1.3 上传文件的表单请求 4.1.4 JSON 类…

HCIP-Datacom-ARST自选题库__BGP/MPLS IP VPN简答【3道题】

1.在BGP/MPLSIPVPN场景中,如果PE设备收到到达同一目的网络的多条路由时,将按照定的顺序选择最优路由。请将以下内容按照比较顺序进行排序。 2.在如图所示的BGP/MPLSIP VPN网络中,管理员准备通过Hub-Spoke组网实现H站点对VPM流量的集中管控&am…

C# 配置文件设置详解

文章目录 1. 配置文件在 C# 项目中的作用和重要性2. 不同类型的配置文件app.configconfig.exejson 3. 创建和修改配置文件文件位置添加内容修改内容保存和加载 4. 读取和写入配置文件app.config 文件读取config.exe 文件写入JSON 文件读写 5. 示例代码演示6. 配置文件在安全性方…

【kubernetes】关于k8s集群的污点、容忍、驱逐以及k8s集群故障排查思路

目录 一、污点(Taint) 1.1污点介绍 1.2污点的组成格式 1.3当前 taint effect 支持如下三个选项: 1.4污点的增删改查 1.4.1验证污点的作用——NoExecute 1.4.2验证污点的作用——NoSchedule 1.4.3 验证污点的作用——PreferNoSchedule 1.5污点的配置与管理…

php反序列化学习(1)

1、php面向对象基本概念 类的定义: 类是定义了一件事物的抽象特征,它将数据的形式以及这些数据上的操作封装住在一起。(对象是具有类类型的变量,是对类的实例) 构成: 成员变量(属性&#xf…

基于开源项目HAL STM32F4 +DSP库跑SVPWM开环速度测试

HAL STM32F4 ARM DSP库跑SVPWM开环速度测试 ✨本篇硬件电路和代码来源于此开源项目:https://github.com/MengYang-x/STM3F401-FOC/tree/main📍硬件电路和项目介绍,立创开源广场:https://oshwhub.com/shadow27/tai-yang-neng-wu-re…

走进智慧仓储:3D可视化工厂园区革新物流新纪元

在快节奏的现代生活中,物流仓储行业扮演着至关重要的角色。随着科技的飞速发展,传统仓储模式正面临一场前所未有的变革。今天,就让我们一起看看3D可视化技术如何为物流行业带来前所未有的便利与效率。 什么是3D可视化工厂园区? 3…

【最新区块链论文录用资讯】CCF A—INFOCOM 2024 共17篇

Conference:IEEE International Conference on Computer Communications CCF level:CCF A Categories:计算机网络 Year:2024 Num:17 A Generic Blockchain-based Steganography Framework with High Capacity via …

Python: 使用pyotp实现OTP一次性密码验证

使用pyotp实现OTP一次性密码验证 OTP的基本原理 生成一个共享秘钥作为随机数的种子服务端通过种子计算出当前的密码客户端也通过相同的种子计算出当前的密码验证客户端生成的密码和服务端生成的密码是否匹配 服务端和客户端计算的方式一样 共享密钥 时间因子 算法 > 密…

多个文本如何一键导出二维码?在线批量生码的制作方法

当存在多条文本数据并且需要将每条数据生成单独的二维码来使用,很多小伙伴可能还在用一个一个来制作的方法,在二维码生成器上将文本转二维码。这种方式操作起来比较的繁琐,需要浪费大量的时间,那么有什么方法可以简化这个过程吗&a…

YOLOv10代码详细介绍(附录训练教程和权重)

前言 YOLOv10 是清华大学研究人员在 UltralyticsPython 清华大学的研究人员在 YOLOv10软件包的基础上,引入了一种新的实时目标检测方法,解决了YOLO 以前版本在后处理和模型架构方面的不足。通过消除非最大抑制(NMS)和优化各种模型…

[从零开发JS应用] 如何在VScode中配置Javascript环境,常见的调试方法有哪些?

一、安装VSCode和Node.js 记录环境配置:本文配置的环境主要针对单独JS文件的断点调试,主要是为了调试LeetCode里面的代码。 首先在官网下载对应的版本:https://nodejs.org/en/ 开始安装,可以自定义选择安装路径。 这里选择Add Pa…

【亲测,安卓版】快速将网页网址打包成安卓app,一键将网页打包成app,免安装纯绿色版本,快速将网页网址打包成安卓apk

背景:部分客户需求将自己网站打包成app,供用户在浏览器安装使用、 网页网址快速生成app 准备材料操作流程第一步:打开HBuilder X新建项目第二步创建Wap2App项目第三步修改App图标第四步发布app第五步查看apk 准备材料 1.需要打包的网页 2.ap…

页面加载不出来,报错[@umijs/runtime] load component failed

问题描述 页面加载不出来数据,一直在旋转,控制台输出内容如下: 原因分析: 之前页面是没有问题的,在写当前页面突然出现页面加载不出来,控制台报错,主要是页面引入了这行代码报错 import { …

MX Component基础使用(多点位读取,多点位写入)

步骤,先连接PLC,然后在填入对应的点位 D10 然后去读取。 using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;us…

边缘计算网关的主要功能有哪些?天拓四方

随着物联网(IoT)的快速发展和普及,边缘计算网关已经成为了数据处理和传输的重要枢纽。作为一种集成数据采集、协议转换、数据处理、数据聚合和远程控制等多种功能的设备,边缘计算网关在降低网络延迟、提高数据处理效率以及减轻云数…

民国漫画杂志《时代漫画》第13期.PDF

时代漫画13.PDF: https://url03.ctfile.com/f/1779803-1247458360-14efab?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了,截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络!

数组的定义、顺序存储及特殊矩阵的存储

目录 一、数组的定义 1.1概念 1.2抽象数据类型定义 二、数组的顺序存储 2.1一维数组元素的存储位置 2.2二维数组元素的存储位置 2.3三维数组元素的存储位置 三、特殊矩阵的压缩存储 3.1相关概念 3.2对称矩阵 3.3三角矩阵 3.4对角矩阵(带状矩阵&#xff0…

【机器学习300问】102、什么是混淆矩阵?

一、混淆矩阵的定义 混淆矩阵是一种用于评估分类模型性能的评估指标。当模型对数据进行预测并将数据分配到预定义的类别时,混淆矩阵提供了一种直观的方式来总结这些预测与数据实际类别之间的对应关系。具体来说,它是一个表格。 二、分类模型性能评估一级…

js setTimeout、setInterval、promise、async await执行顺序梳理

基础知识 async: 关键字用于标记一个函数为异步函数,该函数中有一个或多个promise对象,需要等待执行完成后才会继续执行。 await:关键字,用于等待一个promise对象执行完,并返回其中的值,只能在async函数内部使用。可…