当前位置: 首页 > news >正文

Vue 3 响应式对象:ref 和 reactive 的使用和区别

🎉🎉欢迎来到我的CSDN主页!🎉🎉
🏅我是尘缘,一个在CSDN分享笔记的博主。📚📚
👉点击这里,就可以查看我的主页啦!👇👇
尘缘的个人主页
🎁如果感觉还不错的话请给我点赞吧!🎁🎁
💖期待你的加入,一起学习,一起进步!💖💖

在这里插入图片描述

目录

  • 引言
  • 一、介绍
    • 1.1 Vue 3 简介
    • 1.2 响应式对象的重要性
    • 1.3 ref 和 reactive 的概述
  • 二、使用 ref
    • 2.1 ref 的创建方法
    • 2.2 ref 的使用方法
    • 2.3 ref 的适用场景
    • 2.4 ref 的局限性
  • 三、使用 reactive
    • 3.1 reactive 的创建方法
    • 3.2 reactive 的使用方法
    • 3.3 reactive 的适用场景
    • 3.4 reactive 的局限性
  • 四、对比 ref 和 reactive
    • 4.1 响应性方面的对比
    • 4.2 性能方面的对比
    • 4.3 使用场景的对比
    • 4.4 API 使用的对比
  • 五、总结

引言

Vue.js 是一个流行的 JavaScript 框架,它使得开发人员能够轻松地创建用户界面。在 Vue.js 中,响应式对象是非常重要的一部分,它们可以自动更新依赖它们的组件。在 Vue 3 中,有两种创建响应式对象的方法:使用 ref 和使用 reactive。这两种方法有一些区别,本文将详细介绍它们的区别以及使用方法。

一、介绍

1.1 Vue 3 简介

Vue 3 是 Vue.js 的最新版本,它带来了许多新的特性和改进,包括更好的性能、更简单的 API、更好的 TypeScript 支持等等。Vue 3 继续沿用了 Vue 2.x 的开发理念和模式,同时增加了一些新的概念和工具,使得开发者能够更高效地开发前端应用。

1.2 响应式对象的重要性

在 Vue.js 中,响应式对象是非常重要的一部分。当一个对象的属性被改变时,如果这个对象被用在 Vue 组件的模板中,那么这个组件会自动更新以反映新的属性值。这个特性使得开发者能够以声明式的方式构建用户界面,而不需要写很多的更新逻辑。

1.3 ref 和 reactive 的概述

在 Vue 3 中,有两种主要的方法来创建响应式对象:使用 ref 和使用 reactive。

ref 是 Vue 3 中用于创建响应式引用的函数。它返回一个包装过的对象,这个对象的值是可以改变的,但它的引用是不会改变的。这意味着你可以在模板中使用 ref,并且当它的值改变时,模板会自动更新。

reactive 是 Vue 3 中用于创建响应式对象的函数。它返回一个响应式对象,这个对象的属性和方法都可以改变。这意味着你可以在模板中使用 reactive,并且当它的属性或方法改变时,模板会自动更新。

二、使用 ref

2.1 ref 的创建方法

在 Vue 3 中,你可以使用 ref 函数来创建一个响应式引用。ref 函数可以接受一个初始值,并返回一个响应式对象。例如:

import { ref } from 'vue';  const count = ref(0);

在这个例子中,我们创建了一个名为 count 的响应式引用,它的初始值为 0。

2.2 ref 的使用方法

使用 ref 的一个关键点是,你不能直接修改它的值。要修改 ref 的值,你需要使用 .value 属性。例如:

count.value++; // 修改 count 的值

你还可以通过 .get 方法来获取 ref 的当前值。例如:

console.log(count.get()); // 输出 0

2.3 ref 的适用场景

ref 最适合用于那些值需要改变,但引用不会改变的场景。例如,如果你有一个对象,而这个对象的某个属性是响应式的,那么你可以使用 ref 来创建这个属性。

2.4 ref 的局限性

ref 的一个局限性是,它只能用于原始数据类型(如字符串、数字、布尔值等),不能用于对象或数组。这意味着如果你需要创建一个包含多个属性的响应式对象,你需要使用 reactive 函数而不是 ref

三、使用 reactive

3.1 reactive 的创建方法

在 Vue 3 中,你可以使用 reactive 函数来创建一个响应式对象。reactive 函数可以接受一个初始对象作为参数,并返回一个响应式对象。例如:

