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

news2024/12/26 19:10:06

文章目录

    • 引言
    • 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.coloradmin.cn/o/2254372.html

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

相关文章

8. 一分钟读懂“代理模式”

8.1 模式介绍 代理模式是一种结构型设计模式&#xff0c;它通过提供一个代理对象来替代对另一个对象&#xff08;真实对象&#xff09;的访问。代理对象与真实对象实现相同的接口&#xff0c;并通过代理类对真实对象的访问进行控制&#xff0c;可以在调用前后执行附加操作&…

网络原理(HPPT/HTTPS)

应用层&#xff08;重点&#xff09; HTTP协议 HTTP 是⼀个⽂本格式的协议. 可以通过 Chrome 开发者⼯具或者 Fiddler 抓包, 分析 HTTP 请求/响应的细节. Fiddler 抓包 左侧窗⼝显⽰了所有的 HTTP请求/响应, 可以选中某个请求查看详情. • 右侧上⽅显⽰了 HTTP 请求的报⽂内容…

随时随地掌控数据:如何使用手机APP远程访问飞牛云NAS

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

计算机毕业设计Python+Spark医生推荐系统 医生门诊预测系统 医生数据分析 医生可视化 医疗数据分析 医生爬虫 大数据毕业设计 机器学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

golang实现单例日志对象

原文地址&#xff1a;golang实现单例日志对象 – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 介绍 golang有很多日志包&#xff0c;通过设置和修改都能实现日志轮转和自定义日志格式。例如&#xff1a;log、zap、golog、slog、log4go 等等。 …

SpringBoot该怎么使用Neo4j - 优化篇

文章目录 前言实体工具使用 前言 上一篇中&#xff0c;我们的Cypher都用的是字符串&#xff0c;字符串拼接简单&#xff0c;但存在写错的风险&#xff0c;对于一些比较懒的开发者&#xff0c;甚至觉得之间写字符串还更自在快速&#xff0c;也确实&#xff0c;但如果在后期需要…

【Calibre-Web】Calibre-Web服务器安装详细步骤(个人搭建自用的电子书网站,docker-compose安装)

文章目录 一、Calibre-Web和Calibre的区别是什么&#xff1f;使用场景分别是什么&#xff1f;二、服务器安装docker和docker-compose三、服务器安装Calibre-Web步骤1、安装完成后的目录结构2、安装步骤3、初始配置4、启动上传 四、安装Calibre五、docker-compose常用命令 最近想…

easyexcel 导出日期格式化

1.旧版本 在新的版本中formate已经被打上废弃标记。那么不推荐使用这种方式。 2.推荐方式 推荐使用另外一种方式【 Converter 】代码如下&#xff0c;例如需要格式化到毫秒【yyyy-MM-dd HH:mm:ss SSS】级别 创建一个公共Converter import com.alibaba.excel.converters.Conv…

ABAP - 系统集成之SAP的数据同步到OA(泛微E9)服务器数据库

需求背景 项目经理说每次OA下单都需要调用一次SAP的接口获取数据&#xff0c;导致效率太慢了&#xff0c;能否把SAP的数据保存到OA的数据库表里&#xff0c;这样OA可以直接从数据库表里获取数据效率快很多。思来想去&#xff0c;提供了两个方案。 在集群SAP节点下增加一个SQL S…

40分钟学 Go 语言高并发:【实战】分布式缓存系统

【实战课程】分布式缓存系统 一、整体架构设计 首先&#xff0c;让我们通过架构图了解分布式缓存系统的整体设计&#xff1a; 核心组件 组件名称功能描述技术选型负载均衡层请求分发、节点选择一致性哈希缓存节点数据存储、过期处理内存存储 持久化同步机制节点间数据同步…

w~视觉~合集27

我自己的原文哦~ https://blog.51cto.com/whaosoft/12715639 #视频AIGC~论文 1、Pix2Video: Video Editing using Image Diffusion 基于大规模图像库训练的图像扩散模型已成为质量和多样性方面最为通用的图像生成模型。它们支持反转真实图像和条件生成&#xff08;例如&…

MYSQL中的增删改查操作(如果想知道MYSQL中有关增删改查操作的知识,那么只看这一篇就足够了!)

前言&#xff1a;在 MySQL 中&#xff0c;增、删、改、查&#xff08;CRUD&#xff09;操作是基本的数据库操作&#xff0c;增操作&#xff08;INSERT&#xff09;用于插入数据&#xff0c;删操作&#xff08;DELETE&#xff09;用于删除数据&#xff0c;改操作&#xff08;UPD…

Ansible的yum和saltstack的哪个功能相似

Ansible的yum和saltstack的哪个功能相似 在 Ansible 和 SaltStack 中&#xff0c;Ansible 的 yum 模块 和 SaltStack 的 pkg 模块 功能相似。它们都用于管理软件包&#xff0c;支持安装、升级、删除和查询等操作。 Ansible 的 yum 模块 用途&#xff1a; 专门用于基于 Red Hat …

在做题中学习(76):颜色分类

解法&#xff1a;三指针 思路&#xff1a;用三个指针&#xff0c;把数组划分为三个区域&#xff1a; for循环遍历数组&#xff0c;i遍历数组&#xff0c;left是0区间的末尾&#xff0c;right是2区间的开头&#xff0c;0 1 2区间成功被划分 而上面的图画是最终实现的图样&…

Java版-速通数据结构-树基础知识

现在面试问mysql,红黑树好像都是必备问题了。动不动就让手写红黑树或者简单介绍下红黑树。然而&#xff0c;我们如果直接去看红黑树&#xff0c;可能会一下子蒙了。在看红黑树之前&#xff0c;需要先了解下树的基础知识&#xff0c;从简单到复杂&#xff0c;看看红黑树是在什么…

浙江工业大学《2024年828自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《浙江工业大学828自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2024年真题 Part1&#xff1a;2024年完整版真题 2024年真题

【计算机网络】实验11:边界网关协议BGP

实验11 边界网关协议BGP 一、实验目的 本次实验旨在验证边界网关协议&#xff08;BGP&#xff09;的实际作用&#xff0c;并深入学习在路由器上配置和使用BGP协议的方法。通过实验&#xff0c;我将探索BGP在不同自治系统之间的路由选择和信息交换的功能&#xff0c;理解其在互…

微信小程序全屏显示地图

微信小程序在界面上显示地图&#xff0c;只需要用map标签 <map longitude"经度度数" latitude"纬度度数"></map>例如北京的经纬度为&#xff1a;116.407004,39.904595 <map class"bgMap" longitude"116.407004" lati…

InfluxDB 集成 Grafana

将InfluxDB集成到Grafana进行详细配置通常包括以下几个步骤&#xff1a;安装与配置InfluxDB、安装与配置Grafana、在Grafana中添加InfluxDB数据源以及创建和配置仪表板。以下是一个详细的配置指南&#xff1a; 一、安装与配置InfluxDB 下载与安装&#xff1a; 从InfluxDB的官…

【AI系统】ESPNet 系列

ESPNet 系列 本文将会介绍 ESPNet 系列&#xff0c;该网络主要应用在高分辨率图像下的语义分割&#xff0c;在计算内存占用、功耗方面都非常高效&#xff0c;重点介绍一种高效的空间金字塔卷积模块&#xff08;ESP Module&#xff09;&#xff1b;而在 ESPNet V2 上则是会更进…