前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >详细分析 Vue3 中的 `defineExpose`(附 Demo)

详细分析 Vue3 中的 `defineExpose`(附 Demo)

作者头像
默 语
发布于 2025-05-21 07:35:28
发布于 2025-05-21 07:35:28
25400
代码可运行
举报
文章被收录于专栏:JAVAJAVA
运行总次数:0
代码可运行

详细分析 Vue3 中的 defineExpose(附 Demo)

摘要

defineExpose 是 Vue3 中提供的一项 Composition API,用于暴露组件内部的数据或方法给外部使用。这一特性在开发复杂组件时尤为重要,可以使组件间的交互更灵活,同时保持模块化和封装性。本文将从基础概念、代码示例到实际应用,手把手带你深入理解 defineExpose 的功能及其在项目中的实战场景。


引言

在 Vue3 中,开发者使用 <script setup> 可以更简洁地编写组件。然而,默认情况下,<script setup> 定义的变量、函数和数据是无法直接被父组件访问的。如果需要让父组件访问子组件的某些方法或数据,就需要用到 defineExpose

本文将带你了解:

  • defineExpose 的基本原理
  • 如何通过示例掌握其用法
  • 实际场景中如何灵活使用 defineExpose

正文

1. 什么是 defineExpose

defineExpose 是 Vue3 的一个工具函数,它允许开发者显式地暴露子组件内部的方法或数据供父组件使用。

  • 默认情况下,<script setup> 中定义的变量是私有的,无法从父组件访问。
  • 使用 defineExpose 可以打破这一限制,将需要暴露的内容通过指定的接口开放给父组件。

核心语法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
defineExpose({
  exposedMethodOrDataName
});

2. 基础用法和 Demo
2.1 基础用法:暴露函数

子组件代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div>
    <h2>子组件</h2>
    <p>{{ message }}</p>
  </div>
</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>

父组件代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div>
    <h1>父组件</h1>
    <ChildComponent ref="childRef" />
    <button @click="callChildMethod">调用子组件方法</button>
  </div>
</template>

<script>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';

export default {
  components: { ChildComponent },
  setup() {
    const childRef = ref(null);

    function callChildMethod() {
      // 通过 ref 调用子组件暴露的方法
      console.log(childRef.value.message); // 输出子组件的 message
      childRef.value.childMethod(); // 调用子组件的函数
    }

    return {
      childRef,
      callChildMethod
    };
  }
};
</script>

运行结果: 点击按钮后,浏览器控制台会输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Hello from Child Component
子组件方法被调用!

3. 实战:深度使用 defineExpose
3.1 暴露函数

在子组件中暴露一个操作方法,比如清空表单数据:

子组件代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <form>
    <input v-model="formData.name" placeholder="请输入姓名" />
    <input v-model="formData.email" placeholder="请输入邮箱" />
  </form>
</template>

<script setup>
import { reactive } from 'vue';

const formData = reactive({
  name: '',
  email: ''
});

function resetForm() {
  formData.name = '';
  formData.email = '';
}

defineExpose({
  resetForm
});
</script>

父组件代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div>
    <ChildComponent ref="formRef" />
    <button @click="clearForm">清空表单</button>
  </div>
</template>

<script>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';

export default {
  components: { ChildComponent },
  setup() {
    const formRef = ref(null);

    function clearForm() {
      formRef.value.resetForm(); // 调用子组件的 resetForm 方法
    }

    return {
      formRef,
      clearForm
    };
  }
};
</script>
3.2 导入子组件的数据

在某些情况下,父组件可能需要直接访问子组件的状态数据(例如进度条的状态):

子组件代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div>当前进度:{{ progress }}%</div>
</template>

<script setup>
import { ref } from 'vue';

const progress = ref(50);

defineExpose({
  progress
});
</script>

父组件代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div>
    <ChildComponent ref="progressRef" />
    <button @click="logProgress">查看进度</button>
  </div>
</template>

<script>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';

export default {
  components: { ChildComponent },
  setup() {
    const progressRef = ref(null);

    function logProgress() {
      console.log(`子组件进度:${progressRef.value.progress}%`);
    }

    return {
      progressRef,
      logProgress
    };
  }
};
</script>

