Vue3 的ref和reactive的用法和区别

news2024/12/29 1:38:08

一、是什么?

ref和reactive是Vue3中用来实现数据响应式的API,一般情况下,ref定义基本数据类型,reactive定义引用数据类型。

二、基础用法

1. ref

ref的参数一般是基本数据类型,也可以是对象类型;如果参数是对象类型,其实底层的本质还是reactive,系统就会自动将ref转换为reactive;我们如果去访问ref定义的值,那么就使用.value的属性去访问定义的数据;ref的底层原理同reactive一样,都是Proxy。

基础用法

let num = ref(0) // 定义
let isShow = ref(false)  // 定义

const onChange = () => {
	num.value++  // js使用
	isShow.value = true  // js使用
}
<!-- Vue3模板引用使用 -->
<Modal v-model="isShow"></Modal>

2. reactive

reactive定义引用数据类型(以对象和数组举例),它能够将复杂数据类型的内部属性或者数据项声明为响应式数据,所以reactive的响应式是深层次的,其底层是通过ES6的Proxy来实现数据响应式,相对于Vue2的Object.defineProperty,具有能监听增删操作,能监听对象属性的变化等优点。

基础用法

const pageConfig = reactive({
	pageNum: 1,
	pageSize: 10
}) // 定义

const onChange = () => {
	pageConfig.pageNum = 2;
	pageConfig.pageSize = 20;
}
<!-- Vue3模板引用使用 -->
<Page :current="pageConfig.pageNum"></Page>

若用reactive定义基本数据类型,Vue3会报警告错误,如图

const str = reactive('字符串')

 3. ref和reactive定义数组对比

ref定义数组

const tableData = ref([]) // 定义

const getTableData = async () => {
	const { data } = await getTableDataApi() // 模拟接口获取表格数据
	tableData.value = data // 修改
}
<!-- Vue3模板引用使用 -->
<Table :data="tableData"></Table>

以我们常用的表格数据举例,可以看到,ref定义数组与定义基本数据类型没什么差别,接下来看看reactive

const tableData = reactive([]) // 定义

const getTableData = async () => {
	const { data } = await getTableDataApi() // 模拟接口获取表格数据
	tableData = data // 修改,错误示例,这样赋值会使tableData失去响应式
}
<!-- Vue3模板引用使用 -->
<Table :data="tableData"></Table>

需要注意的是,reactive定义的数组使用 tableData = data 的修改方式会造成 tableData 响应式丢失,解决方法如下:

// 方法一:改为 ref 定义
const tableData = ref([])
const getTableData = async () => {
	const { data } = await getTableDataApi()
	tableData.value = data // 使用.value重新赋值
}
// 方法二:使用 push 方法
const tableData = reactive([])
const getTableData = async () => {
	const { data } = await getTableDataApi()
	tableData.push(...data) // 先使用...将data解构,再使用push方法
}
// 方法三:定义时数组外层嵌套一个对象
const tableData = reactive({ list:[] })
const getTableData = async () => {
	const { data } = await getTableDataApi()
	tableData.list = data // 通过访问list属性重新赋值
}

4. Proxy vs defineProperty

reactive方法内部是利用ES6的Proxy API来实现的,这里与Vue2中的defineProperty方法有本质的区别。

  • defineProperty只能单一地监听已有属性的修改或者变化,无法检测到对象属性的新增或删除,而Proxy可以轻松实现;
  • defineProperty无法监听属性值是数组类型的变化,而Proxy可以轻松实现。

三、ref 和reactive的区别

  • ref用于定义基本类型和引用类型,reactive仅用于定义引用类型;
  • reactive只能用于定义引用数据类型的原因在于内部是通过ES6的Proxy实现响应式的,而Proxy不适用于基本数据类型;
  • ref定义对象时,底层会通过reactive转换成具有深层次的响应式对象,所以ref本质上是reactive的再封装;
  • 在JS中我们如果去对数据进行操作,在ref定义的数据中,使用变量.value;访问reactive不需要;
  • 在定义数组时,建议使用ref,从而可避免reactive定义时值修改导致的响应式丢失问题。
     

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

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

