Vue3 Ref全家桶详解:从入门到实战

Vue3 Ref全家桶详解:从入门到实战

一、为什么需要Ref?

在Vue3的响应式系统中,ref就像给你的数据套上一个智能包装盒。想象你有一瓶普通矿泉水(基本类型数据),直接拿着瓶子摇晃(修改)别人是感知不到的。但如果你把它装进智能水杯(ref)里摇晃,杯子就会自动亮灯提醒大家"水被摇过啦!"

基本类型响应式困境

let count = 0
function increment() {count++ // 修改了但视图不会更新!
}

二、基础Ref用法

2.1 创建响应式数据

import { ref } from 'vue'const count = ref(0) // 套上智能包装盒
const user = ref({ name: '张三' }) // 对象也能装!

2.2 访问与修改

console.log(count.value) // 0 → 需要.value访问
count.value++ // 视图自动更新!// 对象操作
user.value.name = '李四' // 自动触发更新

2.3 模板中使用

<template><!-- 自动解包.value --><div>{{ count }}</div><button @click="count++">+1</button>
</template>

三、ShallowRef:浅层响应式

当你的对象像俄罗斯套娃时:

const nestedObj = shallowRef({layer1: {layer2: {value: '深层数据'}}
})// 触发响应:
nestedObj.value = { ... } // 不触发响应:
nestedObj.value.layer1.layer2.value = '新值'

适用场景

  • 大型不可变对象
  • 第三方库实例
  • 需要手动控制更新的场景

四、CustomRef:自定义Ref

自己造一个带震动提醒的智能水杯:

