深入解析 vue 3 获取响应式数据

news2025/3/1 16:19:28

Vue 3 引入了一个全新的响应式系统,其中最核心的就是 reactive 和 ref。它们是实现响应式数据的基础,用于创建可以自动跟踪变化并更新视图的对象和变量。

1. reactive:响应式对象

1、概念

reactive 是用于创建响应式对象的 API。它接收一个普通对象并返回一个代理对象。

这个代理对象是深度响应的,也就是说,该对象及其所有嵌套对象都会成为响应式的。并且可以感知到对它的所有操作(如属性的读写、删除等),并在数据变化时自动触发视图更新。 

2、用法

import { reactive } from 'vue'
const reactiveObj = reactive({
  count: 1,
  flower: {
    name: 'rose'
  }
})
window.reactiveObj = reactiveObj;

可以在控制台输出 reactiveObj 查看,也可以修改它的数据。 

3、特性

1)深度响应式:reactive 会递归地将对象及其所有嵌套对象转化为响应式对象。

2)Proxy 机制:reactive 基于 Proxy 实现,比 Vue 2 中的 Object.defineProperty 更加灵活和高效。

3)自动依赖追踪:当响应式对象的属性在模板或计算属性中被引用时,Vue 会自动追踪这些依赖,并在数据变化时更新相关的视图。

4、注意⚠️

浅拷贝问题:reactive 创建的对象是一个代理对象,如果直接替换该对象(如 reactiveObj = {}),将无法保持响应式效果。因此,建议修改对象的属性,而不是替换整个对象来保持响应式。

<template>
  <div>
    <p>reactiveObj.count: {{ reactiveObj.count }}</p>
  </div>
</template>

<script setup>
import { reactive } from 'vue';
const reactiveObj = reactive({
  count: 1
})
window.reactiveObj = reactiveObj;
</script>

2. ref:响应式引用 

1、概念

ref 是另一种创建响应式数据的方法,特别适用于基本类型的值(如字符串、数字、布尔值等),或需要独立的响应式引用

ref 会返回一个包含 .value 属性的对象,这个属性持有实际值,并且是响应式的。

2、用法

import { ref, reactive } from "vue";
// value 是普通类型数据时
const numberRef = ref(0);
window.numberRef = numberRef;
const stringRef = ref("hello");
window.stringRef = stringRef;

// value 是一个对象时
const objectRef = ref({ a: 1, b: 2 });
window.objectRef = objectRef;

// value 是一个代理对象
const reactiveObj = reactive({ a: 11, b: 22 });
const reactiveRef = ref(reactiveObj);
window.reactiveObj = reactiveObj;
window.reactiveRef = reactiveRef;

3、特性

1)单值响应式:ref 非常适合处理基本数据类型的响应式数据,或者是希望一个对象保持独立响应时。

2)模板自动解包:在模板中使用 ref 时,Vue 会自动解包 .value,不需要显式使用 .value。

<template>
  <div>{{ numberRef }}</div> <!-- Vue 自动解包为 numberRef.value -->
</template>

3)组合式 API 的灵活性:ref 在组合式 API 中非常灵活,适合管理组件内部的状态和独立的响应式变量。 

4、总结

1)传入一个普通数据时,返回一个对象,对象属性 value 是响应式数据。

2)传入一个对象时,会调用一下 reactive,将该对象变成一个代理 proxy,目的是为了让对象里面的所有属性全部变成响应式数据。

3)传入一个代理对象时,返回代理对象本身。

3. readonly:只读响应式对象

1、概念

readonly 是 Vue 3 提供的用于创建只读响应式对象的 API。它接收一个响应式对象或普通对象,并返回一个只读代理对象

这个对象的所有属性都变为只读,任何尝试修改它的操作都会在开发环境下触发警告。

2、用法

readonly 通常用于保护一些不应被直接修改的数据,例如共享状态或常量数据。

import { reactive, readonly } from "vue";
const reactiveObj = reactive({ a: 1, b: 2 });
const readonlyObj1 = readonly({ a: 11, b: 22 });
const readonlyObj2 = readonly(reactiveObj);

window.reactiveObj = reactiveObj;
window.readonlyObj1 = readonlyObj1;
window.readonlyObj2 = readonlyObj2;

4. computed:计算属性 

1、概念 

computed 是 Vue 3 提供的用于创建计算属性的 API。计算属性基于响应式数据或其他计算属性,它们的值是通过一个函数计算出来的,并且只有当其依赖的响应式数据发生变化时,计算属性才会重新计算。这使得计算属性在性能代码简洁性上具有很大优势。

