【Vue3】详解Vue3的ref与reactive:两者的区别与使用场景

文章目录

    • 引言
    • Moss前沿AI
    • Vue 3响应式系统概述
    • `ref`与`reactive`的基础概念
    • `ref`与`reactive`的区别
      • 1. 数据类型
      • 2. 访问方式
      • 3. 响应式追踪机制
      • 4. 可变性
      • 5. 使用场景
      • 表格对比
    • `ref`与`reactive`的使用场景
      • 1. 选择`ref`的场景
      • 2. 选择`reactive`的场景
    • 性能分析与优化建议
      • 1. 响应式系统的性能优势
      • 2. `ref`的性能特点
      • 3. `reactive`的性能特点
      • 4. 优化建议
    • 实际案例分析
      • 案例一:计数器应用
      • 案例二:用户信息管理
      • 性能测试

引言

Vue 3引入了Composition API,其中refreactive是实现响应式数据管理的两大基础。对于熟悉Vue 2的开发者来说,理解这两个API的异同及其最佳应用场景,是顺利过渡到Vue 3的关键。本文将通过详细的讲解与对比,帮助开发者全面掌握refreactive的使用技巧,提升项目开发效率和代码质量。

Moss前沿AI

🔥【OpenAI】(一)获取OpenAI API Key的多种方式全攻略:从入门到精通,再到详解教程!!

🔥【VScode】(二)VSCode中的智能AI-GPT编程利器,全面揭秘ChatMoss & ChatGPT中文版

🔥【GPT-o1】(三)支持Open API调用、自定义助手、文件上传等强大功能,助您提升工作效率! >>> - CodeMoss & ChatGPT-AI中文版

在这里插入图片描述

Vue 3响应式系统概述

Vue 3的响应式系统采用了Proxy对象,相较于Vue 2的Object.defineProperty,具有更高的性能和更好的灵活性。响应式系统的核心在于将数据对象包装为Proxy,通过拦截数据的读取和设置操作,实现数据变更的追踪和视图的自动更新。

响应式API的核心组件

  • reactive:用于创建一个响应式的对象,适合用于复杂的对象和嵌套数据结构。
  • ref:用于创建一个响应式的基本数据类型,或者在需要时包裹复杂对象。
  • computed:用于创建基于响应式数据的计算属性。
  • watch:用于监听响应式数据的变化,执行副作用操作。

理解这些基本组件的工作原理,是深入掌握Vue 3响应式系统的基础。


refreactive的基础概念

ref

ref用于创建一个响应式的基本数据类型包装对象。当传入一个基本类型(如numberstringboolean等)时,ref会返回一个包含该值的对象,并通过.value属性进行访问和修改。

示例

import { ref } from 'vue';const count = ref(0);function increment() {count.value++;
}

在上述例子中,count是一个响应式引用,访问和修改需要通过.value属性。


reactive

reactive用于创建一个响应式的对象,适用于包含多个属性的复杂数据结构。它会深度代理对象的所有属性,确保内部属性的变化也能被追踪。

示例

import { reactive } from 'vue';const state = reactive({count: 0,message: 'Hello Vue 3'
});function increment() {state.count++;
}

在此例中,state是一个响应式对象,包含countmessage两个属性,直接通过对象属性访问和修改。

refreactive的区别

1. 数据类型

  • ref:适用于基本数据类型,也可用于包装复杂对象。
  • reactive:主要用于复杂的对象和嵌套的数据结构。

2. 访问方式

  • ref:需要通过.value属性访问和修改。
  • reactive:可以直接通过对象属性进行访问和修改,无需额外的.value

3. 响应式追踪机制

  • ref:每个ref包装对象都有一个独立的依赖收集。
  • reactive:整个对象作为一个整体进行依赖收集,内部属性的变化也能被追踪。

4. 可变性

  • ref:引用的值可以重新赋值。
  • reactive:对象本身是不可重新赋值的,只能修改其内部属性。

5. 使用场景

  • ref:适合单一数据项,或者需要在模板中解构时保留响应性。
  • reactive:适合复杂的状态管理,包括嵌套对象和数组。

表格对比

