从子组件调用父函数的父级

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从子组件调用父函数的父级相关的知识,希望对你有一定的参考价值。

我在Child Component中有一个简单的Method函数,它调用父组件的一个函数,但我有下一个情况:

ViewComponent扩展了一个LayoutComponent,并在Child Component中。像这样的东西:

子组件:

<template>
  <button @click="simpleMethod">smth</button>
</template>
<script>
...
methods: {
  simpleMethod() {
    this.$parent.parentFunction()
  }
}
</script>

ViewComponent:

<template>
  <onepage-layout>
    <child-component></child-component>
  </onepage-layout>
</template>
<script>
...
methods: {
  parentFunction() {
    console.log('I want to fire this function...')
  }
}
</script>

因此,当子组件触发simpleMethod函数时,它会在OnePageLayout组件中搜索函数而不是ViewComponent。

我认为我可以在OnePageLayout中创建一个parentFunction,就像子组件中的那个一样,但我想这不是很有效或者很好的做法。

任何的想法?

答案

子组件:

<template>
  <button @click="simpleMethod">smth</button>
</template>
<script>
...
methods: {
  simpleMethod() {
    this.$emit('callParentFunction'); // emit an event to parent
  }
}
</script>

ViewComponent:

<template>
  <onepage-layout>
    <child-component @callParentFunction="parentFunction"></child-component>
  </onepage-layout>
</template>
<script>
...
methods: {
  parentFunction() {
    console.log('I want to fire this function...')
  }
}
</script>

你可以参考我的另一个answer

父母和孩子之间的沟通应该使用Props down事件,而不是通过this.$parent.function()直接调用函数。你应该$emit('callFunc')然后@callFunc="function"

另一答案

实现此目的的一个好方法是使用新的vue实例作为事件总线:

window.EventBus = new Vue();

在您的子组件中,您可以运行childFunction

 methods: {

        childFunction() {
            EventBus.$emit('call-parent-function')
        }

    }

然后在任何组件(如父级的父级!)中,您可以收听该事件:

 created() {           

        EventBus.$on('call-parent-function', () => {
            this.parentFunction();
        })

    }

以上是关于从子组件调用父函数的父级的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法从VueJS中的父级触发组件方法?

使用 useRef 从 Reactjs 中的父级调用子函数

如何将父组件函数传递给子组件,然后从子 AngularJS 内部调用它

vuejs 从子组件更新父数据

vuejs 从子组件更新父数据

从子组件调用父函数会在 Vue.js 中引发错误