vue3 composition api父组件调用子组件的方法

示例

子组件

通过defineExpose暴露给父组件调用的方法

const resize = () => {
    ehcart.resize()
}
defineExpose({
  resize
})

父组件

通过ref获取子组件实例,调用defineExpose暴露的方法,记得不要忘了加上value

template
  <myEchart ref="getChart" />
script
const getChart = ref(null)
window.onresize = () => {
    getChart.value.resize()
  }

什么是defineExpose

以下内容来自vue3官方文档

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

为了在 <script setup> 组件中明确要暴露出去的属性,使用 defineExpose 编译器宏:

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

const a = 1
const b = ref(2)

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3中,使用Composition APIsetup()函数可以非常方便地编写组件逻辑。在组件调用组件方法,首先需要在两个组件的代码中分别定义和引入。 在组件中,我们可以使用ref()函数定义一个响应式的属性或方法,并在template中通过组件引用这个属性或方法,比如: ```html <template> <div> <button @click="sayHello">Say Hello</button> </div> </template> <script> import {ref} from 'vue'; export default { setup() { const greeting = ref('Hello'); const sayHello = () => { console.log(greeting.value); }; return {greeting, sayHello}; } } </script> ``` 在组件中,我们需要使用ref或reactive函数创建一个响应式对象,并在template中使用组件时,通过v-bind将这个对象传递给组件,比如: ```html <template> <div> <h2>{{message}}</h2> <child-component v-bind:greeting="greeting" /> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; import {ref} from 'vue'; export default { components: {ChildComponent}, setup() { const message = ref('Hello, Vue3!'); const greeting = ref(''); return {message, greeting}; } } </script> ``` 在组件中,我们可以通过props来接收组件传递的响应式对象,并在方法中对其进行操作,比如: ```html <template> <div> <button @click="sayHello">Say Hello to Parent</button> </div> </template> <script> import {ref, defineProps} from 'vue'; export default { props: { greeting: { type: Object, default: () => ({}) } }, setup(props) { const sayHello = () => { console.log(props.greeting.value); }; return {sayHello}; } } </script> ``` 这里使用了defineProps函数来定义props,其参数为props的默认值和类型,这样可以让props的类型校验更加严格。 通过以上步骤,我们就可以在组件调用组件方法了。具体而言,我们可以在组件方法中,通过调用组件的响应式对象来执行组件中的方法,比如: ```html <template> <div> <h2>{{message}}</h2> <child-component v-bind:greeting="greeting" ref="childComponent" /> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; import {ref} from 'vue'; export default { components: {ChildComponent}, setup() { const message = ref('Hello, Vue3!'); const greeting = ref('Hi, Child Component!'); const childComponent = ref(null); const callChildMethod = () => { childComponent.value.sayHello(); }; return {message, greeting, childComponent, callChildMethod}; } } </script> ``` 在组件中,我们通过v-bind将组件中的greeting属性传递给组件中的greeting属性,然后在组件的callChildMethod()方法中,通过ref()函数获取childComponent组件实例,并调用其sayHello()方法,从而实现了组件调用组件方法的功能。 总之,在Vue3中,通过setup()函数和响应式对象,可以非常方便地编写组件逻辑,并实现组件调用组件方法等复杂功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值