特性refreactive
数据类型基本数据类型及复杂对象复杂对象及嵌套数据结构
访问方式通过 .value直接通过属性访问
响应性追踪单个独立的引用整个对象及其内部属性
可变性引用值可重新赋值对象本身不可重新赋值,只能修改属性
使用场景单一数据项,模板中解构保留响应性复杂状态管理,包含嵌套对象和数组

refreactive的使用场景

了解refreactive的适用场景,有助于在项目中合理地选择和使用它们,提高代码的可读性和维护性。

1. 选择ref的场景

  • 简单数据管理:当需要管理单一的基本数据类型,如计数器、开关状态等,使用ref更为简洁。

    const isVisible = ref(false);function toggleVisibility() {isVisible.value = !isVisible.value;
    }
    
  • 模板中解构响应式对象:在组合式API中,如果将响应式对象解构到模板中,ref可以保持解构后的响应性。

    setup() {const count = ref(0);const increment = () => count.value++;return { count, increment };
    }
    
  • 引用DOM元素:在模板中引用DOM元素时,可以使用ref进行挂载。

    const myElement = ref(null);onMounted(() => {console.log(myElement.value);
    });
    

2. 选择reactive的场景

  • 复杂对象和嵌套数据:当需要管理包含多个属性和嵌套结构的对象时,reactive更加适合。

    const user = reactive({name: 'John',age: 30,address: {city: 'New York',zip: '10001'}
    });function updateCity(newCity) {user.address.city = newCity;
    }
    
  • 模块化状态管理:在大型应用中,可以使用reactive创建模块化的状态对象,便于维护和扩展。

    const store = reactive({user: { name: 'Jane', loggedIn: false },settings: { theme: 'dark', notifications: true }
    });function login() {store.user.loggedIn = true;
    }
    
  • 处理数组和对象的复杂操作reactive在处理数组和对象的增删改查操作时,表现更为自然和直观。

    const todos = reactive([{ id: 1, text: 'Learn Vue 3', completed: false },{ id: 2, text: 'Build a project', completed: false }
    ]);function addTodo(text) {todos.push({ id: Date.now(), text, completed: false });
    }
    

性能分析与优化建议

在选择refreactive时,性能是一个不可忽视的因素。尽管Vue 3的响应式系统在性能上有显著提升,但不同的使用场景下,refreactive仍可能表现出不同的性能特征。

1. 响应式系统的性能优势

Vue 3通过Proxy实现响应式,避免了Vue 2中Object.defineProperty的性能瓶颈,尤其在大规模数据和复杂对象的处理上表现出色。此外,Vue 3的编译器优化和虚拟DOM的改进,也为响应式系统带来了更高的性能。

2. ref的性能特点

  • 简洁性ref适用于单一数据项,减少了不必要的深度代理操作,可能在处理多数简单数据场景下更高效。
  • 内存开销:每个ref都是一个独立的对象,如果频繁创建和销毁大量的ref,可能会带来额外的内存开销。

3. reactive的性能特点

  • 深度代理reactive对对象进行深度代理,适用于复杂对象,但在处理极度嵌套的数据结构时,可能会带来一定的性能负担。
  • 优化潜力:对于大型应用中的模块化状态管理,reactive可以通过减少响应式系统的操作次数,提升整体性能。

4. 优化建议

  • 选择合适的API:在数据结构简单时,优先选择ref;在数据结构复杂时,优先选择reactive
  • 减少不必要的响应性:对于不需要响应式追踪的数据,可以使用shallowRefshallowReactive进行浅层响应性处理,减少性能开销。
  • 合理拆分状态:将应用状态拆分为多个小的响应式对象,避免单一大型响应式对象带来的性能问题。
  • 避免频繁创建ref:在需要管理大量相似数据项时,考虑使用reactive将数据集中管理,减少ref的使用。

实际案例分析

通过具体的项目案例,深入理解refreactive的应用与性能表现。

案例一:计数器应用

一个简单的计数器应用,展示ref的使用优势。

代码示例

<template><div><p>Count: {{ count }}</p><button @click="increment">Increment</button></div>
</template><script setup>
import { ref } from 'vue';const count = ref(0);function increment() {count.value++;
}
</script>

分析

  • 使用ref管理单一数据项count,代码简洁明了。
  • 访问和修改通过.value属性,符合Vue 3的响应式规范。

案例二:用户信息管理

一个包含用户详细信息和地址的应用,展示reactive的使用优势。

代码示例

