Vue3响应式原理之ref篇

Vue3基础篇核心笔记:从响应式原理到工程实践避坑指南 前端框架是构建现代Web应用的基础,Vue3凭借组合式API和全新的响应式系统成为团队技术选型的热门方向。其核心在于通过Proxy实现深层响应式拦截,解决了Vue2中属性新增删除无法感知的痛点,但操作不当又会导致解构丢失响应性。理解ref、reactive、computed等API的边界,掌握watch与watchEffect的适用场景,是高效开发的前提。在工程实践中,从Vite项目初始化、组件通信(defineProps/defineEmits/defineExpose)、插槽用法,到部署时的静态资源路径 阅读详情

在 Vue 3 的响应式系统中,ref 和 reactive 是用于定义响应式变量最核心的两个API。今天本文将带大家剖析 ref 的内部机制,以及与 reactive 的对比和应用场景。

一、什么是 ref

ref 是 Vue 3 提供的一个函数,用于创建一个可响应式的引用对象,它的值通过 .value 属性访问和修改:

import { ref } from 'vue'

const count = ref(0)
console.log(count.value) // 0

count.value++
console.log(count.value) // 1

内部实现简述
ref 返回的是一个包含 value getter/setter 的对象(如 RefImpl类实例)。当读取 .value 时,会触发getter下的track() 收集依赖;当赋值时,会触发 setter中的trigger() 触发更新。

/*
* - RefImpl类实现get和set
* @params {any} rawValue - ref传入的值
* @params {boolean|readonly} _isShallow - 判断是否浅层代理决定是否需要reactive
* @returns - 无
*/

class RefImpl {
  constructor(rawValue, _isShallow) {
      this._value = _isShallow ? _rawValue: convert(_rawValue)
      this._shallow = _isShallow
  }
  get value() {
    track(this, 'value') // 收集依赖
    return this._value
  }
  set value(newValue) {
    if (hasChanged(newValue, this._value)) {//旧值与新值比对
       this._value = this._shallow ? newValue : convert(newValue);
      trigger(this, 'value') // 触发更新
    }
  }
}
function convert(value) {
    return (Object.prototype.toString.call(value) == '[object Object]') ? reactive(value) : value
}

说明:ref 的响应式依赖对 .value 的访问

二、ref vs reactive 核心区别

适用类型:
ref: 基本类型(number, string, boolean)或对象
reactive: 仅对象/数组(不能用于基本类型)

访问方式:
ref: 必须通过 .value
reactive: 直接属性访问(如 obj.count)
解包行为
ref: 在模板中自动 .value 解包
reactive: 无解包,直接使用
嵌套响应式
ref: 对象会自动转为 reactive(除非 shallow)
reactive: 所有嵌套对象进行响应式转换

示例对比

// 使用 ref(推荐用于基本类型)
const count = ref(0)
const user = ref({ name: 'Alice' })

// 使用 reactive
const state = reactive({
  count: 0,
  user: { name: 'Alice' }
})
//在模板中
<template>
 {{ count }}        
 {{ user.name }}    
 {{ state.count }}
 {{ state.user.name }}
</template>

说明:在 JavaScript 中,ref 必须手动 .value,而 reactive 不需要。

三、何时使用 ref,何时使用 reactive?

推荐使用 ref 的场景:
如果是处理基本类型数据,则使用ref,这也是 reactive 无法做到的, reactive处理基本类型数据无响应式更新,例如:

let val = reactive(1)
// 以下更改都会失去响应式
 setTimeout(() => {
  val = 2
  val = reactive(2)
 }, 1000)

推荐使用 reactive 的场景:

// 管理复杂对象或表单状态
  const form = reactive({
     email: '',
     password: '',
     errors: []
   })
   
//避免大量 .value 写法
// 比 ref({ ... }) 更简洁
 	const state = reactive({ a: 1, b: 2, c: 3 })
   state.a++ // 直接操作
   
//性能略优于 ref 的嵌套对象
//reactive 只创建一层 Proxy,而 ref 包裹对象时内部仍会调用reactive

四、常见误区

1:在 effect 或 watchEffect 中创建 ref

// 错误,每次 effect 执行都会新建 ref,失去响应式
effect(() => {
  const count = ref(0) 
  console.log(count.value)
})
// 正确做法:在 effect 外定义 ref
const count = ref(0)
effect(() => {
  console.log(count.value) // 追踪稳定的 ref
})

2:混淆 ref 和普通变量

let count = ref(0)
count = 1 // 赋值给变量本身,丢失响应式!

//正确:始终操作 .value
count.value = 1 

五、总结

对于掌握 ref 与 reactive 的差异,可以在适当场景下写出高效、可维护 Vue 3 应用的关键。本文主要基于ref的核心源码实现,其他功能如reactive和effect的依赖与收集实现可以参考本人之前的文章,也欢迎有问题的博友在评论区一起讨论!