2、用法
computed 接收一个函数,这个函数返回的值会被 Vue 缓存,直到依赖的响应式数据发生变化时,才会重新计算。

import { computed, reactive } from "vue";
const reactiveObj = reactive({ a: 1, b: 2 });
const sumRef = computed(() => {
  console.log("computed函数执行");
  return reactiveObj.a + reactiveObj.b;
});
console.log(sumRef);
console.log(sumRef.value);
console.log(sumRef.value);
console.log(sumRef.value);
reactiveObj.a = 3;
reactiveObj.b = 4;
console.log(sumRef.value);
console.log(sumRef.value);

3、特性

1)缓存机制:computed 的值是惰性计算的,并且会被缓存,直到依赖项变化。这与方法不同,方法在每次调用时都会执行,而计算属性只有在依赖变化时才会重新计算。

2)只读默认性:计算属性默认是只读的,但也可以通过传递一个带有 get 和 set 的对象,使其成为可写的计算属性。

import { ref, computed } from 'vue'
const count = ref(1);
const double = computed({
  get: () => count.value * 2,
  set: (value) => {
    count.value = value / 2
  }
})
double.value = 10;
console.log(count.value) // 5
count.value = 20;
console.log(double.value); // 40

4、注意⚠️

1)避免副作用:computed 应该始终是纯函数,不应包含会产生副作用的代码(例如,网络请求、DOM 操作等),这部分逻辑应放在 watch 或方法中处理。
2)适度使用:虽然计算属性很强大,但在一些场景下,使用方法或 watch 可能会更加合适。

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

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

相关文章

HighConcurrencyCommFramework c++通讯服务器框架 :Epoll:事件驱动技术

在单独的进程或者线程中运行&#xff0c;收集处理事件&#xff0c;没有上下文切换的消耗&#xff0c;高校&#xff1b; 写小demo很简单&#xff0c;正经让epoll技术融合到商业环境中&#xff0c;那么难度很大&#xff1b; 达到的效果&#xff1a; 1.理解工作原理&#xff1b…

Splay学习笔记

Splay的两个关键函数&#xff0c;rotate和splay rotate就是正常的旋转。 splay(x,target)表示把x旋转为target的子节点 这里需要分讨&#xff0c;对于x的父亲y和祖父z 若 z target&#xff0c; 则直接转x若 x 与 y 方向相同&#xff0c;先转y&#xff0c;后转x若 x 与 y 方…

html+css网页制作 电商华为商城首页 ui还原度100%

htmlcss网页制作 电商华为商城首页 ui还原度100% 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码…

Docker日志管理

一、知识点介绍 1.ELK(Elasticserach、Logstash、Kibana) 前面笔记有 2.什么是 Filebeat Filebeat 是 ELK 组件的新成员&#xff0c; 也是 Beat 成员之一。基于 Go 语言开发&#xff0c;无任何依赖并且比 Logstash 更加轻量&#xff0c;不会带来过高的资源占用&#xff0c; …

django常用的组合搜索组件

文章目录 django常用的组合搜索组件快速使用配置信息1. 视图函数2. 前端模板3. css样式 代码实现 django常用的组合搜索组件 在项目开发中&#xff0c;如果有大量数据就要用到组合搜索&#xff0c;通过组合搜索对大块内容进行分类筛选。 快速使用 三步走&#xff1a;&#xf…

刷题记录第110天-分割等和数组

解题思路&#xff1a; 问题可转化为&#xff0c;用给定数组能否装满一个容量为数组总和一半的背包(targetsum/2)&#xff0c;即一个0-1背包问题。 0-1背包问题的关键在于数组的定义和状态转移方程以及价值的定义。dp[i][j]表示在[0…i]个物品内&#xff0c;背包容量为j能装的最…

再升级!MoneyPrinterPlus集成GPT_SoVITS

最近有很多优秀的语音合成TTS工具&#xff0c;目前MoneyPrinterPlus已经集成了ChatTTS和fasterWhisper。应朋友们的要求&#xff0c;最近MoneyPrinterPlus也集成了GPT_SoVITS这个优秀的语音合成工具。 今天给大家详细讲解一下&#xff0c;如何在MoneyPrinterPlus中使用GPT_SoV…

机器学习速成第三集——无监督学习之降维(理论部分)!

目录 主成分分析&#xff08;PCA&#xff09; 独立成分分析&#xff08;ICA&#xff09; t分布随机邻近嵌入&#xff08;t-SNE&#xff09; 线性判别分析&#xff08;LDA&#xff09; 其他降维方法 应用场景 主成分分析&#xff08;PCA&#xff09;在处理大规模数据集时…