<template><div><p>Name: {{ user.name }}</p><p>City: {{ user.address.city }}</p><button @click="updateCity">Update City</button></div>
</template><script setup>
import { reactive } from 'vue';const user = reactive({name: 'Alice',address: {city: 'San Francisco',zip: '94105'}
});function updateCity() {user.address.city = 'Los Angeles';
}
</script>

分析

  • 使用reactive管理复杂的用户信息对象,包括嵌套的address属性。
  • 直接通过对象属性访问和修改,代码更具可读性。

性能测试

在上述两个案例中,ref的计数器应用由于仅管理单一数据项,表现出较低的内存开销和高效的响应性能。而用户信息管理应用中,reactive的使用确保了复杂对象的高效响应,尽管在极端复杂的数据结构下可能会有微小的性能损耗,但在实际应用中完全可以忽略。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【笔记2-3】ESP32 bug:PSRAM chip not found or not supported 没有外部PSRAM问题解决

主要参考b站宸芯IOT老师的视频&#xff0c;记录自己的笔记&#xff0c;老师讲的主要是linux环境&#xff0c;但配置过程实在太多问题&#xff0c;就直接用windows环境了&#xff0c;老师也有讲一些windows的操作&#xff0c;只要代码会写&#xff0c;操作都还好&#xff0c;开发…

itextpdf读取pdf宽高问题

在使用itextpdf读取文档宽高的时候&#xff0c;大多数代码都是这样的&#xff1a; Rectangle page reader.getPageSize(pageNum); float width page.getWidth(); float height page.getHeight(); int rotation page.getRotation();这样读取的&#xff0c;对于标准pdf如A4等…

【nodejs】puppeteer在window下因参数scale导致重复截图问题解决

在线地址&#xff1a;https://textcard.shushiai.com/zh 最近构建流光卡片免费 markdown 文本转精美图片 api 的时候遇见了一个问题 &#x1f447;&#xff08;API 尚未公开&#xff0c;还在小部分内测&#xff0c;测试&#xff0c;尝试修复 bug 中&#xff09; 我发现在我 w…

3、.Net UI库:MaterialSkin - 开源项目研究文章

MaterialSkin 是一个开源的 WinForms 第三方库&#xff0c;提供了许多仿谷歌设计风格的组件&#xff0c;使得 WinForms 窗体程序更加美观。以下是 MaterialSkin 的一些关键特点和使用方法&#xff1a; 主要特点&#xff1a; 仿谷歌设计风格&#xff1a;MaterialSkin 提供了大量…

VMware安装windows2003

一、安装vm 这一项大家应该都会&#xff0c;网上也有很多教程。 二、搭建Windows server 2003 1、镜像下载- 2、虚拟机安装 首先是新建虚拟机&#xff0c;我选的是自定义&#xff0c;也可以选典型 第一步默认下一步&#xff0c;也可以是自己的情况做修改 第二步选择稍后安…

51c自动驾驶~合集11

我自己的原文哦~ https://blog.51cto.com/whaosoft/12684932 #如何在自动驾驶的视觉感知中检测corner cases&#xff1f; 一篇来自德国大学的论文&#xff1a;“Corner Cases for Visual Perception in Automated Driving: Some Guidance on Detection Approaches“&#xf…

四、自然语言处理_02RNN基础知识笔记

1、RNN的定义 RNN&#xff08;Recurrent Neural Network&#xff0c;循环神经网络&#xff09;是一种专门用于处理序列数据的神经网络架构&#xff0c;它与传统的前馈神经网络&#xff08;Feedforward Neural Network&#xff09;不同&#xff0c;主要区别在于它能够处理输入数…

梯度提升树(GBDT)与房价预测案例

文章目录 什么是梯度提升树&#xff08;GBDT&#xff09;&#xff1f;核心思想GBDT 的特点 梯度提升树的应用案例&#xff1a;房价预测场景描述步骤详解代码详情 详细代码讲解1. 导入必要的库2. 设置中文字体支持3. 可视化真实值与预测值4. 可视化预测误差分布5. 代码的运行效果…

Rust : 生成日历管理markdown文件的小工具

需求&#xff1a; 拟生成以下markdown管理小工具&#xff0c;这也是我日常工作日程表。 可以输入任意时间段&#xff0c;运行后就可以生成以上的markdown文件。 一、toml [package] name "rust-workfile" version "0.1.0" edition "2021"[d…

