vue3中的ref和reactive的区别

vue3中的ref和reactive的区别

    • 1、响应式数据
    • 2、ref
    • 3、reactive
    • 4、ref VS reactive
    • 5、往期回顾
      • 总结:

在这里插入图片描述

1、响应式数据

处理响应式数据时到底是该用ref还是reactive...

响应式数据是指在 Vue.js 中,当数据发生变化时,相关的视图会自动更新以反映这些变化的特性。Vue.js 的响应式系统通过数据绑定实现了数据和视图之间的自动同步。具体来说,当你在 Vue 实例中声明一个数据属性时,Vue 将会将这些属性转换成响应式数据。这意味着当这些属性的值发生变化时,相关的视图会自动更新以反映这些变化。

举例说明:

<template>
  <div>数据a:{{ a }}</div>
  <button @click="add">+1</button>
</template>
<script setup>
let a = 1;
const add = () => {
  a++;
  console.log(a);
};
</script>
<style lang="css" scoped></style>

数据a,点击按钮“+1”,数据a会增加1,并且会打印当前a的值,来看效果

点了n下+1,可是显示的a的值并没有改变,但是我们可以从打印的结果发现,我们的a实际上是改变了的。如果要让我们的a变成一个响应式数据,也就是说a改变,展示在屏幕上的a也要变化,那么我们就要使用到 ref和reactive

2、ref

在 Vue 3 中,ref 是一个用于创建响应式引用的函数。它接受一个初始值作为参数,并返回一个包含响应式引用的对象。使用 ref 创建的值可以在模板中直接使用,并且当其值发生变化时,相关的 DOM 元素会自动更新。ref 通常用于创建可变的响应式值,例如基本类型数据,对象或数组。ref如何发挥作用的;

举例说明ref处理基本数据类型

<template>
  <div>数据a:{{ a }}</div>
  <button @click="add">+1</button>
</template>
<script setup>
import { ref } from "vue";
let a = ref(1)
const add = () => {
 a.value++;
  console.log(a);
};
</script>
<style lang="css" scoped></style>

首先引入ref
在ref的括号中填入a的值
在修改a的值时,我们需要用.value来修改
来看看我们打印出来的a是什么

在使用ref以后,我们的a就变成了一个RefImpl的实例对象,我们可以看到a的值储存在里面的.value属性,于是通过.value我们就可以访问到值,来看看效果:

这样我们a的值就是一个响应式数据了

ref处理对象类型

同样的,有一名叫大C的员工,点击按钮就可以给他涨工资

<template>
   员工信息
   <div>姓名:{{person.name}}</div>
   <div>年龄:{{person.age}}</div>
   <div>工资:{{person.salary}}</div>
   <button @click="addSalary">涨工资</button>
</template>

<script setup>
import {ref} from 'vue'
let person = ref({
    name:'张三',
    age:18,
    salary:10000
})
const addSalary = ()=>{
    person.value.salary += 1000
    console.log(person.value);
}
</script>
<style lang="css" scoped>
</style>

看的出来,这也是一个响应式的数据,我们在处理基本数据类型修改的时候,我们都是用.value来获取数据的,那么这里在修改salary的值的时候不应该是 person.value.salary.value吗?我们来看person.value的打印结果…

我们可以看到,person.value是一个Proxy的实例对象,对象上有了我们的age等属性,所以不需要再接上.value了

3、reactive

在 Vue 3 中,reactive 是一个函数,用于将普通 JavaScript 对象转换为响应式对象。响应式对象的属性在被访问和修改时会自动触发视图的更新,reactive 可以用于创建包含复杂数据结构的响应式对象,如嵌套对象和数组。

reactive是不能用来处理基本数据类型的,reactive处理基本数据类型来看例子:

<template>
    <div>a:{{a}}</div>
 </template>
  <script setup>
 import {reactive} from 'vue'
 const a = reactive(1)
 </script>

这时我们虽然能够看到a显示,但是会报警告:

reactive处理对象数据类型

<template>
    员工信息
    <div>姓名:{{person.name}}</div>
    <div>年龄:{{person.age}}</div>
    <div>工资:{{person.salary}}</div>
    <button @click="addSalary">涨工资</button>
 </template>
 <script setup>
 import {reactive} from 'vue'
 let person = reactive({
     name:'张三',
     age:18,
     salary:10000
 })
 const addSalary = ()=>{
     person.salary += 1000
     console.log(person);
 }
 </script>
 <style lang="css" scoped>
 </style>

先来看看person是什么…

person是Proxy的一个实例对象,到这里你就应该明白怎么访问他的值了…
并且,在上面ref处理对象类型的时候,.value也是一个Proxy的实例对象,到这里,突然意识到原来ref处理对象数据类型的时候会偷偷求助reactive…

