vue3 defineExpose的使用及应用场景分析

 更新时间:2025年06月20日 09:46:10   作者:我在北京coding  
Vue3中defineExpose用于向父组件暴露子组件的属性和方法,尤其在script setup语法中,需显式声明以实现组件间交互,可控制暴露内容,避免过度暴露,同时注意响应式数据解包与测试影响,本文给大家介绍vue3 defineExpose的使用,感兴趣的朋友一起看看吧

子组件

//子组价
<template>
	<view class="box">子组件num值:{{num}}</view>
</template>
<script setup>
	import {ref} from "vue";
	const num=ref(100);
    const fn = ()=>{
     console.log('我是方法');
    }
	defineExpose({
		num,
        fn
	})
</script>

父组件

//父组价
<template>
	<view>
		<child-defineExpose ref="child"></child-defineExpose>
	</view>
</template>
<script setup>
	import {onMounted, ref} from "vue";
	const child=ref(null);
	onMounted(()=>{
		console.log(child.value.num,child.value.fn())
	})
</script>

简介:

在 Vue 3 的组合式 API 中,defineExpose 是一个用于向父组件暴露内部属性和方法的宏。这在使用 <script setup> 语法时特别有用,因为默认情况下,使用 <script setup> 的组件是封闭的,即父组件无法访问子组件的内部状态。通过 defineExpose,你可以选择性地暴露需要被外部访问的属性或方法。

关键点说明

  • 仅暴露显式声明的属性

    • 未在 defineExpose 中列出的属性和方法对父组件不可见。
    • 例如,上面的 message 属性未被暴露,父组件无法访问。
  • 类型支持(TypeScript)

可以通过泛型参数为暴露的属性和方法提供类型定义:

typescript

defineExpose<{
  count: number;
  increment: () => void;
}>();
  • 与非 <script setup> 组件的区别

    • 在普通的 export default 组件中,直接通过 this 暴露属性和方法,无需 defineExpose

应用场景

  • 父组件需要控制子组件的状态(如获取表单组件的值、触发子组件的动画)。
  • 封装可复用组件时,明确暴露可被外部调用的 API。

注意事项

  • 避免过度暴露:仅暴露真正需要被外部访问的属性和方法,保持组件的封装性。
  • 响应式问题:暴露的 ref 在父组件中访问时会自动解包(即直接访问 .value)。
  • 测试考量:过度依赖组件间的直接引用可能导致测试困难,优先考虑通过事件或状态管理共享数据。

通过 defineExpose,你可以在保持 Vue 3 组合式 API 简洁性的同时,灵活地实现组件间的交互。

到此这篇关于vue3 defineExpose的使用的文章就介绍到这了,更多相关vue3 defineExpose使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue.extend实现挂载到实例上的方法

    Vue.extend实现挂载到实例上的方法

    这篇文章主要介绍了Vue.extend实现挂载到实例上的方法,结合实例形式分析了Vue.extend实现挂载到实例上的具体操作步骤与相关实现技巧,需要的朋友可以参考下
    2019-05-05
  • Vue作用域插槽实现方法及作用详解

    Vue作用域插槽实现方法及作用详解

    这篇文章主要介绍了Vue作用域插槽实现方法及作用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • 使用Vue-scroller页面input框不能触发滑动的问题及解决方法

    使用Vue-scroller页面input框不能触发滑动的问题及解决方法

    这篇文章主要介绍了使用Vue-scroller页面input框不能触发滑动的问题,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Vue2.0点击切换类名改变样式的方法

    Vue2.0点击切换类名改变样式的方法

    今天小编就为大家分享一篇Vue2.0点击切换类名改变样式的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • vue项目初始化过程中错误总结

    vue项目初始化过程中错误总结

    在Vue.js项目初始化和构建过程中,可能会遇到多种问题,首先,npm install过程中报错,如提示“No such file or directory”,建议删除package-lock.json文件后重新安装,在build或run时,若出现core-js相关错误
    2024-09-09
  • vue 使用 canvas 实现手写电子签名

    vue 使用 canvas 实现手写电子签名

    这篇文章主要介绍了vue 使用 canvas 实现手写电子签名功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • Vue3属性值传递defineProps详解

    Vue3属性值传递defineProps详解

    在Vue3中,defineProps()函数是定义和接收组件属性的主要方式,通过简单定义或对象定义,开发者可以灵活地接收并处理组件上的属性值,简单定义方式通过数组传递属性名,而对象定义则可以约束属性的数据类型、默认值及是否必须传递等
    2024-09-09
  • vue实现树状表格效果

    vue实现树状表格效果

    这篇文章主要为大家详细介绍了vue实现树状表格效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • Vue3实现动态高度的虚拟滚动列表的示例代码

    Vue3实现动态高度的虚拟滚动列表的示例代码

    虚拟滚动列表是一种优化长列表渲染性能的技术,通过只渲染可视区域内的列表项,减少DOM的渲染数量,本文就来介绍一下Vue3实现动态高度的虚拟滚动列表的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2025-01-01
  • vue中使用vue-cli接入融云实现即时通信

    vue中使用vue-cli接入融云实现即时通信

    这篇文章主要介绍了vue中使用vue-cli接入融云实现即时通信的相关资料,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-04-04

最新评论