Linux网络:代理 穿透 打洞

Linux网络&#xff1a;代理 & 穿透 代理正向代理反向代理 内网穿透frp 内网打洞 代理 正向代理 正向代理是一种常见的网络代理方式&#xff0c;它位于客户端与目标服务器之间&#xff0c;代表客户端向服务器发送请求&#xff0c;接收响应。 如图&#xff0c;客户端发送的…

给el-table表头添加icon图标,以及鼠标移入icon时显示el-tooltip提示内容

在你的代码中&#xff0c;你已经正确地使用了 el-tooltip 组件来实现鼠标划过加号时显示提示信息。el-tooltip 组件的 content 属性设置了提示信息的内容&#xff0c;placement 属性设置了提示信息的位置。 你需要确保 el-tooltip 组件的 content 属性和 placement 属性设置正…

游戏引擎学习第30天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾 在这段讨论中&#xff0c;重点是对开发过程中出现的游戏代码进行梳理和进一步优化的过程。 工作回顾&#xff1a;在第30天&#xff0c;回顾了前一天的工作&#xff0c;并提到今天的任务是继续从第29天的代码开始&#xff0c…

python使用python-docx处理word

文章目录 一、python-docx简介二、基本使用1、新建与保存word2、写入Word&#xff08;1&#xff09;打开文档&#xff08;2&#xff09;添加标题&#xff08;3&#xff09;添加段落&#xff08;4&#xff09;添加文字块&#xff08;5&#xff09;添加图片&#xff08;6&#xf…

springboot kafka在kafka server AUTH变动后consumer自动销毁

前言 笔者使用了kafka用来传输数据&#xff0c;笔者在今年10月写了文章&#xff0c;怎么使用配置化实现kafka的装载&#xff1a;springboot kafka多数据源&#xff0c;通过配置动态加载发送者和消费者-CSDN博客 不过在实际运行中&#xff0c;kafka broker是加密的&#xff0c…

Jupyter Lab打印日志

有时候在 jupyter 中执行运行时间较长的程序&#xff0c;且需要一直信息&#xff0c;但是程序执行到某些时候就不再打印了。 可以开启 日志控制台&#xff0c;将日志信息记录在控制台中。 参考&#xff1a;https://www.autodl.com/docs/jupyterlab/

EtherCAT转ProfiNet网关实现西门子1200PLC与伺服电机连接的通讯案例

一. 案例背景 西门子1200PLC通过捷米特JM-ECTM-PN(EtherCAT转ProfiNet)网关将松下伺服电机(包括不限于型号MHMFO22D1U2M)或EtherCAT协议的其它设备或连接到ProfiNetPLC上&#xff0c;并在正常运行中支持EtherCAT协议。本产品可作为EtherCAT主站&#xff0c;做为西门子S7-1200系…

Redis 基础、Redis 应用

Redis 基础 什么是 Redis&#xff1f; Redis &#xff08;REmote DIctionary Server&#xff09;是一个基于 C 语言开发的开源 NoSQL 数据库&#xff08;BSD 许可&#xff09;。与传统数据库不同的是&#xff0c;Redis 的数据是保存在内存中的&#xff08;内存数据库&#xf…

Vue 组件通信全面解析

Vue 组件通信全面解析&#xff1a;方式、原理、优缺点及最佳实践 在 Vue 开发中&#xff0c;组件通信是一个重要的核心问题。随着应用复杂度的增加&#xff0c;如何在组件之间有效传递数据、触发事件&#xff0c;直接影响代码的可维护性和可扩展性。Vue 提供了多种组件通信方式…

Python-链表数据结构学习(1)

一、什么是链表数据&#xff1f; 链表是一种通过指针串联在一起的数据结构&#xff0c;每个节点由2部分组成&#xff0c;一个是数据域&#xff0c;一个是指针域&#xff08;存放下一个节点的指针&#xff09;。最后一个节点的指针域指向null&#xff08;空指针的意思&#xff0…

电脑插入耳机和音响,只显示一个播放设备

1. 控制面板-硬件和声音-Realtek高清音频-扬声器-设备高级设置-播放设备里选择使用前部和后部输出设备同时播放两种不同的音频流 在声音设置中就可以看到耳机播放选项