新能源汽车电机低频电磁场仿真应用

一、背景介绍 随着新能源汽车的普及&#xff0c;电机作为新能源汽车驱动系统的核心组成部分&#xff0c;其重要性不言而喻。电机使电能转化为机械能&#xff0c;通过传动系统将机械能传递到车轮&#xff0c;驱动汽车行驶。新能源汽车电机的发展经历了从初步探索到技术成熟的多…

Localization Translate API 的对接和使用

Localization Translate API 的对接和使用 Localization Translate API 的主要功能是通过输入需要翻译的文本来获取翻译后的文本&#xff0c;同时翻译后的语言可以自定义&#xff0c;并且翻译结果可以采用 json &#xff0c; markdown 俩种主流的方法来输出。 本文档将详细介…

【安卓】多线程编程

文章目录 线程的简单应用解析异步消息处理机制使用AsyncTask 线程的简单应用 新建一个AndroidThreadTest项目&#xff0c;然后修改activity_main.xml中的代码。 <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width…

CNN-GRU神经网络多输入单输出回归预测【MATLAB】

1. CNN&#xff08;卷积神经网络&#xff09;部分 作用&#xff1a; 特征提取&#xff1a;CNN擅长从输入数据中提取空间特征。在多输入情况下&#xff0c;它可以处理来自不同源的数据&#xff0c;提取有用的特征。 局部感受野&#xff1a;通过卷积操作&#xff0c;CNN能够识别…

【ACM出版,往届会后三个半月EI见刊/检索】第四届物联网与机器学习国际学术会议(IoTML 2024,8月23-25)

2024年第四届物联网与机器学习国际学术会议&#xff08;IoTML 2024&#xff09;将于2024年8月23-25日在中国南昌召开。 会议将围绕着物联网和机器学习开展&#xff0c;探讨本领域发展所面临的关键性挑战问题和研究方向&#xff0c;以期推动该领域理论、技术在高校和企业的发展和…

vector嵌套之空指针异常

文章目录 1. 题目链接2. 题目代码正确代码错误代码 1. 题目链接 118. 杨辉三角 2. 题目代码 正确代码 class Solution { public:vector<vector<int>> generate(int numRows) {vector<vector<int>> result(numRows);for(int i 0; i < numRows; i)…

STL中的栈(stack)和队列(queue)以及简单(复用)实现

适配器&#xff1a; 虽然 stack 和 queue 中也可以存放元素&#xff0c;但在 STL 中并没有将其划分在容器的行列&#xff0c;而是将其称为 容器适配器 &#xff0c;这是因为 stack 和队列只是对其他容器的接口进行了包装&#xff0c; STL 中 stack 和 queue 默认使用deque 换种…

【云备份】学习Json

文章目录 1.Json数据类型基础数据类型复合数据类型JSON数据类型的应用 2.学习jsoncpp库利用json实现序列化利用json实现反序列化 1.Json数据类型 json 是一种数据交换格式&#xff0c;采用完全独立于编程语言的文本格式来存储和表示数据。json数据交换格式是将多种数据对象组织…

CVE-2024-38077 Windows远程桌面授权服务漏洞介绍

CVE-2024-38077 是一个在Windows远程桌面授权服务&#xff08;Remote Desktop Licensing Service&#xff09;中存在的严重远程代码执行漏洞。以下是关于此漏洞的详细信息&#xff1a; 漏洞概述 漏洞编号&#xff1a;CVE-2024-38077漏洞类型&#xff1a;远程代码执行 (RCE)影…

基于单片机控制的多功能智能语音风扇

【摘要】 本文简述了一种基于单片机控制的智能多功能语音风扇的设计&#xff0c;该设计以STC11L08XE单片机为主控制器&#xff0c;通过YS-LDV7语音模块对语音信号进行采集识别&#xff0c;并将该信号上传给单片机进而控制风扇的转速和开关&#xff0c;以达到语音控制的效果。该…

Python 安装 PyTorch详细教程

本章教程,介绍如何安装PyTorch,介绍两种安装方式,一种是通过pip直接安装,一种是通过conda方式安装。 一、查看CUDA版本 二、安装PyTorch 1、pip安装方式 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu1162、conda安装方式 …

Leetcode—3151. 特殊数组 I【简单】

2024每日刷题&#xff08;155&#xff09; Leetcode—3151. 特殊数组 I 实现代码 class Solution { public:bool isArraySpecial(vector<int>& nums) {int n nums.size();for(int i 1; i < n; i) {if(nums[i - 1] % 2 nums[i] % 2) {return false;}}return t…