Vue3 中 ref 与 reactive 的区别及底层原理详解

news2025/5/10 8:31:06

一、核心区别

1. 数据类型与使用场景

• ref

 可定义基本类型(字符串、数字、布尔值)和对象类型的响应式数据。对于对象类型,`ref` 内部会自动调用 `reactive` 将其转换为响应式对象。  
 语法特点:需通过 `.value` 访问或修改数据(模板中自动解包,无需 `.value`)。  
 适用场景:简单数据、需跨组件传递的独立变量、需要重新赋值的场景(如替换整个对象)。  

• reactive

 仅支持对象类型(对象、数组、Map/Set 等),通过 `Proxy` 实现深度响应式代理。  
 语法特点:直接访问属性(如 `state.count`),无需 `.value`,但无法直接替换整个对象(需用 `Object.assign` 合并更新)。  
 适用场景:复杂嵌套对象、需深度响应式追踪的复杂数据结构。  
2. 响应式机制差异
ref 底层原理
 通过封装对象的 `.value` 属性实现响应式:  
 ◦ 对基本类型使用 `Object.defineProperty` 的 `get/set` 进行数据劫持。  

 ◦ 对对象类型内部调用 `reactive` 转换为 `Proxy` 代理。  

 ```javascript
 // 简化的 ref 实现逻辑
 function ref(value) {
   return {
     get value() { track(this, 'value'); return value; },
     set value(newVal) { value = newVal; trigger(this, 'value'); }
   };
 }
 ```
reactive 底层原理
 基于 `Proxy` 拦截对象属性的增删改查,结合 `Reflect` 操作原始数据:  
 ```javascript
 // 简化的 reactive 实现逻辑
 function reactive(obj) {
   return new Proxy(obj, {
     get(target, key) { track(target, key); return Reflect.get(target, key); },
     set(target, key, value) { 
       Reflect.set(target, key, value); 
       trigger(target, key); 
       return true;
     }
   });
 }
 ```
 所有嵌套属性均会被递归代理,实现深层响应性。

二、关键特性对比