import { reactive } from 'vue';  const state = reactive({  count: 0,  name: 'John',  
});

在这个例子中,我们创建了一个名为 state 的响应式对象,它包含两个属性 countname

3.2 reactive 的使用方法

使用 reactive 的一个关键点是,你可以直接修改它的属性。例如:

state.count++; // 修改 state 的 count 属性  
state.name = 'Jane'; // 修改 state 的 name 属性

你还可以通过 reactive 函数创建一个响应式的方法或计算属性。例如:

const doubleCount = reactive({  get() {  return this.count * 2;  },  
});

在这个例子中,我们创建了一个名为 doubleCount 的响应式方法,它返回 count 的两倍。当你访问 doubleCount 时,它会动态地计算它的值。

3.3 reactive 的适用场景

reactive 函数最适合用于创建包含多个属性的响应式对象。由于 reactive 返回的是一个响应式对象,因此你可以直接修改它的属性,而不需要使用 .value 属性。

reactive 还可以用于创建包含方法或计算属性的响应式对象。你可以在响应式对象中定义方法或计算属性,并在模板中直接调用它们。这种方法在处理复杂的数据逻辑时非常有用。

reactive 也适用于那些需要同时跟踪多个状态的情况。通过使用 reactive,你可以将多个状态组织在一个响应式对象中,并在模板中方便地访问它们。

3.4 reactive 的局限性

虽然 reactive 提供了更广泛的响应式对象功能,但它确实有一些局限性。首先,与 ref 相比,reactive 的性能开销可能更大。因为 reactive 需要跟踪对象中的所有属性变化,而 ref 只需要跟踪一个原始值的变化。在性能敏感的应用程序中,使用 ref 可能是一个更好的选择。

其次,reactive 不支持 .set 方法。这意味着如果你想设置一个响应式对象的属性值,你只能直接赋值。这可能会引发一些不便。另外,如果你需要在响应式对象上添加一些额外的逻辑(例如 getter 或 setter),你可能需要使用 computed 或其他方法来实现,而不是直接在 reactive 中定义。

四、对比 ref 和 reactive

4.1 响应性方面的对比

refreactive 都可以创建响应式对象,但是在响应性方面,它们有一些区别。

使用 ref 创建的响应式引用只会响应原始值的改变。如果你将一个对象或者数组作为 ref 的初始值,那么当这个对象或数组中的某个元素发生改变时,ref 不会响应。只有当整个对象或数组被替换为新的对象或数组时,ref 才会响应。

相比之下,reactive 可以创建包含多个属性的响应式对象。当这些属性发生改变时,reactive 会立即响应并更新相关的组件。此外,reactive 还可以创建响应式的方法和计算属性,这是 ref 不支持的。

ref 更适合用于单个值的响应式引用,而 reactive 更适合用于包含多个属性或方法的响应式对象。

4.2 性能方面的对比

由于 ref 只关注单个原始值的改变,因此它的性能开销相对较小。相比之下,reactive 需要跟踪对象中的所有属性变化,因此它的性能开销可能更大。特别是在处理大量数据或复杂逻辑时,reactive 的性能开销可能会更加明显。

然而,需要注意的是,这种性能差异在很多情况下可能并不显著。对于大多数应用程序来说,refreactive 的性能差异不会对应用程序的整体性能产生太大影响。只有在处理非常大量的数据或进行高频率的更新时,这种性能差异才会变得明显。

因此,在选择使用 refreactive 时,需要根据具体的应用场景和需求进行权衡。如果需要处理大量数据或复杂逻辑,并且需要立即响应用户的输入或状态的改变,那么使用 reactive 可能更合适。如果只需要处理单个值的改变,并且对性能要求较高,那么使用 ref 可能更合适。

4.3 使用场景的对比

ref 更适合用于简单的数据引用,例如单个的数字、字符串或布尔值。当你需要响应这些简单数据的改变时,可以使用 ref。例如,如果你有一个表单,其中包含一些输入字段,你可以使用 ref 来存储和响应每个输入字段的值。

相比之下,reactive 更适合用于复杂的数据结构,例如对象或数组。当你需要同时处理多个属性的改变时,或者当你需要创建包含方法或计算属性的响应式对象时,可以使用 reactive。例如,如果你有一个购物车,其中包含多个商品,每个商品都有自己的数量和价格,你可以使用 reactive 来存储和响应整个购物车。

