我正在做一个项目,我需要从子组件调用父方法。如何在Vue.js中实现这一点?
bqucvtff1#
当您想要触发父组件中的方法时,应该在子组件中使用this.$emit('myEvent')。然后在父组件的模板中找到子组件,并在其上添加一个事件捕捉器,如下所示:
this.$emit('myEvent')
<template> <your-child-component @myEvent="myMethod"/> </template>
如果你想给你的方法添加参数,你可以像这样给你的emit添加第二个参数:
this.$emit("myEvent", "My parameter")
要实现这一点,您不必更改事件“catcher”中的任何内容,只要您调用的方法具有参数即可。
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
fslejnso3#
它使用**$emit。父组件中@***callTest*的名称必须与子组件中$emit('callTest')的名称相同。
$emit
父组件:
<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**。
script
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**方法,如下所示。
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>
hof1towb4#
理想情况下,这是正确的方法:https://v2.vuejs.org/v2/guide/components.html#Listening-to-Child-Components-Events另一方面,我相信在您的场景中(我试图假设它,因为它不是很清楚),您可以使用这个.$parent. methodName。请记住,第二个建议不太干净,应该在需要时使用。
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。
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' }); } }
uemypmqf7#
我用props做到了这一点。通过props将父方法传递给子组件。并从子组件访问。在子组件中
props: ["lesson","fetchLessons"],
并在子组件中访问了这样的属性
this.fetchLessons();
母体组分
<InstructorLesson v-for="(lesson,index) in getFechedLessons" :lesson="lesson" :fetchLessons = "fetchLessons" v-bind:key="index"/>
7条答案
按热度按时间bqucvtff1#
当您想要触发父组件中的方法时,应该在子组件中使用
this.$emit('myEvent')
。然后在父组件的模板中找到子组件,并在其上添加一个事件捕捉器,如下所示:
如果你想给你的方法添加参数,你可以像这样给你的emit添加第二个参数:
要实现这一点,您不必更改事件“catcher”中的任何内容,只要您调用的方法具有参数即可。
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
fslejnso3#
2021年12月更新:
它使用**
$emit
。父组件中@***callTest*的名称必须与子组件中$emit('callTest')的名称相同。父组件:
子组件:
同样,父组件中@callTest*的名称必须与子组件中$emit('callTest')的名称相同。
如果在
script
节中使用$emit
,则需要使用与*template
节不同的this
**。子组件:
如果**
test
方法有2 parameters
,需要在子组件中调用2 arguments
**方法,如下所示。父组件:
子组件:
hof1towb4#
理想情况下,这是正确的方法:https://v2.vuejs.org/v2/guide/components.html#Listening-to-Child-Components-Events
另一方面,我相信在您的场景中(我试图假设它,因为它不是很清楚),您可以使用这个.$parent. methodName。
请记住,第二个建议不太干净,应该在需要时使用。
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。
jhdbpxl96#
家长
儿童
uemypmqf7#
我用props做到了这一点。通过props将父方法传递给子组件。并从子组件访问。
在子组件中
并在子组件中访问了这样的属性
母体组分