function useDebouncedRef(value, delay = 200) {let timeoutreturn customRef((track, trigger) => ({get() {track() // 标记依赖return value},set(newValue) {clearTimeout(timeout)timeout = setTimeout(() => {value = newValuetrigger() // 触发更新}, delay)}}))
}// 使用示例
const searchText = useDebouncedRef('', 500)

五、ToRef家族

5.1 toRef:保持响应连接

const state = reactive({ foo: 1 })
const fooRef = toRef(state, 'foo') // ↔ 保持连接fooRef.value++
console.log(state.foo) // 2

5.2 toRefs:解构不丢失响应

// 在组合式函数中
function useFeature() {const state = reactive({ x: 0, y: 0 })return { ...toRefs(state) } // 拆分成独立ref
}// 在组件中使用
const { x, y } = useFeature() // 依然保持响应!

5.3 在Props中的妙用

<script setup>
const props = defineProps(['user'])
const { user } = toRefs(props) // 安全解构watch(user, (newVal) => {console.log('用户信息更新了!')
})
</script>

六、Ref全家桶对比手册

方法特点典型场景注意事项
ref深响应式基本类型/需替换的对象记得.value
shallowRef浅层响应大对象/类实例深层修改需forceUpdate
customRef自定义存取逻辑防抖/校验/转换注意内存泄漏
toRef保持源响应连接从响应式对象提取单个属性源失效则ref失效
toRefs解构保持响应性组合式函数返回值/Props解构配合reactive使用更佳

七、实战技巧

7.1 模板Ref绑定组件

<template><ChildComponent ref="child" />
</template><script setup>
import { ref } from 'vue'const child = ref(null) // 获得组件实例
</script>

7.2 配合watch使用

const count = ref(0)watch(count, (newVal, oldVal) => {console.log(`${oldVal}变为${newVal}`)
}, { immediate: true })

7.3 TypeScript支持

interface User {name: stringage: number
}const user = ref<User>({name: 'Alice',age: 25
})

八、常见问题解答

Q:什么时候用ref?什么时候用reactive?
A:简单数据用ref,复杂对象用reactive。当需要保持引用稳定时优先ref。

Q:为什么我的ref修改没触发更新?
检查点:

  1. 是否正确使用.value
  2. 是否直接修改了数组的length
  3. 是否在异步回调中操作(需用shallowRef时)

Q:toRefs会复制对象吗?
不会!它只是创建代理,原对象修改仍会影响所有toRefs创建的ref。

九、总结

Ref全家桶就像瑞士军刀:

  • ref 是主刀,处理日常需求
  • shallowRef 是剪刀,处理特殊结构
  • customRef 是锉刀,定制特殊需求
  • toRef(s) 是开瓶器,解决解构难题

记住:每个工具都有适用场景,理解原理后灵活组合,才能写出优雅高效的Vue代码!


(注:本文示例基于Vue3.4版本,部分特性需注意版本兼容性)

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

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

相关文章

数字电路-基础逻辑门实验

基础逻辑门是数字电路设计的核心元件&#xff0c;它们执行的是基本的逻辑运算。通过这些基本运算&#xff0c;可以构建出更为复杂的逻辑功能。常见的基础逻辑门包括与门&#xff08;AND&#xff09;、或门&#xff08;OR&#xff09;、非门&#xff08;NOT&#xff09;、异或门…

哪吒闹海!SCI算法+分解组合+四模型原创对比首发!SGMD-FATA-Transformer-LSTM多变量时序预测

哪吒闹海&#xff01;SCI算法分解组合四模型原创对比首发&#xff01;SGMD-FATA-Transformer-LSTM多变量时序预测 目录 哪吒闹海&#xff01;SCI算法分解组合四模型原创对比首发&#xff01;SGMD-FATA-Transformer-LSTM多变量时序预测效果一览基本介绍程序设计参考资料 效果一览…

C++,STL 迭代器简介:概念、分类、操作

文章目录 引言一、迭代器的基本概念1.1 什么是迭代器?1.2 迭代器的意义二、迭代器的分类2.1 示意图:迭代器能力层级2.2 示例:不同迭代器的操作三、迭代器的常用操作3.1 基本操作3.2 随机访问迭代器专用操作示例代码:随机访问迭代器四、迭代器的通用用法4.1 遍历容器4.2 配合…

EasyExcel 导出合并层级单元格

EasyExcel 导出合并层级单元格 一、案例 案例一 1.相同订单号单元格进行合并 合并结果 案例二 1.相同订单号的单元格进行合并2.相同订单号的总数和总金额进行合并 合并结果 案例三 1.相同订单号的单元格进行合并2.相同订单号的商品分类进行合并3.相同订单号的总数和总金额…

常用的python库-安装与使用

常用的python库函数 yield关键字openslide库openslide对象的常用属性 cv2库numpy库ASAP库-multiresolutionimageinterface库ASAP库的安装ASAP库的使用 concurrent.futures.ThreadPoolExecutorxml.etree.ElementTree库skimage库PIL.Image库 PIL.Image.Imagedetectron2库数据增强…

C++基础系列【8】如何解决编译器报的错误

博主介绍&#xff1a;程序喵大人 35- 资深C/C/Rust/Android/iOS客户端开发10年大厂工作经验嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手《C20高级编程》《C23高级编程》等多本书籍著译者更多原创精品文章&#xff0c;首发gzh&#xff0c;见文末&#x1f447;&#x1f…

程序诗篇里的灵动笔触:指针绘就数据的梦幻蓝图<8>

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。 今天我们复习前面学习的指针知识 目录 关于指针数组和数组指针的区别指针数组&#xff08;Array of Poi…

UE5.5 PCGFrameWork--GPU CustomHLSL

在上一篇UE5.5 PCGFrameWork使用入门-CSDN博客 大致介绍了UE5 PCG框架的基本使用. 本篇探索PCGFrame的高级应用--GPU点云。也就是利用GPU HLSL编程对点云进行操纵&#xff0c;可以大幅度提升点云生成效率。 目前在UE5 PCG框架中&#xff0c;点云GPU的应用大致分为三类: Point…

Games202 Lecture11 LTC | Disney principled BRDF | NPR

Shading with microfacet BRDFs under polygonal lighting -Linearly Transformed Cosines(LTC)Real-Time PBR Materials cont. -Disney principled BRDFNon-photorealistic rendering(NPR) Linearly Transformed Cosines(LTC) lobe花瓣 BRDF的2d形状 基本思路: 任意BRDF变…

Flink 内存模型各部分大小计算公式

Flink 的运行平台 如果 Flink 是运行在 yarn 或者 standalone 模式的话&#xff0c;其实都是运行在 JVM 的基础上的&#xff0c;所以首先 Flink 组件运行所需要给 JVM 本身要耗费的内存大小。无论是 JobManager 或者 TaskManager &#xff0c;他们 JVM 内存的大小都是一样的&a…

学习数据结构(8)双向链表

1.双向链表的实现 双向链表一般指带头双向循环链表 &#xff08;1&#xff09;双向链表的声明 &#xff08;2&#xff09;双向链表的打印 &#xff08;3&#xff09;向内存申请节点 &#xff08;4&#xff09;初始化双向链表 或 &#xff08;5&#xff09;尾部插入 &#xf…

【漫话机器学习系列】088.常见的输出层激活函数(Common Output Layer Activation Functions)

在神经网络中&#xff0c;输出层&#xff08;Output Layer&#xff09; 的激活函数&#xff08;Activation Function&#xff09;直接决定了模型的输出形式&#xff0c;并影响损失函数的选择及训练效果。不同的任务类型&#xff08;如分类或回归&#xff09;需要使用不同的激活…

Python 鼠标轨迹 - 防止游戏检测

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…

工业相机在工业生产制造过程中的视觉检测技术应用

随着技术不断发展以及工业4.0时代的到来&#xff0c;利用工业相机进行视觉检测技术已经成为制造业不可或缺的一部分。通过结合先进的计算机视觉、AI算法和自动化设备&#xff0c;工业视觉检测为生产线质量控制和效率提升提供了革命性的解决方案。 一、什么是工业视觉检测技术 …

了解网络层

目录 一、IP协议 二、地址管理 IP地址 概念 作用 格式 网段划分 三、路由选择 网络层要做的事情主要是两个方面&#xff1a; 地址管理&#xff1a;制定一系列的规则&#xff0c;通过地址&#xff0c;描述出网络上一个设备的位置。路由选择&#xff1a;网络环境比较复杂…

NO.11十六届蓝桥杯备战|if-else语句|嵌套if|悬空else|练习4道(C++)

if-else语句 if语句 if语句的语法形式如下&#xff1a; if ( 表达式 ) 语句;表达式成⽴&#xff08;为真&#xff09;&#xff0c;则语句执⾏&#xff0c;表达式不成⽴&#xff08;为假&#xff09;&#xff0c;则语句不执⾏ 0为假&#xff0c;⾮0表⽰真&#xff0c;也就是…

Json-RPC框架项目(一)

目录 1. 项目介绍: 2. 技术选择; 3. 第三方库介绍; 4. 项目功能; 5. 模块功能; 6. 项目实现: 1. 项目介绍: RPC是远程过程调用, 像调用本地接口一样调用远程接口, 进行完成业务处理, 计算任务等, 一个完整的RPC包括: 序列化协议, 通信协议, 连接复用, 服务注册, 服务发…

Discourse 创建和配置用户自定义字段

用户自定义字段能够让你在用户注册的是要求用户提供更多的信息。这些用户提供的信息可以在用户名片&#xff0c;用户摘要页面下显示&#xff0c;甚至还可以通过 Data Explorer plugin 插件进行查询。 本文能够帮助你对这些字段进行配置和设置。 添加一个用户字段 进入 Admin…

从零到一:我的元宵灯谜小程序诞生记

缘起&#xff1a;一碗汤圆引发的灵感 去年元宵节&#xff0c;我正捧着热腾腾的汤圆刷朋友圈&#xff0c;满屏都是"转发锦鲤求灯谜答案"的动态。看着大家对着手机手忙脚乱地切换浏览器查答案&#xff0c;我突然拍案而起&#xff1a;为什么不做一个能即时猜灯谜的微信…

【C++11】lambda和包装器

1.新的类功能 1.1默认的移动构造和移动赋值 原来C类中&#xff0c;有6个默认成员函数&#xff1a;构造函数/析构函数/拷⻉构造函数/拷⻉赋值重载/取地址重 载/const 取地址重载&#xff0c;最后重要的是前4个&#xff0c;后两个⽤处不⼤&#xff0c;默认成员函数就是我们不写…