当前位置: 首页 > 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.lryc.cn/news/599693.html

相关文章:

  • 【Linux网络编程】传输层协议 - TCP
  • 图论水题日记
  • Qt 网络编程进阶:WebSocket 通信
  • vue - 使用canvas绘制验证码
  • 容器化环境下的服务器性能瓶颈与优化策略
  • Linux 中 `chown`、`chgrp` 和 `chmod` 命令详解
  • MRDIMM对服务器总体拥有成本(TCO)影响的系统性分析
  • openmv识别数字
  • 8.异常处理:优雅地处理错误
  • java面试题(二)
  • Java面试题及详细答案120道之(001-020)
  • [Rust 基础课程]猜数字游戏-获取用户输入并打印
  • 不用电脑要不要关机?
  • 【Spring WebFlux】为什么 Spring 要拥抱响应式
  • OT82111_VC1:USB OTG音频解码器固件技术解析
  • c++注意点(12)----设计模式(生成器)
  • Promise的allSettled,all,race
  • 智能网关:物联网时代的核心枢纽
  • 在OpenMP中,#pragma omp的使用
  • 【Linux/Ubuntu】VIM指令大全
  • 如何搭建Linux环境下的flink本地集群
  • 为什么选择EasyGBS?
  • 《解锁前端数据持久化与高效查询:IndexedDB深度剖析》
  • vue3单页面连接多个websocket并实现断线重连功能
  • TDengine 转化函数 TO_TIMESTAMP 用户手册
  • 比特币技术简史 第八章:扩展性解决方案 - 闪电网络与隔离见证
  • 软件工程:软件需求
  • Ethereum:告别 personal API,拥抱 Geth 的独立签名器 Clef
  • CRM 系统:实现商机全流程管理的关键
  • Mkdocs相关插件推荐(原创+合作)