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

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.xdnf.cn/news/16383.html

相关文章:

  • Java零基础入门学习知识点2-JDK安装配置+Maven
  • vue3 组件生命周期,watch和computed
  • 【ResNet50图像分类部署至RK3588】模型训练→转换RKNN→开发板部署
  • Agent领域,近年来的前沿研究方向:多智能体协作、认知启发架构、伦理安全、边缘计算集成
  • 《计算机组成原理与汇编语言程序设计》实验报告一 基本数字逻辑及汉字显示
  • Avalonia 发布完cv到Linux上运行 出现字体丢失/不显示问题
  • 【C++详解】模板进阶 非类型模板参数,函数模板特化,类模板全特化、偏特化,模板分离编译
  • 【第十二篇】 SpringBoot定时任务
  • 详解FreeRTOS开发过程(八)-- 时间标志
  • HyperWorks教程:HyperWorks助力精准打造游艇的设计
  • SIP广播对讲系统:构建高效智能的语音通信网络
  • 一道检验编码能力的字符串的题目
  • Vue2-VueRouter
  • 刷题日记0725
  • Python,仿生计算新前沿:Python实现进化-强化学习混合算法
  • php语法--foreach和in_array的使用
  • HttpServletRequest知识点
  • 线性代数 下
  • Oracle转Mysql建表脚本
  • RocketMQ常见问题梳理
  • IDM:registered with a fake serial number
  • 【JavaEE】Spring Web MVC(上)
  • NineData 数据库 DevOps 全面支持 GaussDB,国产化管理再升级!
  • Canal 1.1.7的安装
  • 焊接机器人节能先锋
  • Kafka——多线程开发消费者实例
  • 华为云DRS实现Oracle到GaussDB数据库迁移的全流程技术方案
  • 配置Mac/Linux终端启动执行脚本
  • 【小沐学GIS】基于Unity3d绘制三维数字地球Earth(Unity3d、OpenGL、GIS)
  • Linux 网络与 Vim 编辑器操作