当前位置: 首页 > news >正文

Vue3 中的 ref、模板引用和 defineExpose 详解

一、ref 基础

在 Vue3 中,ref 是一个非常重要的响应式 API,它用于创建一个响应式的引用。

1.1 ref 的基本用法

javascript

import { ref } from 'vue';const count = ref(0); // 创建一个响应式引用,初始值为0console.log(count.value); // 访问值需要使用 .value
count.value++; // 修改值

特点:

  • ref 可以包装任何类型的值,使其变成响应式

  • 在 JavaScript 中访问或修改值时需要使用 .value

  • 在模板中使用时不需要 .value,Vue 会自动解包

1.2 为什么需要 ref

Vue3 使用 Proxy 实现响应式,但 Proxy 无法直接代理原始值(如 number, string 等)。ref 通过将这些值包装在一个对象中,解决了这个问题。

二、模板引用

模板引用是指直接在模板中访问 DOM 元素或组件实例的能力。

2.1 基本模板引用

html

<template><input ref="inputRef" type="text" />
</template><script setup>
import { ref, onMounted } from 'vue';const inputRef = ref(null); // 必须与模板中的 ref 同名onMounted(() => {inputRef.value.focus(); // 在挂载后自动聚焦
});
</script>

要点:

  1. 声明一个与模板中 ref 同名的响应式引用

  2. 在组件挂载后,inputRef.value 将指向 DOM 元素

  3. 只能在组件挂载后访问 ref 的值

2.2 在 v-for 中使用模板引用

html

<template><ul><li v-for="item in list" :key="item.id" ref="itemRefs">{{ item.text }}</li></ul>
</template><script setup>
import { ref, onMounted } from 'vue';const list = ref([{ id: 1, text: 'Item 1' },{ id: 2, text: 'Item 2' }
]);const itemRefs = ref([]);onMounted(() => {console.log(itemRefs.value); // 包含所有 li 元素的数组
});
</script>

注意: 在 v-for 中使用 ref 时,ref 的值将是一个包含所有元素的数组。

三、组件引用与 defineExpose

3.1 引用子组件

html

<!-- Parent.vue -->
<template><Child ref="childRef" />
</template><script setup>
import { ref, onMounted } from 'vue';
import Child from './Child.vue';const childRef = ref(null);onMounted(() => {console.log(childRef.value); // 子组件实例
});
</script>

3.2 使用 defineExpose 暴露组件方法

默认情况下,使用 <script setup> 的组件是封闭的,父组件无法访问子组件的任何内容。需要使用 defineExpose 显式暴露:

html

<!-- Child.vue -->
<script setup>
import { ref } from 'vue';const count = ref(0);function increment() {count.value++;
}// 暴露给父组件
defineExpose({increment,count
});
</script>

现在父组件可以访问这些暴露的内容:

javascript

// 在 Parent.vue 中
onMounted(() => {childRef.value.increment(); // 调用子组件方法console.log(childRef.value.count); // 访问子组件数据
});

3.3 defineExpose 的典型用途

  1. 暴露子组件方法供父组件调用

  2. 暴露子组件状态供父组件访问

  3. 创建可复用的组件逻辑(如表单验证、对话框控制等)

四、最佳实践

  1. 命名规范:使用有意义的 ref 名称,如 formRefmodalRef 等

  2. 避免过度使用:优先考虑 props/emit 进行组件通信

  3. null 检查:访问 ref 值前检查是否为 null

  4. 组合式函数:将 ref 逻辑封装到组合式函数中提高复用性

五、总结

  • ref 是 Vue3 响应式系统的核心 API 之一

  • 模板引用可以方便地访问 DOM 元素或组件实例

  • defineExpose 用于控制子组件向父组件暴露的内容

  • 合理使用这些特性可以创建更灵活、更易维护的组件

http://www.xdnf.cn/news/1315801.html

相关文章:

  • 安卓14系统应用收不到开机广播
  • 【Java后端】Spring Boot 集成 MyBatis-Plus 全攻略
  • 大模型算法岗面试准备经验分享
  • (机器学习)监督学习 vs 非监督学习
  • 智能制造——解读37页 案例分享灯塔工厂解决方案【附全文阅读】
  • 电子电气架构 --- 自动驾驶汽车的下一步发展是什么?
  • LeetCode 分类刷题:2962. 统计最大元素出现至少 K 次的子数组
  • 零墨云A4mini打印机设置电脑通过局域网络进行打印
  • 详解flink java基础(一)
  • Flink作业执行的第一步:DataFlow graph的构建
  • nodejs 错误处理
  • Gradle快速入门学习
  • 数据结构初阶(19)外排序·文件归并排序的实现
  • 机器学习案例——对好评和差评进行预测
  • error #include<cuda_runtime_api.h>解决方案
  • Java基础 8.17
  • 2023年全国研究生数学建模竞赛华为杯F题强对流降水临近预报求解全过程文档及程序
  • RAG 分块中表格填补简明示例:Markdown、HTML、Excel、Doc
  • 机器学习--数据清洗
  • 北京JAVA基础面试30天打卡12
  • STM32CUBEMX配置stm32工程
  • 五、redis入门 之 客户端连接redis
  • Go语言并发编程 ------ 临界区
  • 批次号规则
  • Mac(四)自定义按键工具 Hammerspoon 的安装和使用
  • FX10/20 (CYUSB401X)开发笔记5 固件架构
  • 基于DSP+ARM+FPGA架构的储能协调控制器解决方案,支持全国产化
  • 【完整源码+数据集+部署教程】无人机航拍视角洪水检测与受灾房屋识别图像分割救援指导系统源码和数据集:改进yolo11-DCNV2
  • Tomcat下载、安装及配置详细教程
  • STL 容器