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

Vue3中的标签 ref 与 defineExpose:模板引用与组件暴露


在Vue3中,ref 和 defineExpose 是两个重要的概念,分别用于模板引用(模板 ref)和组件暴露(组件 API)。
ref 不仅可以用于创建响应式数据,还可以用于获取 DOM 节点或组件实例。通过 ref,我们可以直接访问模板中的元素或组件,并在需要时操作它们。
defineExpose 用于在 <script setup> 语法中显式暴露组件的属性或方法

ref 在模板中有两种主要用途:
❶获取 DOM 节点:
当 ref 用在普通 DOM 标签上时,获取的是 DOM 节点
❷获取组件实例:
当 ref 用在组件标签上时,获取的是组件实例对象

1. 模板引用(Template Refs)
在Vue3中,你可以使用 ref 函数在模板中创建一个引用,然后通过这个引用来访问 DOM 元素或子组件实例。这在操作 DOM 或调用子组件的方法时非常有用。

使用 ref 在模板中创建引用
<template>
<div ref="myDiv">这是一个 div</div>
<MyComponent ref="myComponent" />
</template>

<script setup>
import { ref, onMounted } from 'vue';
import MyComponent from './MyComponent.vue';

const myDiv = ref(null);
const myComponent = ref(null);

onMounted(() => {
console.log(myDiv.value); // 访问 DOM 元素
console.log(myComponent.value); // 访问 MyComponent 实例
});
</script>

2. 组件暴露(Component Exposure)
默认情况下在 Vue3 组件内部的属性和方法是不开放给父组件访问的,可以通过 defineExpose 函数指定哪些属性和方法允许访问
在Vue3中,defineExpose 用于在 <script setup> 中明确指定哪些属性或方法应该被外部访问。这在组合式 API(Composition API)中尤其有用,特别是当你想要从父组件访问子组件的某些属性和方法时。

使用 defineExpose 暴露组件属性或方法
<template>
<div>这是一个子组件</div>
</template>

<script setup>
import { defineExpose } from 'vue';

const myMethod = () => {
console.log('Method called');
};

defineExpose({
myMethod // 暴露 myMethod 方法
});
</script>
结合使用模板引用和组件暴露的示例
假设你有一个父组件和一个子组件,你想从父组件中调用子组件的方法:

父组件

<template>
<ChildComponent ref="childRef" />
</template>

<script setup>
import { ref, onMounted } from 'vue';
import ChildComponent from './ChildComponent.vue';

const childRef = ref(null);

onMounted(() => {
if (childRef.value) {
childRef.value.myMethod(); // 调用子组件的方法
}
});
</script>
子组件(ChildComponent.vue)

<template>
<div>子组件</div>
</template>

<script setup>
import { defineExpose } from 'vue';

const myMethod = () => {
console.log('子组件方法被调用');
};

defineExpose({ myMethod }); // 暴露 myMethod 方法给父组件调用
</script>
通过这种方式,你可以在Vue3中灵活地使用模板引用和组件暴露来管理 DOM 元素和组件之间的交互。

http://www.dtcms.com/a/298330.html

相关文章:

  • 【STM32】CUBEMX下FreeRTOS 任务栈管理与栈溢出检测(CMSIS_V2接口)
  • 【软件工程】构建软件合规防护网:双阶段检查机制的实践之道
  • 双非上岸985!专业课140分经验!信号与系统考研专业课140+上岸中南大学,通信考研小马哥
  • LeetCode51~70题解
  • 多模态大模型研究每日简报(2025-07-24)
  • [硬件电路-85]:一款高集成度热电制冷器(TEC)控制器芯片ADN8835ACPZ
  • 深入解析 Vue.js 中的 `ref` 和 `shallowRef`:响应式编程的核心与优化实践
  • Web开发传参的四种常见方式介绍
  • 数据结构系列之哈希表
  • 无人机机体结构设计要点难点分析
  • 滚珠导轨:手术机器人与影像设备的精密支撑
  • 【AJAX】Promise详解
  • 202507亲测可用,剪映官方内测版本SVIP功能都可以用支持数字人和自动识别字幕
  • 基于讯飞星火AI的文学作品赏析系统开发实战:从通用聊天到专业文学分析的完整技术方案
  • Axios基本使用
  • JS逆向 - (国外)SHEIN站 - 请求头(armorToken、Anti-in)
  • 【05】C#入门到精通——C# 面向对象、类、静态变量static、类与类之间的调用
  • [SV]在 Verilog 中,对某个信号施加一个弱下拉,但又不能影响后续的正常驱动
  • CSS 盒子模型学习版的理解
  • 【论文阅读51】-CNN-LSTM-安全系数和失效概率预测
  • Multiscale Structure Guided Diffusion for Image Deblurring 论文阅读
  • 【论文阅读】-《GenAttack: Practical Black-box Attacks with Gradient-Free Optimization》
  • 零售收银系统开源代码全解析:连锁门店一体化解决方案(含POS+进销存+商城)
  • 深入理解 Linux 进程信号
  • Linux 桌面市场份额突破 5%:开源生态的里程碑与未来启示
  • [MMU]四级页表查找(table walk)的流程
  • 流式接口,断点续传解决方案及实现
  • 前端核心进阶:从原理到手写Promise、防抖节流与深拷贝
  • iOS 抓包工具有哪些?模块化功能解析与选型思路
  • 容器化环境下的服务器性能瓶颈与优化策略