运行结果: 点击按钮后,控制台显示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
子组件进度:50%

3.3 更新子表单数据

假设父组件需要向子组件动态传递表单数据,同时允许子组件暴露更新表单的方法:

子组件代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div>
    <p>表单数据:{{ formData }}</p>
  </div>
</template>

<script setup>
import { reactive } from 'vue';

const formData = reactive({
  username: '',
  password: ''
});

function updateFormData(newData) {
  Object.assign(formData, newData);
}

defineExpose({
  formData,
  updateFormData
});
</script>

父组件代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div>
    <ChildComponent ref="formRef" />
    <button @click="updateForm">更新表单</button>
  </div>
</template>

<script>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';

export default {
  components: { ChildComponent },
  setup() {
    const formRef = ref(null);

    function updateForm() {
      formRef.value.updateFormData({ username: '默语', password: '123456' });
    }

    return {
      formRef,
      updateForm
    };
  }
};
</script>

总结

通过本文的介绍,你应该已经对 Vue3 中的 defineExpose 有了全面的了解。它提供了一种灵活的方式,让父组件能够安全访问子组件的内部逻辑和状态,极大提高了组件间的协作性和可扩展性。在实际项目中,合理使用 defineExpose 可以让你的代码更加清晰和模块化。

参考资料

  1. Vue3 官方文档
  2. Composition API 深入解析
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
在Vue2 和 Vue3 中 props 用法区别:Vue 中页面之间的传值方法有哪些?
在前端开发中,props 是 Vue 框架中非常常见的一种传值方式,它帮助父组件将数据传递给子组件,极大地简化了组件之间的通信。在 Vue2 和 Vue3 的版本更新中,props 的使用方法有了一些细微的差异。今天,我们就来深入探讨一下 Vue2 和 Vue3 中 props 的用法区别,以及在 Vue 中页面之间的其他传值方法。
猫头虎
2025/06/01
1630
在Vue2 和 Vue3 中 props 用法区别:Vue 中页面之间的传值方法有哪些?
Vue2到Vue3,重学这5个常用的API
距离Vue3发布已经过去一年多时间了,从Vue2到Vue3是一个不小的升级,包括周边生态等。
玄姐谈AGI
2023/01/10
9170
Vue2到Vue3,重学这5个常用的API
详细分析 Vue3 中的 props 用法,Vue 中页面之间的传值方法有哪些?
在 Vue3 的开发中,props 是父组件与子组件之间通信的核心机制,主要用于父组件向子组件传递数据。虽然看起来简单,但 props 在实际项目中涉及多种场景和细节。本文将从基础到进阶,详细讲解 props 的使用方法,并提供代码示例和实战案例,帮助小白开发者轻松上手 Vue3 的 props。
默 语
2025/05/21
4180
一文掌握Vue3的组件&组件通信
在前端开发中,组件化就是“搭积木”——将页面功能拆分成一个个可复用的“积木块”,然后自由组合,快速搭建出各种炫酷的页面。
方才编程_公众号同名
2024/11/19
2440
一文掌握Vue3的组件&组件通信
Vue3父子组件通信
子组件 <template> <h1 @click="childClick">{{ title }}</h1> <button @click="updateFunc">修改父组件传递的值</button> </template> <script setup> import { defineProps, defineEmits, defineExpose } from "vue" defineProps({ //定义子组件需要接收的值 title: { typ
明知山
2021/10/21
1.4K0
vue3 provide与inject(一)
在Vue 3中,provide和inject是一对用于父组件向子组件传递数据的高级选项。provide用于在父组件中定义要传递的数据,而inject用于在子组件中接收这些数据。它们提供了一种跨组件层次进行数据传递的方式,方便在组件之间共享数据。
堕落飞鸟
2023/05/22
3410
vue3的setup还能这么用?
接收一个props和context函数并且将setup内的内容通过return暴露给组件的其余部分。
inline705
2021/12/09
1.1K0
vue3的setup还能这么用?
7个 Vue3 中的组件通信方式
本文采用<script setup />的编写方式,比options API更自由。然后我们会讲以下七种组件通信方式:
唐志远
2022/10/27
7590
7个 Vue3 中的组件通信方式
【Vuejs】1732- 详细聊一聊 Vue3 依赖注入
在 Vue.js 中,依赖注入[1](DI)是一种非常常见的跨组件传递数据的方法,它可以帮助我们更好地管理组件之间的依赖关系。本文将介绍 Vue3 中的依赖注入机制,包括 provide() 和 inject() 函数的使用方法、使用注意以及优缺点和适用场景等方面的内容。
pingan8787
2023/09/01
8710
【Vuejs】1732- 详细聊一聊 Vue3 依赖注入
Vue3 过10种组件通讯方式
众所周知,Vue.js 中一个很重要的知识点是组件通信,不管是业务类的开发还是组件库开发,都有各自的通讯方法。
德育处主任
2022/04/17
2K0
Vue3 过10种组件通讯方式
Vue 3 父子组件互调方法 - setup 语法糖写法
使用 <script setup> 的组件是默认关闭的,也即通过模板 ref 或者 $parent 链获取到的组件的公开实例,不会暴露任何在 <script setup> 中声明的绑定。
訾博ZiBo
2025/01/06
4340
Vue 3 父子组件互调方法 - setup 语法糖写法
全解Vue2的组件通信方式方法
在阅读这篇文章前,推荐一篇“好”文章:Spring MVC:从入门到精通 这篇文章系统全面、实例丰富、深入浅出、步凑详细,是学习Spring MVC的绝佳选择,建议大家阅读。
用户3985749
2024/12/04
2060
【Vuejs】1286- 分享 15 个 Vue3 全家桶开发的避坑经验
最近入门 Vue3 并完成 3 个项目,遇到问题蛮多的,今天就花点时间整理一下,和大家分享 15 个比较常见的问题,基本都贴出对应文档地址,还请多看文档~ 已经完成的 3 个项目基本都是使用 Vue3 (setup-script 模式)全家桶开发,因此主要分几个方面总结:
pingan8787
2022/04/14
6.5K0
【Vuejs】1286- 分享 15 个 Vue3 全家桶开发的避坑经验
Vue & Element
Vue 是一套前端框架,免除原生 JavaScript 中的 DOM 操作,简化书写。Vue 基于 MVVM(Model-View-View-Model) 思想,实现数据的双向绑定,将编程的关注点放在数据上。
小简
2023/01/04
5.7K0
Vue & Element
Vue 组件间通信的几种方式
Vue 遵循单向数据流的原则,状态会从父组件传递给子组件,避免子组件意外改变父组件状态导致的混乱逻辑。
前端西瓜哥
2022/12/21
2K0
Vue3从入门到精通(二)
在Vue3中,侦听器的使用方式与Vue2相同,可以使用watch选项或$watch方法来创建侦听器。不同之处在于,Vue3中取消了immediate选项,同时提供了新的选项和API。
明志德道
2023/10/21
5000
Vue3组件通信相关的知识梳理
我们知道vue3的Composition Api是它几个最大亮点之一,所以下文都是在setup中演示代码的实现。后面会以开发几个简单form组件为例子来演示。
前端达人
2021/08/10
3.7K0
Vue3组件通信相关的知识梳理
使用 Vue 3 进行组件间通信的完整指南
在阅读这篇文章前,推荐一篇“好”文章:深入浅出JVM(十四)之内存溢出、泄漏与引用原创 这篇文章深入剖析、独到见解、为JAVA开发的内存泄漏问题的解决听过了新的一种思路和综合的方法。
用户3985749
2024/11/28
5910
Vue3, setup语法糖、Composition API全方位解读
支持绑定多个v-model,v-model 是 v-model:modelValue 的简写
yyds2026
2022/09/26
3.2K0
VUE3全家桶精讲
有 <script setup> 之前,如果要定义 props, emits 可以轻而易举地添加一个与 setup 平级的属性。
HelloWorldZ
2024/03/20
2960
VUE3全家桶精讲
相关推荐
在Vue2 和 Vue3 中 props 用法区别:Vue 中页面之间的传值方法有哪些?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验