从子组件调用父方法(Vue.js)

pw136qt2  于 2023-02-09  发布在  Vue.js
关注(0)|答案(7)|浏览(163)

我正在做一个项目,我需要从子组件调用父方法。如何在Vue.js中实现这一点?

bqucvtff

bqucvtff1#

当您想要触发父组件中的方法时,应该在子组件中使用this.$emit('myEvent')
然后在父组件的模板中找到子组件,并在其上添加一个事件捕捉器,如下所示:

<template>
  <your-child-component @myEvent="myMethod"/>
</template>

如果你想给你的方法添加参数,你可以像这样给你的emit添加第二个参数:

this.$emit("myEvent", "My parameter")

要实现这一点,您不必更改事件“catcher”中的任何内容,只要您调用的方法具有参数即可。

ukqbszuj

ukqbszuj2#

也许举个例子会更清楚。
https://m-vue-leaflet.netlify.app/
代码-https://github.com/manojkmishra/vue-leaflet-mapping
因此,如果您看到组件文件夹中有3个vue文件,Brew.vue是BrewList.vue子组件的父组件。
Brew.vue-父组件

BrewList.vue -子组件

子组件BrewList.vue正在使用emit将mouse-over-brew和mouse-leave-brew值发送给父组件Brew. vue。此外,如果您感兴趣,Brew.vue父组件正在将brew属性发送给BrewList.vue子组件。

根据文档-https://v2.vuejs.org/v2/guide/components.html#Listening-to-Child-Components-Events

fslejnso

fslejnso3#

2021年12月更新:

它使用**$emit。父组件中@***callTest*的名称必须与子组件中$emit('callTest')的名称相同。

父组件

<template>
  <Child
    @callTest="test" // Assign 'test' method to @callTest
  />
</template>

<script>
import Child from "../components/Child.vue";
import { defineComponent } from "vue";

export default defineComponent({
  name: "Parent",

  components: {
    Child,
  },

  methods: {
    test() {
      alert("Test");
    },
  }
});
</script>

子组件

<template>
  <button @click="$emit('callTest')">Click Me</button>
</template>

<script>
import { defineComponent } from "vue";
    
export default defineComponent({
  name: "Child",
});
</script>

同样,父组件中@callTest*的名称必须与子组件中$emit('callTest')的名称相同。
如果在
script节中使用$emit
,则需要使用与
*template节不同的this**。

子组件

<template>
  <button @click="message">Click Me</button>
</template>

<script>
import { defineComponent } from "vue";
    
export default defineComponent({
  name: "Child",
  methods: {
    message() {
      this.$emit('callTest') // 'this' is needed.
    }
  }
});
</script>

如果**test方法有2 parameters,需要在子组件中调用2 arguments**方法,如下所示。

父组件

<template>
  <Child
    @callTest="test" // Assign 'test' method to @callTest
  />
</template>

<script>
import Child from "../components/Child.vue";
import { defineComponent } from "vue";

export default defineComponent({
  name: "Parent",

  omponents: {
    Child,
  },
        
  methods: {
    test(num1, num2) { // 'test' method has 2 parameters.
      alert(num1 + num2);
    },
  }
});
</script>

子组件

<template>       // Call 'test' method with 2 arguments.                          
  <button @click="$emit('callTest', 3, 5)">Click Me</button>
</template>

<script>
import { defineComponent } from "vue";
        
export default defineComponent({
  name: "Child",
});
</script>
hof1towb

hof1towb4#

理想情况下,这是正确的方法:https://v2.vuejs.org/v2/guide/components.html#Listening-to-Child-Components-Events
另一方面,我相信在您的场景中(我试图假设它,因为它不是很清楚),您可以使用这个.$parent. methodName。
请记住,第二个建议不太干净,应该在需要时使用。

ghg1uchk

ghg1uchk5#

基本上,有两种方法可以回答你的问题
1.使用**$emit**,语法为**@**
1.将function作为props传递,语法为**:与示例相同
如果你基于Vue文档和其他很多Vue教程,你会发现他们鼓励人们使用
$emitevent而不是passingfunction作为 prop (你正在使用的方式)。
https://v2.vuejs.org/v2/guide/components-custom-events.htmlhttps://v2.vuejs.org/v2/guide/components.html#Emitting-a-Value-With-an-Eventhttps://code.tutsplus.com/tutorials/design-patterns-for-communication-between-vuejs-component--cms-32354vue, emitting vs passing function as props
原因是Vue的哲学是
向下传递 prop ,向上发射事件**。使用**$发射将有助于将触发的函数标记为Vue事件,因此您可以使用全局事件侦听器。这也将有助于您区分数据流逻辑事件流逻辑**。
不过,把函数当 prop 并没有错,实际上也可以用来达到同样的效果,在我的偏好中,当我编写一个有默认函数的组件时,我使用第二种方式,只有当父级传递另一个时才会覆盖该函数,这将帮助我避免多次重写默认函数。
对于其他情况,我将使用第一种方法$emit。

jhdbpxl9

jhdbpxl96#

家长

<complited v-on:passData="fromChild" />

  methods: {
      fromChild(data) {
        if (data.methodCall) return this[data.methodCall]();
      }

      aFunction() {
        alert('function: a');
      }

      bFunction() {
        alert('function: b');
      }
  }

儿童

<template>
   <div>
    <button @click="parentCall()">Call Parent Function
    </button>
   </div>
  </template>
  methods: {
      parentCall() {
        this.$emit("passData", {methodCall: 'aFunction' });
      }
  }
uemypmqf

uemypmqf7#

我用props做到了这一点。通过props将父方法传递给子组件。并从子组件访问。
在子组件中

props: ["lesson","fetchLessons"],

并在子组件中访问了这样的属性

this.fetchLessons();

母体组分

<InstructorLesson  v-for="(lesson,index) in getFechedLessons" :lesson="lesson" :fetchLessons = "fetchLessons" v-bind:key="index"/>

相关问题