vue3 defineExpose 如何在父组件用ref调用子组件的方法

本文介绍了在Vue3中使用setup语法糖后,父组件如何通过ref来调用子组件的方法。在setup语法中,需要使用defineExpose暴露子组件的方法,然后父组件可以通过ref获取并调用这些方法。文中给出了具体的代码示例,展示了在不同场景下如何实现这一操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

vue3使用 setup 语法糖后如何在父组件用ref调用子组件的方法

什么是setup语法糖

  1. 更少的样板内容,更简洁的代码。
  2. 能够使用纯 Typescript 声明 props 和抛出事件。
  3. 更好的运行时性能 (其模板会被编译成与其同一作用域的渲染函数,没有任何的中间代理)。
//要使用这个语法,需要将 setup attribute 添加到 <script> 代码块上:
<script setup>
console.log('hello script setup')
//里面的代码会被编译成组件 setup() 函数的内容。这意味着与普通的 <script> 只在组件被首次引入的时候执行一次不同,<script setup> 中的代码会在每次组件实例被创建的时候执行。
</script>

当我们的组件使用这种语法时,是不可以用setup()这种语法的写法获取子组件的数据或方法
为了在 script setup 组件中明确要暴露出去的属性,使用 defineExpose 编译器宏:

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

const a = 1
const b = ref(2)

defineExpose({
   
  a,
  b
})
//当父组件通过模板 ref 的方式获取到当前组件的实例,获取到的实例会像这样 { a: number, b: number } (ref 会和在普通实例中一样被自动解包)

<<
### Vue 3父组件通过 Ref 调用子组件方法Vue 3 组合式 API 下,`defineExpose` 可用于控制暴露给父组件的内容。这使得父组件可以通过 `ref` 访问特定的属性或方法。 #### 使用 `defineExpose` 为了使父组件能够访问子组件内部定义的方法,在子组件中需显式声明要暴露出去的对象。默认情况下,除了由 `setup()` 返回的对象外的一切都不会被公开[^1]。 ```javascript // ChildComponent.vue import { defineComponent, ref } from &#39;vue&#39;; export default defineComponent({ name: "ChildComponent", setup() { const childMethod = () => { console.log(&#39;This is called from parent&#39;); }; // Expose only the methods or properties you want to be accessible by the parent component. return { ..., childMethod }; // Alternatively using defineExpose for better clarity and control over what gets exposed defineExpose({childMethod}); } }) ``` #### 父组件调用子组件方法 一旦子组件指定了哪些部分可以被外界访问,则可以在父级模板里利用 `ref` 属性来创建对该实例的一个引用,并随后在其上执行这些已公布的操作[^2]。 ```html <!-- ParentComponent.vue --> <template> <div class="parent"> <!-- Assigning reference to child component instance --> <ChildComponent ref="myChild"/> <button @click="callChildMethod">Call Child Method</button> </div> </template> <script lang="ts"> import { onMounted, ref as createRef } from &#39;vue&#39;; import ChildComponent from &#39;./components/ChildComponent.vue&#39;; export default { components: { ChildComponent }, setup() { let myChild = createRef(); function callChildMethod(){ if(myChild.value){ myChild.value.childMethod(); } } onMounted(() => {}); return { myChild, callChildMethod }; } }; </script> ``` 上述代码展示了如何在一个简单的按钮点击事件处理器内调用了来自 `<ChildComponent>` 的函数。注意这里假设已经正确设置了 TypeScript 支持;如果是纯 JavaScript 开发环境则不需要指定类型。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

都挺好,刚刚好

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值