vue3 - defineExpose暴露给父组件属性和方法

在 Vue 3 中,defineExpose 是一个 Composition API 提供的功能,用于自定义组件实例暴露给父组件的属性和方法。

默认情况下,当使用 setup 语法糖时,组件内部的状态(如响应式变量、方法等)不会直接暴露给父组件。defineExpose 允许你明确指定哪些属性或方法可以被父组件访问。

使用场景

当你需要在父组件中通过 ref 或 template ref 访问子组件的特定属性或方法时。当你希望控制暴露给父组件的内容,避免将整个组件实例暴露出去,从而减少不必要的耦合。

假设你有一个子组件 ChildComponent.vue,你想暴露其中的一个方法 doSomething 给父组件使用,如下:

子组件(ChildComponent.vue)

js 复制代码
<template>
  <div>这是一个子组件</div>
</template>

<script setup>
import { defineExpose } from 'vue'

// 定义一个方法
const doSomething = () => {
  console.log('Doing something...')
}

// 使用 defineExpose 暴露方法
defineExpose({
  doSomething
})
</script>

父组件(ParentComponent.vue)

js 复制代码
<template>
  <div>
    <h1>这是父组件</h1>
    <ChildComponent ref="childRef" />
    <button @click="callChildMethod">调用子组件的方法</button>
  </div>
</template>

<script setup>
import { ref, onMounted } from 'vue'
import ChildComponent from './ChildComponent.vue'

// 创建一个 ref 来引用子组件
const childRef = ref(null)

// 在按钮点击时调用子组件的方法
const callChildMethod = () => {
  if (childRef.value) {
    childRef.value.doSomething()
  }
}

// 可以在 onMounted 中检查是否成功引用了子组件
onMounted(() => {
  console.log(childRef.value) // 应该输出子组件实例
})
</script>

注意

defineExpose 仅在使用 <script setup> 语法时有效。避免过度暴露:只暴露必要的属性和方法,以保持组件之间的松耦合。


👉点击进入 我的网站

相关推荐
子兮曰3 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰3 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万3 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝3 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
A黄俊辉A3 天前
uniapp webview中实现 app和内嵌的H5双向通信
vue.js·json
三十而立洋3 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁3 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄3 天前
JavaScript 隐式全局变量解析
javascript
honkun63 天前
vue 表格组件 vxe-table 配置 ajax 请求自动加载数据与表单查询
vue.js·vxe-table
kybs19913 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net