4、ref VS reactive

1、返回值类型:

  • ref 返回一个包含响应式基本数据类型值的对象。
  • reactive 返回一个包含响应式对象的 Proxy 对象。
    包装的数据类型:
  • ref 可以包装基本数据类型(如数字、字符串、布尔值等)和引用类型(如对象、数组等)。
  • reactive 只能包装引用类型数据(对象、数组等)。
    访问数据:
  • 通过 ref 创建的响应式对象,需要通过 .value 访问或修改其值。
  • 通过 reactive 创建的响应式对象,可以直接访问和修改其属性。
    应用场景:
  • ref 适用于包装单个基本数据类型或对象。
  • reactive 适用于包装包含多个属性或复杂数据结构的对象。

其实不管是用ref还是 reactive,就像是在情人节选择礼物一样,有时候你需要一束精致的玫瑰(ref),有时候你更想要一份充满惊喜的礼物(reactive)。无论你选择哪个,都是为了让代码更加美好,让开发更加愉快!


5、往期回顾


vue3 + TS + vite 搭建中后台管理系统(完整项目)
vue3 + JS + vant 搭建移动端H5项目(完整项目)
手把手教 Vue3.2+Vite+Echarts 5 绘制3D线条效果中国地图



总结:

前端路上 | 所知甚少,唯善学。
各位小伙伴有什么疑问,欢迎留言探讨。

— 关注我:前端路上不迷路 —




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

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

相关文章

纯css实现-让字符串在文字少时显示为居中对齐,而在文字多时显示为左对齐

纯css实现-让字符串在文字少时显示为居中对齐&#xff0c;而在文字多时显示为左对齐 使用flex实现 思路 容器样式&#xff08;.container&#xff09;: Flex容器的BFC性质使得其内部的子元素&#xff08;.text-box&#xff09;在水平方向上能够居中&#xff0c;通过justify-c…

用node写后端环境运行时报错Port 3000 is already in use

解决方法:关闭之前运行的3000端口,操作如下 1.WindowR输入cmd确定,打开命令面板 2.查看本机端口详情 netstat -ano|findstr "3000" 3.清除3000端口 taskkill -pid 41640 -f 最后再重新npm start即可,这里要看你自己项目中package.joson的启动命令是什…

简单版 git快速上手使用 clone项目 新建/切换分支 提交修改

Git是一个广泛使用的版本控制系统&#xff0c;允许多个用户跟踪文件的更改&#xff0c;并协作开发项目。 首先确定自己电脑已经安装了git&#xff0c;具体安装步骤请查找教程&#xff0c;应该不难。 以windows电脑为例&#xff0c;安装完后在搜索栏搜索git会出现 先解释一下这…

B端系统用户体验最高原则:美观与易用的结合,附大波案例

将美观与易用结合是B端系统用户体验的最高原则&#xff0c; 强调美观忽视易用&#xff0c;那是反人类设计&#xff1b;强调易用忽视美观&#xff0c;那是泯灭人性的设计。本文分享为什么系统要结合二者&#xff0c;欢迎关注点赞&#xff0c;如有需求&#xff0c;可以私信我们。…

租床小程序|租床系统|租赁软件开发功能

随着移动互联网的普及&#xff0c;越来越多的人开始选择在线上完成各种租赁业务&#xff0c;而医院租床也不例外。在这个趋势下&#xff0c;开发一款租赁小程序成为了市场的必然需求。 租床小程序的功能 1、搜索与筛选 为了满足不同用户的需求&#xff0c;小程序应该提供设备…

3/1作业

1.用fwrite和fread将任意bmp图片&#xff0c;修改成德国的国旗 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> int main(int argc, const char *argv[]) { FILE* fp fopen("1.bmp","r")…

Timeplus-proton流处理器调研

概念 Timeplus是一个流处理器。它提供强大的端到端功能&#xff0c;利用开源流引擎Proton来帮助数据团队快速直观地处理流数据和历史数据&#xff0c;可供各种规模和行业的组织使用。它使数据工程师和平台工程师能够使用 SQL 释放流数据价值。 Timeplus 控制台可以轻松连接到不…

Javaweb之SpringBootWeb案例之 Bean管理的Bean作用域详细的解析

2.2 Bean作用域 在前面我们提到的IOC容器当中&#xff0c;默认bean对象是单例模式(只有一个实例对象)。那么如何设置bean对象为非单例呢&#xff1f;需要设置bean的作用域。 在Spring中支持五种作用域&#xff0c;后三种在web环境才生效&#xff1a; 作用域说明singleton容器…

使用Docker搭建一款实用的个人IT工具箱——It-Tools