为什么Vue 3需要ref函数?它的响应式原理与正确用法是什么? 使用ref需要先从vueimport { ref } from 'vue' // 必须导入ref// 用ref包裹基本类型,返回Ref对象const count = ref(0) // 初始值为0const message = ref('Hello Vue 3') // 字符串const isDark = ref(false) // 布尔值</script>Ref对象有一个**value属性**,存储着实际的基本类型值。在JavaScript代码中(如setup、函数内),必须通过value。 阅读详情

相关推荐

vue3中的ref和reactive

特性refreactive响应式原理Proxy数据类型任意类型(包装为Ref对象)仅对象/数组(需为引用类型)访问方式模板中自动解包,JS 中需.value直接访问属性类型系统Ref<T>原始对象类型的代理解构响应式保持响应式(.value需使用toRefs保持响应式在实际开发中,两者通常结合使用:用reactive管理复杂状态对象,用ref处理简单值或作为函数返回值。维度原生实现Vue3 实现实现复杂度较低(基础功能)极高(完整生态)性能基础优化。

guxue365的专栏 1639

Vue3超详细的ref()用法,看这一篇就够了

ref()接受一个内部值,返回一个响应式的可更改的ref 对象,此对象只有一个指向其内部值的属性.value。ref() 将传入参数的值包装为一个带 .value 属性的 ref 对象。

EchoLiner的博客 14万+

Vue3-02-ref() 响应式详解

vue3 中 使用 ref 声明响应式变量

northcastle的博客 2523

Vue3中 ref 属性详解

总结:在 Vue3 中没有 $refs,因此 Vue3 中通过 ref 属性获取元素就不能按照 vue2 的方式来获取。Vue3 需要借助生命周期方法,因为在 setup 执行时,template 中的元素还没挂载到页面上,所以必须在 mounted 之后才能获取到元素。 总结: 先申明 ref 响应式数据,再返回给模版使用,模板中通过 ref 绑定数据; 总结: 先定义一个空数组,再定义一个函数获取元素,并把该函数绑定到 ref 上(必须动态绑定),最后在函数中可以通过参数得到单个元素,这个元素一般可以放

明天也要努力的博客 4万+

BEVFormer vs BEVFusion:5个关键差异点帮你选对环视感知方案

本文深入对比了自动驾驶领域两大主流环视感知方案BEVFormer与BEVFusion。BEVFormer作为纯视觉BEV感知的标杆,通过注意力机制隐式学习深度,成本较低;而BEVFusion作为多模态融合典范,融合激光雷达与摄像头数据,在性能、小目标检测及极端环境鲁棒性上优势显著。文章从计算效率、部署成本、数据依赖性等五个核心维度提供选型指南,帮助技术决策者根据自身算力预算与传感器配置做出明智选择。

weixin_29306011的博客 124

【脑电分析系列】第15篇:脑电功能连接性与脑网络分析(二):Granger因果性、图论指标与复杂网络构建

摘要: 本文深入探讨了脑电(EEG)分析中的高阶连接性方法——有效连接(Effective Connectivity),重点介绍了Granger因果性(Granger Causality, GC)的原理与应用。GC通过统计预测揭示脑区间信息流动方向,超越了传统功能连接的同步性分析。文章还结合图论指标(如度、路径长度、聚类系数和模块化)量化脑网络的拓扑结构,并通过Python代码(MNE和NetworkX库)演示了从EEG数据构建、分析复杂脑网络的完整流程。该研究为理解大脑动态互动、认知任务信息流及神经系统疾

qq_32516809的博客 1563

Vue 3 中的 ref 完全指南

Vue 3 引入了 Composition API,其中 ref 是关键的一部分。ref 可以让我们更方便地在组件中定义响应式数据,在模板中使用 语法糖时尤为简洁。

2301_79858914的博客 8112

FortiGate-60E防火墙忘记密码?用Console线+TFTP重装固件v7.0.9全流程

本文详细介绍了当FortiGate-60E防火墙忘记密码且物理重置无效时,如何通过Console线连接并利用TFTP服务器重装固件(如v7.0.9)的全流程。从恢复原理、工具准备、网络配置到逐步执行命令,提供了完整的实战指南,帮助管理员彻底恢复设备出厂设置并重置密码。

snow3的博客 333

Vue3 ref函数详解

ref函数是 Vue 3 中用于创建响应式数据的一个函数。它接受一个初始值作为参数,并返回一个响应式引用对象。这个引用对象具有一个名为value的属性,用于存储和访问响应式数据的值。通过ref函数创建的响应式数据,当数据发生变化时,Vue 会自动追踪并更新。ref函数是Vue3 Composition API的一个重要部分,它为我们提供了创建和管理响应式数据的更强大、更灵活的方式。希望这篇文章能帮助你更好地理解和使用ref函数。

m0_68932924的博客 2763

从时频谱图到智能感知:雷达信号处理的AI进化之路

本文探讨了人工智能在雷达信号处理中的革命性应用,特别是深度学习在时频谱图分析中的突破性进展。通过对比传统信号处理方法与AI驱动的解决方案,展示了CNN、3D CNN等模型在目标检测、行为识别等场景中的优势,并分析了数据获取、模型优化等关键技术挑战。AI赋能的雷达技术已广泛应用于智能交通、工业检测和医疗健康领域,展现出巨大的发展潜力。

weixin_29284201的博客 507

Starlink第三代终端与第二代终端的差异分析

SpaceX星链第三代终端实现显著升级,硬件售价维持599美元不变但性能全面提升。相比第二代产品,第三代终端取消自动调节电机改为手动定向,防水防尘等级提升至IP67,天线面积扩大46%,支持235台设备连接(提升87%),下载速度可达1Gbps(提升4倍),延迟降至20ms以下。新增3个千兆接口和WiFi6支持,同时推出199美元单独路由器选项。这些改进使第三代终端在保持价格优势的同时,更好地满足户外、移动和商业场景需求,标志着SpaceX卫星互联网服务从亏损销售转向盈利模式的重要转折。

通信行业老兵、物联网从业者,做一个有趣的普通人。 3030

vue3 ts命名一个里面都是布尔值的响应式数组变量

给这个变量赋值或者取值直接用vue3的方法即可。技术或者指正请通过私信或者邮箱,

Bannerparter的博客 1846

从战略到执行:业务领先模型 BLM 的第一把钥匙「差距分析」

业务领先模型「BLM」(Business Leadership Model),俗称“别乱摸”,起源于哈佛商学院的战略理论研究,是一套完整的战略规划方法论。 后来被 IBM 发扬光大,IBM 在转型关键时期完成了对 BLM 模型的导入和创新,从此这个模型成为 IBM 中高层用于战略制定与执行联接的方法与平台。 再到后来华为花巨资引入了 BLM 模型,经过多年的应用,将其演化成了公司战略规划和落地的主要方法与流程,也因此被中国科技企业所认识和接受。 BLM 模型可以解决哪些问题? 在企业内,

产品线负责人 2400

Vue 3基础篇精要:响应式、组件化与迁移实战指南

前端开发中,框架的选择与升级往往直接影响工程效率和维护成本。Vue.js作为主流渐进式框架,其3.x版本在响应式原理、组合式API和工程化构建上均带来深层革新。理解Proxy代理机制与ref/reactive的取舍,是掌握响应式数据流的关键;而Composition API的引入则重新组织了组件逻辑,配合props、emit、插槽与provide/inject等通信方案,让组件化设计更灵活。通过Vite初始化项目、合理利用计算属性缓存、规避常见模板陷阱,开发者可以显著提升代码质量与运行性能。无论是从Vue

weixin_29708043的博客 145

用 SE84 反查 SAP 消息号:弹窗一闪而过也能抓到 Message ID 和 Number 的小技巧

SAP开发技巧:通过消息文本反查Message ID和编号 在SAP开发中,经常遇到系统只显示错误消息文本而缺少技术信息的情况。本文介绍两种实用方法: 使用SE84工具:通过输入带通配符的短文本(如"错误文本")反向查找消息类和编号 直接查询T100表:利用消息文本在T100表中检索完整的消息技术信息 这些技巧特别适用于处理弹窗消息、框架层错误等无法直接获取技术细节的场景。掌握消息ID和编号后,开发者可以更高效地进行问题定位、代码调试和错误处理,尤其在SAP Gateway、RAP等现代

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 375

ADS基础教程19 - 电磁仿真(EM)基本概念和实操

一、引言二、基本概念1.EM介绍2.Momentum介绍3.FEM介绍4.Substrate介绍三、创建Layout并进行Momentum仿真1.创建Layout2.添加Microtrip(微带线)3.添加Substrate4.Momentum仿真四、总结EM全称Electromagnetic,即electro(电)magnetic(磁)。ADS为设计和评估现代通信系统产品提供了电磁仿真工具(EM)。EM包括Momentumsimulator(动量仿真器)和FEM。

XZ_ZC的博客 1万+

vue3响应式原理之Ref

二. 实现 1. ref 函数 我们调用的ref函数,传进来一个 val 值,调用 函数,我们来看下该函数的实现 2. createRef 函数 该函数里边做了一个判断,该值如果已经是一个,则直接返回,否则创建一个 Ref 实例,让我们看下 类的实现 3. RefImpl 类的实现 定义了四个变量 _value: 用来保存加工后实现响应化的值 _rawValue: 用来保存当前未经加工过的值 dep: 用来收集依赖,是一个 类型 _v_isRef: 用来标识该值是否经过 ref 加工 在中,我们为 和

SK_study的博客 9213

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

vue3的ref,reactive的使用和原理解析

vue3新增了ref,reactive两个api用于响应式数据,Ref 系列毫无疑问是使用频率最高的 api 之一,响应式意味着数据变动,页面局部自动更新。

weixin_42974827的博客 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

关于 Vue3 响应式 API 以及 reactive 和 ref 的用法

这篇文章记录一下 Vue3 响应式的内容,其中还包括了 reactive 和 ref 的用法。响应式是一种允许以声明式的方式去适应变化的编程范例,接下来我们一起看看。

黛琳ghz的博客,期待你的关注。 5万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

总结vue3响应式原理与ref、reactive

ref判断了对象是原始类型还是object,是object则通过reactive new Proxy后再赋值给value,否则直接赋值给value,ref支持声明number,布尔等原始类型的值和对象的响应式数据reactive只支持声明object响应式数据,返回的是一个Proxy代理对象通过Weak容器,实现观察者角色,ref和reactive都实现了通过get的track收集依赖到容器和set参数的trigger触发容易中的依赖的更新,下面是vue官方的一段话。

gaotlantis的博客 1147

Vue3——响应式实现(ref、reactive)

setup是Vue3中一个新的配置项,值为。eg:返回一个对象: App.vue eg2: 返回的是 在vue2中中的属性会通过原理最终包装成响应式数据_data。 vue3中为我们提供了两种包装响应式数据的方法:ref和reactive注意这里的ref和vue2中的ref不一样,这里是一个。上面使用setup包裹页面数据,但是这样编写出的数据不是响应式的,即数据改变页面不会被重新加载。从vue2中我们知道一个数据要实现响应式一定有对应的响应式得getter和setter方法,在vue3中通过帮我们生成响

mantou_riji的博客 5407

【Vue3响应式】ref、reactive,以及toRefs 函数

Vue3中的ref和reactive都是响应式数据的实现方式。在Vue3中,我们可以使用ref来将基本数据类型包装为一个响应式对象,使用reactive将对象包装为响应式对象。本文将介绍这两种响应式数据的实现方式以及它们之间的区别。 toRefs 函数可以将一个响应式对象转换为一组响应式属性。这个函数可以用于将父组件中的响应式对象传递给子组件,并在子组件中以单独的响应式属性的形式使用它们。

正在解锁骑着骆驼去南极的世界 1万+

Vue 响应式原理深度解析:Vue2 vs Vue3 核心差异 + ref/reactive 实战指南

本文深入剖析Vue响应式系统原理,对比Vue2与Vue3实现差异。Vue2基于Object.defineProperty存在无法监听新增属性、数组操作受限等痛点;Vue3采用Proxy方案实现全面升级,支持对象/数组所有操作并提升性能。详细讲解了ref与reactive的使用场景与区别,提供toRefs等实用工具的使用指南,总结常见开发陷阱及解决方案。通过核心原理分析+实战示例,帮助开发者深入理解Vue响应式的设计思想,掌握最佳实践方案。

qq_40303030的博客 1919

Vue3响应式原理深度解析:别再只会用ref和reactive了

Vue3的响应式系统不是黑魔法,是有原理的。别再只会用ref和reactive了——理解原理,你的代码会更高效、更可控。响应式系统就像汽车的发动机,你不需要成为机械师,但了解基本原理能让你更好地驾驶。别只会踩油门,也要知道什么时候该刹车。

大山哥 4991

拥抱Vue3 (三) ref 与 reactive以及响应式原理

一、ref 包装基本数据类型数据 在第二篇文章中举例的时候,我们创建了非响应式的数据,在控制台中查看数据发现并不存在get与set方法。在查了文档后发现,Vue3中需要使用一个新的方法 `ref ` 去让数据变成响应式的。 <template> <div class="main"> <h1>我叫{{name}},我今年{{age}}了</h1> <button @click="changeInfo">修改<...

黑猫几绛的博客 2187

深入Vue3响应式原理:从Proxy到ref-reactive实现

本文深入解析Vue3响应式原理,对比Proxy与Object.defineProperty的差异,详细阐述ref/reactive的实现机制,并手写简化版响应式系统。文章首先介绍Vue3响应式系统的三大优势,随后通过代码示例展示Proxy的基础用法及Reflect的作用,重点讲解effect、依赖收集(track)和更新触发(trigger)的实现原理,最终完整实现reactive、ref等核心API。帮助开发者深入理解Vue3响应式设计思想,掌握从Proxy到双向绑定的完整技术链路。

xChive的博客 1117
上一篇: Vue3 响应式依赖收集与更新之effect
下一篇: 深入Vue3响应式核心:computed 的实现原理与应用
Zhencode
博客等级 码龄7年 106粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值