vue3中的包装响应式数据ref、reactive、toRef、toRefs

news2024/11/15 10:20:27

一、ref

Vue 3中拥有一个新的特性叫做ref,它是一个函数,用于包装响应式数据。与Vue 2的data选项不同,ref可以在普通JavaScript中使用,而不仅仅是在Vue组件中。ref可以将普通的JavaScript数据变成响应式的,这意味着当被包装的数据发生变化时,Vue会自动侦测到并更新相应的界面。

以下是ref的用法:

<template>
  <div>
    <p>{{ count }}</p>
    <button @click="increase">Increase</button>
  </div>
</template>

<script>
import { ref } from 'vue'

export default {
  setup() {
    const count = ref(0)

    const increase = () => {
      count.value++
    }

    return {
      count,
      increase
    }
  }
}
</script>

在这里插入图片描述

在上面的例子中,我们在Vue组件的setup函数中使用ref创建了一个响应式变量count。在模板中,我们可以使用count变量并通过count.value进行访问。

二、reactive

在Vue 3中,reactive是一个用于将对象转化为响应式的函数。

使用reactive函数将一个普通的对象转化为响应式对象,从而可以追踪对象的变化并在其变化时更新依赖的地方。

使用方法如下:

  1. 首先,在Vue 3中引入reactive函数:
import { reactive } from 'vue'
  1. 创建一个普通对象:
const myObject = {
  foo: 'bar',
  baz: {
    qux: 42
  }
}
  1. 使用reactive函数将对象转化为响应式对象:
const reactiveObject = reactive(myObject)

现在reactiveObject是一个响应式对象,任何对其属性的修改都将会触发响应式更新。例如,可以通过以下方式修改属性:

reactiveObject.foo = 'baz'
reactiveObject.baz.qux = 99

当属性发生变化时,依赖于该属性的组件将会自动重新渲染。

  1. 使用reactiveObject对象的值:
console.log(reactiveObject.foo) // 输出 'baz'
console.log(reactiveObject.baz.qux) // 输出 99

通过reactive函数创建的对象,可以像普通对象一样进行访问和修改。

举例说明:

<template>
	<h2>姓名:{{person.name}}</h2>
	<h2>年龄:{{person.age}}</h2>
	<h3>工作种类:{{person.job.type}}</h3>
	<h3>工作薪水:{{person.job.salary}}</h3>
	<h3>爱好:{{person.hobby}}</h3>
	<button @click="changeInfo">修改人的信息</button>
</template>

<script>
	import {reactive} from 'vue'
	export default {
		name: 'App',
		setup(){
			//数据
			let person = reactive({
				name:'张三',
				age:18,
				job:{
					type:'前端工程师',
					salary:'30K',
				},
				hobby:['抽烟','喝酒','烫头']
			})

			//方法
			function changeInfo(){
				person.name = '李四'
				person.age = 48
				person.job.type = 'UI设计师'
				person.job.salary = '60K'
				person.hobby[0] = '学习'
			}

			//返回一个对象(常用)
			return {
				person,
				changeInfo
			}
		}
	}
</script>


在这里插入图片描述
点击修改个人信息按钮之后
在这里插入图片描述

通过响应式对象person 的属性修改,Vue会自动更新依赖该属性的地方,并重新渲染相关组件。

三、toRef、toRefs

在Vue 3中,toRef和toRefs是用来创建响应式引用的函数。

  1. toRef函数: toRef接受一个响应式对象和对象的key,并返回一个ref引用,将该key所对应的值包装成一个ref对象。如果在组件中修改了ref对象的值,也会修改源对象中的值。

    例子:

    import { reactive, toRef } from 'vue';
    
    const state = reactive({
      count: 0,
    });
    
    const countRef = toRef(state, 'count');
    console.log(countRef.value); // 输出 0
    
    countRef.value += 1;
    console.log(state.count); // 输出 1
    

    应用场景:

    • 当我们需要将响应式对象的某个属性值以ref的形式,单独拿出并使用时,可以使用toRef函数。
  2. toRefs函数: toRefs接受一个响应式对象,并返回一个包含该对象所有属性的ref对象。toRef返回的是一个ref引用的单个值,而toRefs返回一个包含了所有属性的ref对象,使得我们可以以解构的方式访问和修改属性的值。

    例子:

    import { reactive, toRefs } from 'vue';
    
    const state = reactive({
      count: 0,
      text: 'Hello',
    });
    
    const refs = toRefs(state);
    console.log(refs.count.value); // 输出 0
    console.log(refs.text.value); // 输出 'Hello'
    
    refs.count.value += 1;
    console.log(state.count); // 输出 1
    

    应用场景:

    • 在模板中循环遍历一个响应式对象时,可以使用toRefs将整个响应式对象转换为ref对象,以便在模板中访问和修改属性的值。

