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

【vue3】 defineExpose 的使用

以下是 Vue3 中defineExpose的使用方法:

基本概念

defineExpose是 Vue3 中的一个工具函数,是仅能在<script setup>中使用的函数,用于显式暴露组件内部的属性或方法给父组件使用2。在 Vue3 的<script setup>中,组件的状态和方法默认是私有的,父组件即使通过ref引用子组件实例,也无法访问其中的内容,使用defineExpose可以打破这一限制.

基本用法

defineExpose的基本语法是defineExpose(exposedObject)。其中,exposedObject是一个对象,用于定义要暴露的属性或方法

示例

  • 暴露函数
<!-- 子组件ChildComponent.vue -->
<template><h2>子组件</h2>
</template>
<script setup>
import { ref } from 'vue';
const message = ref('Hello from Child Component');
// 定义一个供父组件调用的函数
function childMethod() {console.log('子组件方法被调用!');
}
// 使用defineExpose暴露message和childMethod
defineExpose({message,childMethod
});
</script>
<!-- 父组件 -->
<template><h1>父组件</h1><ChildComponent ref="childRef" /><button @click="callChildMethod">调用子组件方法</button>
</template>
<script setup>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';
const childRef = ref(null);
function callChildMethod() {// 通过ref调用子组件暴露的方法console.log(childRef.value.message);childRef.value.childMethod();
}
</script>
  • 暴露数据
<!-- 子组件 -->
<script setup>
import { ref } from 'vue';
// 子组件内部的状态和方法
const count = ref(0);
// 通过defineExpose暴露给父组件
defineExpose({count
});
</script>
<template><p>计数器子组件:{{ count }}</p>
</template>
<!-- 父组件 -->
<script setup>
import { ref } from 'vue';
import Counter from './Counter.vue';
// 通过ref获取子组件实例
const counterRef = ref(null);
function callChildMethod() {console.log('子组件计数值:', counterRef.value.count);
}
</script>
<template><Counter ref="counterRef" /><button @click="callChildMethod">获取子组件计数值</button>
</template>

注意事项

  • defineExpose应该放在<script setup>的末尾,因为任何在它之后声明的变量或函数都不会被自动包含在暴露的对象中4。
  • 当组件中包含<script setup>和普通<script>时,<script>中定义的数据和方法不会被暴露

<template><!-- 组件模板 -->
</template><script setup>import { ref, onMounted } from 'vue';// 这些内容会被 expose 出去const count = ref(0);function increment() {count.value++;}// 定义暴露出去的 APIdefineExpose({count,increment});// 这个函数不会被 expose 出去,因为它在 defineExpose 调用之后定义function decrement() {count.value--;}
</script>
http://www.lryc.cn/news/521163.html

相关文章:

  • 思维转换:突破思维桎梏,创造更高效的工作与生活
  • OpenCV相机标定与3D重建(55)通用解决 PnP 问题函数solvePnPGeneric()的使用
  • vue3学习日记5 - 项目起步
  • java导出pdf文件
  • 【MySQL学习笔记】MySQL视图View
  • 从玩具到工业控制--51单片机的跨界传奇【2】
  • 【Redis】初识Redis
  • docker虚拟机平台未启用问题
  • 《零基础Go语言算法实战》【题目 2-22】Go 调度器优先调度问题
  • 关于使用FastGPT 摸索的QA
  • 关于H5复制ios没有效果
  • 【STM32-学习笔记-3-】TIM定时器
  • EMS专题 | 守护数据安全:数据中心和服务器机房环境温湿度监测
  • Vue JavaScript 小写数字金额转换成大写汉字(附编程思路)
  • 【自动化测试】—— Appium安装配置保姆教程(图文详解)
  • 贪心算法详细讲解(沉淀中)
  • RabbitMQ中有哪几种交换机类型?
  • STM32特殊功能引脚详解文章·STM32特殊功能引脚能当作GPIO使用嘛详解!!!
  • Qt QComboBox的QSS美化
  • 计算机视觉算法实战——实时车辆检测和分类(主页有相关源码)
  • what?ngify 比 axios 更好用,更强大?
  • 安装虚拟机VMware遇到的问题
  • 通过ESP32和INMP441麦克风模块实现音频数据传递
  • Vue中nextTick实现原理
  • 数据仓库基础常见面试题
  • Java设计模式——单例模式(特性、各种实现、懒汉式、饿汉式、内部类实现、枚举方式、双重校验+锁)
  • 数字普惠金融对新质生产力的影响研究(2015-2023年)
  • 国产编辑器EverEdit - 扩展脚本:新建同类型文件(避免编程学习者反复新建保存练习文件)
  • jupyter notebook练手项目:线性回归——学习时间与成绩的关系
  • dockerfile2.0