相关文章

BugKu CTF(杂项篇MISC)—想要种子吗

BugKu CTF(杂项篇MISC)—想要种子吗 提 示: 描 述:flag{} 题目下载后是一张图片&#xff0c;打开如下。 一、工具 十六进制编辑器010 editor kali系统文件分离工具binwalk或者foremost 维吉尼亚密码 STEGHIDE图片隐写工具 文章所需的软件下载地址 ARCHPR压缩包密码破解…

5分钟快速掌握低代码和无代码工具

一、低代码和无代码平台&#xff0c;堪比编程界的美图秀秀&#xff01; 与传统编程平台相比&#xff0c;低代码和无代码开发平台让开发人员及非技术用户可以更快速地开发应用程序&#xff0c;而成本变得更低。本文将带你一起了解什么是低代码与无代码平台。 低代码和无代码开发…

Spark性能调优之数据序列化

前言 在使用Spark进行数据开发的时候,避不开的一个问题就是性能调优。网上一搜一大堆所谓的调优策略很多作者自己都不知所云,导致读者看了后只会更加困惑。我们在研究一个技术的时候第一手资料永远都请参考官网,官网对性能优化不一定是最全甚至最优,但是可以解决大部分问题…

微信新增的“上锁”功能,上班族狂喜!

近期 微博话题 #微信新增锁定功能# 冲上热搜 引发关注 微信锁&#x1f512; 这个功能对于经常使用微信办公的上班族来说很实用&#xff0c;信息安全得到极大提升&#xff0c;当你搬砖时&#xff0c;在电脑登陆了自己的微信&#xff0c;如果这个时候去拿个外卖&#xff0c;又…

021 - STM32学习笔记 - Fatfs文件系统(三) - 细化与总结

021 - STM32学习笔记 - Fatfs文件系统&#xff08;三&#xff09; - 细化与总结 上节内容中&#xff0c;初步实现了FatFs文件系统的移植&#xff0c;并且实现了设备的挂载、文件打开/关闭与读写功能&#xff0c;这里对上节遗留的一些问题进行总结&#xff0c;并且继续完善文件…

经纬恒润推出整车E/E全链路测试实验室解决方案

仿真测试作为“V流程”右半部分最重要的组成部分&#xff0c;是汽车电子电气测试不可或缺的技术手段。随着各种各样的测试设备进场&#xff0c;如何高效地统筹规划仿真测试实验室&#xff0c;成为了各车企关心的问题。 仿真测试实验室不仅能够服务于汽车电子零部件的仿真测试&…

Robot Framweork之UI自动化测试---元素定位的4种方式

在Robot Framweork的UI自动化测试中&#xff0c;元素定位主要有四种&#xff0c;即通过id&#xff0c;name&#xff0c;xpath和CSS定位。 一、id定位 id就好比一个人身份证&#xff0c;元素在 HTML 页面中的唯一标识符&#xff0c;因此 ID 定位方式是最常用的方式之一&#xf…

WMI 介绍

1.什么是WMI WMI的全称是Windows Management Instrumentation,即WIndows管理规范。它允许通过一个公共接口访问多种操作系统的构成单元,实现对操作系统的信息获取及管理操作。 Windows提供了一个WMI测试器&#xff0c;使得查询这些内容变得尤为方便。按下"winR&q…

安装nvm之后,node -v 提示‘node‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件

1. 检查有没有执行这个命令&#xff1a;nvm use [nodejs version name] 2. 检查nvm安装位置同级&#xff0c;有没有nodejs文件夹&#xff0c;是一个快捷键&#xff01;如果有一个其他的nodejs&#xff0c;把它删掉&#xff0c;然后到cmd中&#xff0c;重新nvm install一下&…

Centos7 上安装 redis-dump 和redis-load 命令

一、安装rvm 1、安装GPG keys gpg2 --keyserver keyserver.ubuntu.com --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDBcurl -sSL http://rvm.io/mpapis.asc | gpg2 --import - curl -sSL http://rvm.io/pkuczynski.asc | g…