比如这样:

<template>
	<h2>姓名:{{name}}</h2>
	<h2>年龄:{{age}}</h2>
	<h2>薪资:{{job.j1.salary}}K</h2>
</template>

<script>
	import {reactive,toRefs} from 'vue'
	export default {
		name: 'Demo',
		setup(){
			//数据
			let person = reactive({
				name:'张三',
				age:18,
				job:{
					j1:{
						salary:20
					}
				}
			})
			//返回一个对象(常用)
			return {
				...toRefs(person)
			}
		}
	}
</script>


需要注意的是,toRefs函数返回的是一个包含ref对象的普通对象,而不是ref对象本身。如果需要在模板中使用属性的值,需要通过.value来访问。

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

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

相关文章

Python接口自动化测试post请求和get请求,获取请求返回值

引言 我们在做python接口自动化测试时&#xff0c;接口的请求方法有get,post等&#xff1b;get和post请求传参&#xff0c;和获取接口响应数据的方法&#xff1b; 请求接口为Post时&#xff0c;传参方法 我们在使用python中requests库做接口测试时&#xff0c;在做post接口测试…

Go语言-数组和切片有什么异同?

slice 的底层数据是数组&#xff0c;slice 是对数组的封装&#xff0c;它描述一个数组的片段。两者都可以通过下标来访问单个元素。 数组是定长的&#xff0c;长度定义好之后&#xff0c;不能再更改。在 Go 中&#xff0c;数组是不常见的&#xff0c;因为其长度是类型的一部分…

2023年第一届证券基金行业先进计算峰会在沪成功召开

2023年7月7日&#xff0c;在中国计算机学会集成电路设计专委会、中国通信学会金融科技发展促进中心、中国电子工业标准化技术协会新一代计算标准工作委员会和证券基金信息技术创新联盟WG1工作组的指导下&#xff0c;由中科驭数主办的2023年第一届证券基金行业先进计算峰会在上海…

以太网电子产品高低温循环测试

参考标准&#xff1a;《GB/T 2423.22-2012 环境试验 第2部分&#xff1a;试验方法 试验N&#xff1a;温度变化》&#xff1a;试验用来确定元器件、设备或其他产品耐受环境温度快速变化的能力。 1、测试影响因素 温度变化试验用来确定一次或连续多次的温度变化对试验样品的影响…

linux报错 /bin/bash^M:解释器错误:没有那个文件或目录

在Linux中运行脚本时&#xff0c;会出现linux报错 /bin/bash^M:解释器错误:没有那个文件或目录。这是因为我们将在Windows下编写的脚本拷贝到Linux环境中运行时会出现运行不了的情况。主要还是Windows的换行符为\r\n,而Linux环境中的换行符号为\n。 解决方法有&#xff1a;  …

Java安全——基于密码的加密

Java安全 基于密码的加密 基于密码加密和SSL加密的区别 密码加密可以数据和密码分离传输SSL只限于在套接字空间传输的数据进行加密 SSL和密码加密 密码加密是指通过算法将原始信息转换成密文&#xff0c;只有知道相应密钥的人才能解密。Java中常用的密码加密算法包括MD5、SHA、…

Buffer Overflow缓冲区溢出和保护措施

缓冲区溢出是指当数据写入某个缓冲区&#xff08;buffer&#xff09;时&#xff0c;超出了为该缓冲区分配的内存空间&#xff0c;从而导致覆盖了相邻内存区域的情况。这种现象可能导致程序崩溃、数据损坏&#xff0c;甚至引发安全漏洞&#xff0c;允许攻击者利用这一漏洞执行恶…

Python程序开发——第十一章 图形用户页面编程

目录 一、图形用户界面与tkinter二、tkinter的根窗口&#xff08;一&#xff09;根窗口的创建&#xff08;二&#xff09;根窗口的基本方法 三、几何布局管理器&#xff08;一&#xff09;pack布局&#xff08;二&#xff09;grid布局&#xff08;三&#xff09;place布局 四、…

【Android】将手机屏幕投屏到电脑上控制的解决方案