ref 更适合用于简单的数据引用,而 reactive 更适合用于复杂的数据结构。

4.4 API 使用的对比

ref 的 API 相对简单,只需要调用一次函数即可创建响应式引用。例如:

const count = ref(0);

reactive 需要调用两次函数,先创建一个普通的对象,然后再使用 reactive 包装它。例如:

const state = reactive({ count: 0 });

这意味着 reactive 的 API 使用可能更加繁琐一些。此外,reactive 还提供了更多的功能和选项,例如可以创建响应式的方法和计算属性。但是这也会增加学习的难度和复杂性。

ref 的 API 使用更加简单直接,而 reactive 的功能更加强大但学习难度也相对较大。选择使用哪个功能取决于具体的应用场景和个人需求。

五、总结

Vue 3 的 ref 和 reactive 是创建响应式对象的两种方法。ref 创建响应式引用,只能应用于单个原始值的情况。reactive 创建响应式对象,适用于包含多个属性或方法的复杂数据结构。ref 的 API 简单直接,而 reactive 提供了更多功能和选项。根据具体应用场景和个人需求选择使用哪种方法。

在这里插入图片描述

到这里我的分享就结束了,欢迎到评论区探讨交流!!
💖如果觉得有用的话还请点个赞吧 💖

相关文章:

Vue 3 响应式对象:ref 和 reactive 的使用和区别

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是尘缘,一个在CSDN分享笔记的博主。📚📚 👉点击这里,就可以查看我的主页啦!👇&#x…...

H5游戏源码分享-密室逃脱小游戏(考验反应能力)

H5游戏源码分享-密室逃脱小游戏&#xff08;考验反应能力&#xff09; 预判安全位置&#xff0c;这个需要快速的反应能力 源码 <!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /&…...

【LeetCode刷题-哈希】--706.设计哈希映射

