Vue3 中的 defineExpose 完全指南

文章目录

defineExposeVue3 组合式 API <script setup> 中的专用编译宏,核心作用 :在 <script setup> 语法糖下,主动暴露组件的属性和方法 ,让父组件可以通过 ref / $parent 访问子组件的成员。

关键背景(必看)

在普通的 Vue3 选项式 API 中,组件的属性和方法默认会暴露给父组件;

但在 <script setup> 语法糖下,组件默认是封闭的 ,所有变量、方法都不会自动暴露,父组件无法直接访问。

这就是 defineExpose 存在的意义。


一、基础用法

1. 子组件(暴露内容)

vue 复制代码
<!-- Child.vue -->
<script setup>
import { ref } from 'vue'

// 子组件内部数据
const count = ref(0)
// 子组件内部方法
const addCount = () => {
  count.value++
}

// 核心:使用 defineExpose 暴露属性/方法
defineExpose({
  count,
  addCount
})
</script>

<template>
  <div>子组件计数:{{ count }}</div>
</template>

2. 父组件(访问子组件)

通过 ref 获取子组件实例,调用暴露的方法/访问属性:

vue 复制代码
<!-- Parent.vue -->
<script setup>
import { ref } from 'vue'
import Child from './Child.vue'

// 获取子组件 DOM 实例
const childRef = ref(null)

// 调用子组件暴露的方法
const triggerChild = () => {
  // 访问子组件数据
  console.log('子组件count:', childRef.value.count)
  // 调用子组件方法
  childRef.value.addCount()
}
</script>

<template>
  <Child ref="childRef" />
  <button @click="triggerChild">调用子组件方法</button>
</template>

二、核心特性

  1. 无需导入defineExpose 是编译宏,直接使用,不需要从 vue 中导入
  2. 精准暴露:只暴露你写在对象里的成员,未暴露的内容完全私有
  3. TS 支持:可以配合类型注解,提供类型提示
  4. 仅适用于 <script setup>:普通选项式 API 不需要它

三、TypeScript 写法

vue 复制代码
<script setup lang="ts">
import { ref } from 'vue'

const count = ref<number>(0)
const addCount = () => count.value++

// 带类型的暴露
defineExpose<{
  count: number
  addCount: () => void
}>()
</script>

四、常见使用场景

  1. 父组件主动调用子组件的方法(如表单重置、弹窗关闭、列表刷新)
  2. 父组件获取子组件的响应式数据
  3. 封装公共组件时,提供对外调用的 API

五、注意事项

  1. 不要过度暴露:只暴露必要的成员,保持组件封装性
  2. 挂载后才能访问 :父组件必须在组件挂载完成后 (如 onMounted)才能访问子组件实例
  3. 与 defineProps / defineEmits 区分
    • defineProps:父 → 子 传值
    • defineEmits:子 → 父 触发事件
    • defineExpose:父 → 子 主动调用成员

六、总结

  1. <script setup> 组件默认封闭,必须用 defineExpose 暴露成员
  2. 语法:defineExpose({ 变量, 方法 })
  3. 父组件通过 ref 获取子组件实例,访问暴露的内容
  4. 仅用于组合式 API <script setup>,是组件通信的补充方案
相关推荐
Setsuna_F_Seiei5 小时前
前端转型 Agent 开发 05 之 Agent Hooks 与 Checkpointer(让 Agent 从全自动转变人为可掌控)
前端·agent·ai编程
百万蹄蹄向前冲7 小时前
风扇转了一晚上MVP专家团翻车事故
前端·人工智能
默_笙7 小时前
🏛 给 AI 配一间办公室:Harness Engineering 六大模块与它的实现
前端·javascript
linux_cfan8 小时前
videojs v10 源代码系列解读:14 · 谓词守卫:在运行时安全地调用能力
前端·javascript·音视频
kyriewen9 小时前
我扒了 10,221 条 JD:腾讯技术岗 75% 在要 AI
前端·人工智能·ai编程
郑州光合科技余经理9 小时前
同城外卖小程序开发:下单成功后,后台导出能不能对上用户端状态
开发语言·前端·git·后端·uni-app·php·ai编程
+VX:Fegn089510 小时前
计算机毕业设计|基于springboot + vue旅游管理系统(源码+数据库+文档)
java·开发语言·vue.js·spring boot·课程设计
雪芽蓝域zzs10 小时前
第 7 章:双 Y 轴组合图(柱状 + 折线,看板高频场景)
vue.js·echars
IT_陈寒10 小时前
Vue的响应式让我熬到凌晨三点,原来漏了这个小细节
前端·人工智能·后端
一 乐10 小时前
二手交易平台|基于springboot + vue二手交易平台(源码+数据库+文档)
java·数据库·vue.js·spring boot·小程序