SQL-多表

create table course (id int auto_increment primary key comment 主键id,name varchar(10) comment 课程名字 ); insert into course (name) values (java),(linux),(SQL);create table course_student (id int auto_increment primary key comment 主键id,studentid int not…

低代码开发平台源码:基于模型驱动,内置功能强大的建模引擎,零代码也能快速创建智能化、移动化的企业应用程序

管理后台低代码PaaS平台是一款基于 Salesforce Platform 的开源替代方案&#xff0c;旨在为企业提供高效、灵活、易于使用的低代码开发平台。低代码PaaS平台的10大核心引擎功能:1.建模引擎 2.移动引擎 3.流程引擎 4.页面引擎 5.报表引擎 6.安全引擎 7.API引擎 8.应用集成引擎 9…

MySQL执行一条select语句,执行过程怎么样

执行一条select语句&#xff0c;执行过程怎么样 连接器 与客户端进行 TCP 三次握手建立连接&#xff1b;MySQL基于TCP协议进行传输的校验客户端的用户名和密码&#xff0c;如果用户名或密码不对&#xff0c;则会报错如果用户名和密码都对了&#xff0c;会读取该用户的权限&…

湖南省物业满意度研究(群狼调研)

01 行业现状 随着湖南省物业行业的蓬勃发展&#xff0c;物业管理走向规范化的道路。近年来&#xff0c;湖南省物业管理行业迎来飞速发展的黄金时期&#xff0c;全省物业服务相关企业已超过9万家&#xff0c;其中长沙市占据了四成以上。 数据来源&#xff1a;天眼查公开数据 在…

直播丨如何用最新的 Serverless 技术让文化古籍“活过来”?

当前&#xff0c;古籍数字化面临技术难度高、资金缺口大、人才紧张等难点。云计算和人工智能技术可以高效实现古籍产品化、可视化、平台化&#xff0c;不仅使其保存形式迈上一个新台阶&#xff0c;还可以有效降低用户阅读门槛。 本次 Serverless 圆桌派 特别邀请上海慧游文化 …

TCGA数据批量运行Coxph函数

df数据框形如&#xff1a; djs.coxph <- function(df,genelist){library(survival)library(survminer)dir.create("./survival")setwd("./survival")# 准备好的生存分析数据框&#xff0c;变量中包括OS.time,OS以及values of gene expression df <…

论文阅读 - Few-shot Network Anomaly Detection via Cross-network Meta-learning

论文链接&#xff1a;https://arxiv.org/pdf/2102.11165.pdf 目录 摘要&#xff1a; 引言 问题定义 方法 Graph Deviation Networks Cross-network Meta-learning 摘要&#xff1a; 网络异常检测旨在找到与绝大多数行为显着不同的网络元素&#xff08;例如节点、边、子图…

河北沃克仓储解决方案最新布局|HEGERLS四向穿梭车在高标仓和楼层仓中的应用

河北沃克金属制品有限公司是业内十分稀缺可提供整体物流仓储解决方案并落地的企业&#xff0c;既拥有自主研发和生产等一整套核心软硬件的能力&#xff0c;又具备丰富的整体方案规划与实施经验。经过多年积累和开拓&#xff0c;河北沃克金属制品有限公司业务已拓展覆盖近众多行…

如何列出phpMyAdmin左侧菜单中的所有表格 - 不分页 - 显示数据库所有的表

效果图 原来 优化后 步骤 点击logo&#xff0c;回到首页 点击设置 》 导航面板 》 导航树 》 节点中最大项数 》 应用 ok

Windows下RocketMQ的启动

下载地址&#xff1a;下载 | RocketMQ 解压后 一、修改runbroker.cmd 修改 bin目录下的runbroker.cmd set "JAVA_OPT%JAVA_OPT% -server -Xms2g -Xmx2g" set "JAVA_OPT%JAVA_OPT% -XX:MaxDirectMemorySize15g" set "JAVA_OPT%JAVA_OPT% -cp %CLASSP…