特性refreactive
数据类型基本类型 + 对象类型仅对象类型
访问方式.value(模板自动解包)直接访问属性(如 state.key
重新赋值支持(通过 .value =需合并更新(如 Object.assign
解构响应性解构后仍需 .value解构会丢失响应性,需 toRefs
性能基本类型更轻量复杂对象更高效(Proxy 深度监听)

三、设计理念与使用建议

1. 设计哲学

ref 提供单一值响应式的原子化封装,适合组件间传递独立状态。

reactive 针对复杂状态树设计,通过 Proxy 实现细粒度依赖追踪,优化深层更新性能。

2. 使用建议

• 优先 ref 的场景:

 ◦ 简单数据(如计数器、表单字段)。  

 ◦ 需要频繁替换整个对象(如接口返回数据更新)。  

• 优先 reactive 的场景:

 ◦ 复杂配置对象(如含多层嵌套的表单数据)。  

 ◦ 需要自动追踪属性增删的场景(如动态表单字段)。  
3. 注意事项

reactive 直接替换整个对象会丢失响应性,需用 Object.assign 合并更新。

• 模板中 ref 对象自动解包,但 JavaScript 中必须使用 .value

• 使用 toRefs 解构 reactive 对象可保持响应性。


四、总结

refreactive 是 Vue3 响应式系统的两大核心 API:
ref 通过 .value 封装简化基本类型响应式,兼顾对象类型的灵活性。

reactive 利用 Proxy 实现深度监听,适合复杂状态管理。

开发者应根据数据类型、更新频率及使用场景选择最合适的 API,必要时结合 toRefs 优化代码结构。


异步输出

async await后面的任务是会加入微任务队列,本身是同步函数的话直接就console.log()


this指向输出

const定义变量时不会被挂载到window上

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

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

相关文章

Baklib实战企业内容与中台管理差异解析

企业内容管理中台本质差异 企业内容管理系统(CMS)与内容中台的核心差异在于战略定位与技术路径的本质性区隔。传统CMS聚焦于内容存储与审批流程的线性管理,而内容中台则构建起全域数据服务中枢,通过API接口实现跨系统内容资产调用…

通用外设驱动模型(四步法)

举例:GPIO配置步骤 1、使能时钟 __HAL_RCC_GPIOx_CLK_ENABLE()2、设置工作模式 HAL_GPIO_Init()3、设置输出状态(可选) HAL_GPIO_WritePin() HAL_GPIO_TogglePin()4、读取输入状态(可选) HAL_GPIO_ReadPin()模块…

IoT无线组网模块,万物互联的底层通信基石

随着物联网(IoT)技术在“快车道”上持续飞驰,一场“交互革命”正在人们的日常出行与工作学习等生活场景中加速爆发。从智能家居到智慧城市,从智慧交通到工业自动化,物联网(IoT)技术凭借着万物互…

learning ray之ray强化学习/超参调优和数据处理

之前我们掌握了Ray Core的基本编程,我们已经学会了如何使用Ray API。现在,让我们将这些知识应用到一个更实际的场景中——构建一个强化学习项目,并且利用Ray来加速它。 我们的目标是,通过Ray的任务和Actor,将一个简单…

【Linux】深入拆解Ext文件系统:从磁盘物理结构到Linux文件管理

目录 1、理解硬件 (1)磁盘 (2)磁盘的物理结构 (3)磁盘的存储结构 (4)磁盘的逻辑结构 (5)CHS && LBA地址 2、引入文件系统 (1&…

基于 Ubuntu 24.04 部署 WebDAV

无域名,HTTP 1. 简介 WebDAV(Web Distributed Authoring and Versioning)是一种基于 HTTP 的协议,允许用户通过网络直接编辑和管理服务器上的文件。本教程介绍如何在 Ubuntu 24.04 上使用 Apache2 搭建 WebDAV 服务,无…

tauri-plugin-store 这个插件将数据存在本地电脑哪个位置

tauri-plugin-store 插件用于在 Tauri 应用中以键值对形式持久化存储数据。它将数据存储在用户本地电脑的一个 JSON 文件中,具体路径取决于操作系统,并且通常位于操作系统的应用数据目录中。 默认存储位置 以默认配置为例(使用 default sto…

一场陟遐自迩的 SwiftUI + CoreData 性能优化之旅(下)

概述 自从 SwiftUI 诞生那天起,我们秃头码农们就仿佛打开了一个全新的撸码世界,再辅以 CoreData 框架的鼎力相助,打造一款持久存储支持的 App 就像探囊取物般的 Easy。 话虽如此,不过 CoreData 虽好,稍不留神也可能会…

数字人驱动/动画方向最新顶会期刊论文收集整理 | AAAI 2025

会议官方论文列表:https://ojs.aaai.org/index.php/AAAI/issue/view/624 以下论文部分会开源代码,若开源,会在论文原文的摘要下方给出链接。 语音驱动头部动画/其他 EchoMimic: Lifelike Audio-Driven Portrait Animations through Editabl…

数据结构 集合类与复杂度

文章目录 📕1. 集合类📕2. 时间复杂度✏️2.1 时间复杂度✏️2.2 大O渐进表示法✏️2.3 常见的时间复杂度量级✏️2.4 常见时间复杂度计算举例 📕3. 空间复杂度 📕1. 集合类 Java 集合框架(Java Collection Framework…

Python学习笔记--Django的安装和简单使用(一)

一.简介 Django 是一个用于构建 Web 应用程序的高级 Python Web 框架。Django 提供了一套强大的工具和约定,使得开发者能够快速构建功能齐全且易于维护的网站。Django 遵守 BSD 版权,初次发布于 2005 年 7 月, 并于 2008 年 9 月发布了第一个正式版本 1…

SecureCRT网络穿透/代理

场景 公司的办公VPN软件只有Windows系统版本,没有Macos系统版本,而日常开发过程中需要先登录VPN后,然后才能登录应用服务器。 目的:Macos系统在使用SecureCRT时,登录服务器,需要走Parallels Desktop进行网络…

视频添加字幕脚本分享

脚本简介 这是一个给视频添加字幕的脚本,可以方便的在指定的位置给视频添加不同大小、字体、颜色的文本字幕,添加方式可以直接修改脚本中的文本信息,或者可以提前编辑好.srt字幕文件。脚本执行环境:windowsmingwffmpeg。本方法仅…

OrangePi Zero 3学习笔记(Android篇)4 - eudev编译(获取libudev.so)

目录 1. Ubuntu中编译 2. NDK环境配置 3. 编译 4. 安装 这部分主要是为了得到libudev(因为原来的libudev已经不更新了),eudev的下载地址如下: https://github.com/gentoo/eudev 相应的代码最好是在Ubuntu中先编译通过&#…

华为昇腾910B通过vllm部署InternVL3-8B教程

前言 本文主要借鉴:VLLM部署deepseek,结合自身进行整理 下载模型 from modelscope import snapshot_download model_dir snapshot_download(OpenGVLab/InternVL3-8B, local_dir"xxx/OpenGVLab/InternVL2_5-1B")环境配置 auto-dl上选择单卡…

upload-labs靶场通关详解:第三关

一、分析源代码 代码注释如下&#xff1a; <?php // 初始化上传状态和消息变量 $is_upload false; $msg null;// 检查是否通过POST方式提交了表单 if (isset($_POST[submit])) {// 检查上传目录是否存在if (file_exists(UPLOAD_PATH)) {// 定义禁止上传的文件扩展名列表…

星光云720全景VR系统升级版,720全景,360全景,vr全景,720vr全景

星光云720全景VR系统升级版&#xff0c;720全景&#xff0c;360全景&#xff0c;vr全景&#xff0c;720vr全景 星光云全景系统 系统体验地址 https://720.ailemon.cc 星光云全景新版体验地址 全景系统功能简介 基础设置&#xff1a;作品信息&#xff0c;加载样式&#xff…

第十六节:图像形态学操作-顶帽与黑帽变换

一、引言&#xff1a;形态学操作的视觉魔法 在数字图像处理领域&#xff0c;形态学操作犹如一柄精巧的解剖刀&#xff0c;能够精准地提取图像特征、消除噪声干扰&#xff0c;并增强关键细节。OpenCV作为计算机视觉的瑞士军刀&#xff0c;提供了一套完整的形态学处理工具。在掌…

将 iconfont 图标转换成element-plus也能使用的图标组件

在做项目时发现&#xff0c;element-plus的图标组件&#xff0c;不能像文档示例中那样使用 iconfont 的图标。经过研究发现&#xff0c;element-plus的图标封装成了vue组件&#xff0c;组件内容是一个svg&#xff0c;然后以组件的方式引入和调用图标。根据这个思路&#xff0c;…

大模型系列(四)--- GPT2: Language Models are Unsupervised Multitask Learners​

论文链接&#xff1a; Language Models are Unsupervised Multitask Learners 点评&#xff1a; GPT-2采用了与GPT-1类似的架构&#xff0c;将参数规模增加到了15亿&#xff0c;并使用大规模的网页数据集WebText 进行训练。正如GPT-2 的论文所述&#xff0c;它旨在通过无监督语…