有没有听说scrcpy呢&#xff0c;是投屏工具&#xff0c;通过它就可以实现把手机屏幕投屏到电脑上了&#xff0c;有此帮助&#xff0c;离实现目标更近了一步。 首先&#xff0c;去开源站点GitHub那里下载获取scrcpy 压缩包&#xff0c;根据自己的电脑系统选择下载即可&#xff…

NginxTomcat架构的动静分离和负载均衡

目录 一、Tomcat的多实例部署 1.创建 kgc 和 benet 项目目录和文件 2.修改 Tomcat 主配置文件 3.客户端浏览器访问验证 二、NginxTomcat负载均衡架构原理 2.1 Nginx负载均衡的主要配置 2.2 NginxTomcat负载均衡的优点 三、NginxTomcat负载均衡实验 1.部署Nginx 负载…

SNP受邀参加“赛意力量·全国行”相聚合肥,RISE with SAP

伴随着全球数字化程度的不断加深&#xff0c;IT和OT逐步走向原生融合&#xff0c;以价值链重构倒逼产业转型的结构升级趋势已日益明显。在旺盛的市场需求与机遇下&#xff0c;企业的IT投入涌现出爆发式增长态势&#xff0c;对于IT系统“高效支撑以保障业务先赢”的能力要求已不…

Linux——权限

1.Linux权限的概念 Linux权限是指用于限制对文件和目录的访问的安全机制。文件和目录的权限由三个部分组成&#xff1a;所有者权限、同组用户权限和其他用户权限。每个部分又包括读、写、执行三种权限。这些权限决定了用户能否对文件或目录进行读、写、执行等操作。 2.Linux…

MinGW编译OpenCV 过程记录

1.下载源码opencv-3.4.10.zip &#xff0c;可以在OpenCV官网下载Releases - OpenCV 解压缩如下: 2.下载Mingw64工具&#xff0c;需要支持posix 并设置系统环境目录&#xff0c;下载的文件名x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0.7z (可以在网上找) 3.使用Cmake工具构建…

Linux学习之分区和挂载磁盘配额

先分区然后格式化。 fdisk /dev/sdb开始分区。 输入p&#xff0c;然后按下Enter&#xff0c;可以查看当前设备的分区情况。 输入d&#xff0c;然后按下Enter&#xff0c;就可以删除上边的分区&#xff0c;要是有多个分区&#xff0c;会让你选择删除哪个分区。 输入n&…

MySQL注入-SQLi-Less3笔记

起手?id1给个参数看看反应 产生报错&#xff0c;关注后面的内容 //从报错信息中的1)就可以推断出SQL语句应该是WHERE XX(id)//那就需要考虑如何将 单引号和括号&#xff0c;提前关闭并且执行我们想要的语句就可以了 知道了语句&#xff0c;直接拼接 ?id1) and 12 union sel…

1。解释型语言和编译型语言

1、解释&#xff1a; 在计算机编程中&#xff0c;编译型语言和解释型语言是两种不同的语言类型。它们的主要区别在于代码的执行方式。编译型语言&#xff08;Compiled Language&#xff09;是指在程序运行之前需要经过编译器编译成可执行文件的语言。编译器会将编写好的代码转换…

基于matlab对于未校准立体图像校正(附源码)

一、前言 此示例说明如何计算两个未校准图像的校正&#xff0c;其中相机内禀函数未知。 立体图像校正将图像投影到公共图像平面上&#xff0c;以使相应的点具有相同的行坐标。此过程对于立体视觉很有用&#xff0c;因为 2-D 立体对应问题被简化为 1-D 问题。例如&#xff0c;…

java中跳出最外层的循环

public static void forTest() {int a 3;tab: for (int i 0; i < a; i) {System.out.println("我是i...." i);for (int j 0; j < a; j) {System.out.println("我是j...." j);if (j 1) {break tab;}}}}

linux用户权限相关内容查看

1 用户信息 创建用户一个名为 webuser 的账号&#xff0c;并填写相应的信息&#xff1a; rootiZ94fabhqhuZ:~# adduser webuser Adding user webuser ... Adding new group webuser (1000) ... Adding new user webuser (1000) with group webuser ... Creating home direc…

#systemverilog#进程控制问题#(三)进程监视

关于内建类:process SystemVerilog中内建了一种class,可以对进程进行访问和控制,此种class就是process,我们先来看下process类的原型: 图8 process类中定义了一个枚举变量state,表示当前进程的几种执行状态:FINISHED,RUNNING,WAITING,SUSPENDED,KILLED。 另外,还…