vue3组合式api父组件调用子组件xxx is not a function

1.第一步在子组件(Son.vue)中写一个方法showModal ,用于显示弹窗

<template>
      <el-dialog
        title="我是子组件"
        v-model="connectVisible"
        width="60%"
        append-to-body
        :close-on-click-modal="false"
      >
        <p>好羞耻啊 我被打开了</p>
      </el-dialog>
</template>

<script setup>
import { ref } from "vue";
const connectVisible = ref(false);
/**
* 子组件中定义的方法
*/
const showModal = () => {
    connectVisible.value = true;
};
</script>

<style lang="scss" scoped>
</style>

2.在父组件中引入子组件

<template>
     <el-button type="primary" @click="openSon">打开子组件</el-button>
     <Son ref="sonRef">
</template>

<script setup>
import { ref } from "vue";
import Son from "./Son"

const sonRef= ref(null);

const openSon = () => {
    openSon.value.showModal()
}

</script>

<style lang="scss" scoped>

</style>

注意:这个时候我们以为大功告成了,但是却发生了错误xxx.showModal is not a function

3. 在子组件中使用defineExpose()暴露方法

以下是vue官网的解释

使用 <script setup> 的组件是默认关闭的——即通过模板引用或者 $parent 链获取到的组件的公开实例,不会暴露任何在 <script setup> 中声明的绑定。

可以通过 defineExpose 编译器宏来显式指定在 <script setup> 组件中要暴露出去的属性:

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

const a = 1
const b = ref(2)

defineExpose({
  a,
  b
})
</script>

4.在son组件中暴露方法

<template>
      <el-dialog
        title="我是子组件"
        v-model="connectVisible"
        width="60%"
        append-to-body
        :close-on-click-modal="false"
      >
        <p>好羞耻啊 我被打开了</p>
      </el-dialog>
</template>

<script setup>
import { ref, defineExpose } from "vue";
const connectVisible = ref(false);
/**
* 子组件中定义的方法
*/
const showModal = () => {
    connectVisible.value = true;
};

/**
* 全文高潮  暴露方法
*/
defineExpose({
  showModal
});
</script>

<style lang="scss" scoped>
</style>

这个时候我们就可以调用子组件中的方法

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Vue3中,组件可以通过组合式API中的`expose`和`ref`来调用组件方法。具体步骤如下: 1. 在组件中,使用`ref`来创建一个组件实例的引用,并在`expose`中暴露需要被组件调用方法。 ```vue <template> <div>组件</div> </template> <script> import { ref, defineComponent } from 'vue' export default defineComponent({ setup() { const childRef = ref(null) const childMethod = () => { console.log('组件方法调用') } // 暴露需要被组件调用方法 expose({ childMethod, }) return { childRef, } }, }) </script> ``` 2. 在组件中,使用`ref`来创建一个组件实例的引用,并使用`onMounted`钩函数来获取组件实例,并调用组件方法。 ```vue <template> <div> <ChildComponent ref="childRef" /> <button @click="callChildMethod">调用组件方法</button> </div> </template> <script> import { ref, onMounted } from 'vue' import ChildComponent from './ChildComponent.vue' export default { components: { ChildComponent, }, setup() { const childRef = ref(null) // 获取组件实例 onMounted(() => { childRef.value = childRef.value || {} childRef.value = childRef.value.$refs.childRef }) // 调用组件方法 const callChildMethod = () => { childRef.value.childMethod() } return { childRef, callChildMethod, } }, } </script> ``` 在组件中,我们使用`ref`来创建一个组件实例的引用,并在`onMounted`钩函数中获取组件实例。然后,我们可以通过`childRef.value.childMethod()`来调用组件方法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值