作为程序员&#xff0c;在日常工作中&#xff0c;需要借助一些工具来提高我们工作效率&#xff0c;IT-Tools是为开发人员度身打造的一套便捷在线工具。它提供全面功能&#xff0c;使开发者能以更高效方式完成任务。经由IT-Tools&#xff0c;开发人员能轻松应对各类技术挑战&…

yolov9 tensorRT 的 C++ 部署

yolov9 tensorRT C 部署 本示例中&#xff0c;包含完整的代码、模型、测试图片、测试结果。 完整的代码、模型、测试图片、测试结果【github参考链接】 TensorRT版本&#xff1a;TensorRT-7.1.3.4 导出onnx模型 导出适配本实例的onnx模型参考【yolov9 瑞芯微芯片rknn部署、地平…

Consul服务注册与发现 Consul配置步骤

Consul服务注册与发现 Consul配置步骤 consul下载地址 Install | Consul | HashiCorp Developer 启动需要在 下载好的文件夹里 用cmd 运行consul agent -dev启动consul Consul配置 配置pom <!--SpringCloud consul config--> <dependency><groupId>org…

基于JSON的Ollama和LangChain agent

到目前为止&#xff0c;我们都可能意识到&#xff0c;通过为LLMs提供额外的工具&#xff0c;我们可以显著增强它们的功能。 例如&#xff0c;即使是ChatGPT在付费版本中也可以直接使用Bing搜索和Python解释器。OpenAI更进一步&#xff0c;为工具使用提供了经过优化的LLM模型&am…

综合练习(二)

目录 列出薪金比 SMITH 或 ALLEN 多的所有员工的编号、姓名、部门名称、领导姓名、部门人数&#xff0c;以及所在部门的平均工资、最高和最低工资 补充 spool Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 列出薪金比 SMITH 或 AL…

我国每年研究生的毕业数量统计分享

本数据集详细记录了自1949年至2021年我国每年研究生的毕业数量&#xff08;包括硕士和博士学位的毕业生&#xff09;。在2021年&#xff0c;我国的研究生毕业生人数达到了772,761人&#xff0c;此数字比上一年度增加了44,000人。 统计的数据单位使用的是人数。 数据展示&…

C语言--修饰符(auto、extern、static)与变量(局部变量+全局变量)和函数的关系

其中extern功能和用法上&#xff0c;比较特殊。先了解extern修饰全局变量&#xff0c;我总结为以下几点 为了方便描述&#xff0c;我创建了一个工程&#xff0c;工程包含了两个源文件&#xff0c;main.c和database.c **1&#xff09;&#xff1a;database.c中使用extern时用来…

【压缩技巧】zip压缩包太大怎么变小?

Zip压缩包是压缩文件体积&#xff0c;便于保存的文件格式&#xff0c;但是有些文件实在是太大了&#xff0c;即使是压缩之后&#xff0c;体积仍然很大&#xff0c;那么&#xff0c;zip压缩包太大怎么变小呢&#xff1f;今天分享几种方法。 方法一&#xff1a; 适当减少文件内…

antvX6 - Vue自定义节点,并实现多种画布操作,拖拽、缩放、连线、双击、检索等等

一、 首先 antv x6 分为两个版本 低版本和高版本 我这里是使用的2.0版本 并且搭配了相关插件 例如&#xff1a;画布的图形变换、地图等 个人推荐 2.0版本&#xff0c;高版本配置多&#xff0c;可使用相关插件多&#xff0c;但是文档描述小&#xff0c;仍在更新&#xff0c; 低…

openGauss学习笔记-231 openGauss性能调优-系统调优-资源负载管理-资源负载管理概述

文章目录 openGauss学习笔记-231 openGauss性能调优-系统调优-资源负载管理-资源负载管理概述231.1 功能描述231.2 相关概念**231.2.1 资源管理****231.2.2 控制组****231.2.3 资源池** openGauss学习笔记-231 openGauss性能调优-系统调优-资源负载管理-资源负载管理概述 231.…

java009 - Java调试debugger

1、debugger概述 程序的调试工具&#xff0c;用于查看追踪程序的执行流程&#xff0c;也可以调试程序。 2、debugger调试流程 2.1 如何加断点 2.2 如何运行加了断点的程序 在代码区域右键---->debugger执行 2.3 看哪里 看console窗口 2.4 点哪里 点step into(F7)这个箭…

异常处理(黑马学习笔记)

当前问题 登录功能和登录校验功能我们都实现了&#xff0c;下面我们学习下今天最后一块技术点&#xff1a;异常处理。首先我们先来看一下系统出现异常之后会发生什么现象&#xff0c;再来介绍异常处理的方案。 我们打开浏览器&#xff0c;访问系统中的新增部门操作&#xff0…