706.设计哈希映射 class MyHashMap {private class Pair{private int key;private int value;public Pair(int key ,int value){this.key key;this.value value;}public int getKey(){return key;}public int getValue(){return value;}public void setValue(int value){this…...

前端 : 用HTML ,CSS ,JS 做一个点名器

1.HTML&#xff1a; <body><div id "content"><div id"top"><div id "name">XAiot2302班点名器</div></div><div id "center"><div id "word">你准备好了吗?</di…...

css:button实现el-radio效果

先看最终效果&#xff1a; ​​​ 思路&#xff1a; 一、 首先准备好按钮内容&#xff1a;const a [one,two,three] 将按钮循环展示出来&#xff0c;并设置一些样式&#xff0c;将按钮背景透明&#xff1a; <button v-for"(item,index) in a" :key"in…...

算法工程师-机器学习-数据科学家面试准备4-ML系统设计

https://github.com/LongxingTan/Machine-learning-interview 算法工程师-机器学习-数据科学家面试准备1- 概述 外企和国外公司、春招、秋招算法工程师-机器学习-数据科学家面试准备2- Leetcode 300算法工程师-机器学习-数据科学家面试准备3-系统设计算法工程师-机器学习-数据…...

git重装后如何连接以前项目

git重装后如何连接以前项目 1、配置秘钥 点击 Git Bash Here&#xff0c;进入命令操作窗口 生成本地git仓库秘钥&#xff1a; 1、填写自己邮箱 2、一直回车 ssh-keygen -t rsa -C “xxxxxqq.com”3、使用cat查看生成的秘钥&#xff0c;粘贴并设置到gitee上 cat ~/.ssh/id_r…...

【java学习—十】TreeSet集合(5)

文章目录 1. TreeSet1.1. 自然排序1.2. 定制排序 1. TreeSet TreeSet 是 SortedSet 接口的实现类&#xff0c; TreeSet 可以确保集合元素处于排序状态。     TreeSet 支持两种排序方法&#xff1a;自然排序和定制排序。默认情况下&#xff0c; TreeSet 采用自然排序。 1.1.…...

JMeter的使用,傻瓜式学习【上】

目录 前言 1、JMeter元件及基本使用作用域&#xff08;简述&#xff09; 1.1、基本元件 1.2、作用域的原则 1.3、元件执行顺序 3、JMeter三个重要组件 3.1、线程组 案例&#xff1a; 3.2、HTTP请求 3.3、查看结果树 响应体中&#xff0c;中文乱码解决方案&#xff1…...

主定理(一般式)

主定理&#xff08;Master Theorem&#xff09;是用于分析递归算法时间复杂度的一个重要工具。它适用于形式化定义的一类递归关系&#xff0c;通常采用分治策略解决问题的情况。 目录 主定理简化版的局限主定理一般形式情况1&#xff1a; n l o g b a n^{log_{b}{a}} nlogb​a …...

WLAN的组网架构和工作原理

目录 WLAN的组网架构 FAT AP架构 AC FIT AP架构 敏捷分布式AP 下一代园区网络&#xff1a;智简园区&#xff08;大中型园区网络&#xff09; WLAN工作原理 WLAN工作流程 1.AP上线 &#xff08;1&#xff09;AP获取IP地址&#xff1b; &#xff08;2&#xff09;AP发…...

使用OBS Browser+访问华为云OBS存储【Windows】

背景 项目中使用华为云 S3 存储,java 代码中通过华为云 OBS 提供的esdk-obs-java 来访问文件。 但是,通过 JAVA SDK 方式不太方便运维,所以我们需要一款可视化的客户端软件。 华为云 OBS 自身也提供了一款客户端软件,名为 OBS Browser+。 OBS Browser+简介 OBS Browse…...

C++总结(3):类的动态内存分配、异常、类型转换运算符

文章目录 1 类的动态内存分配1.1 C动态内存分配1.2 拷贝构造函数1.3 赋值运算符(operator)重载 2 异常3 类型转换运算符 1 类的动态内存分配 1.1 C动态内存分配 在C/C中都可以使用malloc/free来分配内存&#xff0c;但C还有一种更好的方法&#xff1a;new和delete。下面以动态…...

折半搜索(meet in the middle)

介绍 折半搜索&#xff0c;又称 meet in the middle \text{meet in the middle} meet in the middle&#xff0c;指将整个搜索过程分为两部分&#xff0c;并对两部分分别进行搜索&#xff0c;最后得到两个答案序列&#xff0c;将这两个答案序列进行合并&#xff0c;即可得到最…...

【机器学习】loss损失讨论

大纲 验证集loss上升&#xff0c;准确率也上升&#xff08;即将overfitting&#xff1f;&#xff09;训练集loss一定为要为0吗 Q1. 验证集loss上升&#xff0c;准确率也上升 随着置信度的增加&#xff0c;一小部分点的预测结果是错误的&#xff08;log lik 给出了指数级的惩…...

LeetCode 779. 第K个语法符号【递归,找规律,位运算】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...

java try throw exception finally 遇上 return break continue造成异常丢失

如下所示&#xff0c;是一个java笔试题&#xff0c;考察的是抛出异常之后&#xff0c;程序运行结果&#xff0c;但是这里抛出异常&#xff0c;并没有捕获异常&#xff0c;而是通过finally来进行了流程控制处理。 package com.xxx.test;public class ExceptionFlow {public sta…...

设计模式——装饰器模式(Decorator Pattern)+ Spring相关源码

文章目录 一、装饰器模式的定义二、个人理解举个抽象的例&#xff08;可能并不是很贴切&#xff09; 三、例子1、菜鸟教程例子1.1、定义对象1.2、定义装饰器 3、JDK源码 ——包装类4、JDK源码 —— IO、OutputStreamWriter5、Spring源码 —— BeanWrapperImpl5、SpringMVC源码 …...

MATLAB R2018b详细安装教程(附资源)

云盘链接&#xff1a; pan.baidu.com/s/1SsfNtlG96umfXdhaEOPT1g 提取码&#xff1a;1024 大小&#xff1a;11.77GB 安装环境&#xff1a;Win10/Win8/Win7 安装步骤&#xff1a; 1.鼠标右击【R2018b(64bit)】压缩包选择【解压到 R2018b(64bit)】 2.打开解压后的文件夹中的…...

GEE错误——影像加载过程中出现的图层无法展示的解决方案

问题&#xff1a; // I dont know if some standard value exists for the radius, in the same, I will assume that some software would prefer to use square shape, but circle makes more sense to me. // pixels is noice if you want to zoom in and out to visualize…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...

Linux 下 DMA 内存映射浅析

序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存&#xff0c;但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程&#xff0c;可以参考这篇文章&#xff0c;我觉得写的非常…...