我有一个在父组件中生成的事件,子组件必须对此作出反应。我知道在vuejs2
中不建议使用这种方法,我必须执行$root
emit,这非常糟糕。所以我的代码是这个。
<template>
<search></search>
<table class="table table-condensed table-hover table-striped" v-infinite-scroll="loadMore" infinite-scroll-disabled="busy" infinite-scroll-distance="10">
<tbody id="trans-table">
<tr v-for="transaction in transactions" v-model="transactions">
<td v-for="item in transaction" v-html="item"></td>
</tr>
</tbody>
</table>
</template>
<script>
import Search from './Search.vue';
export default {
components: {
Search
},
data() {
return {
transactions: [],
currentPosition: 0
}
},
methods: {
loadMore() {
this.$root.$emit('loadMore', {
currentPosition: this.currentPosition
});
}
}
}
</script>
正如您所看到的,loadMore
在无限滚动上被触发,事件被发送到子组件搜索。不仅仅是搜索,因为它是根,所以它正在向每个人广播。
什么是更好的方法。我知道我应该使用道具,但我不知道在这种情况下我该怎么做。
我认为@tobiasBora对@Roy J的回答的评论非常重要。如果您的组件被多次创建和销毁(比如使用v-If
),那么您的处理程序将被多次调用。此外,即使组件被销毁(结果可能非常糟糕),也会调用处理程序。
正如@tobiasBora解释的,您必须使用Vue的$off()
函数。这对我来说是非常重要的,因为它需要一个对事件处理函数的引用。我最后做的是将这个处理程序定义为组件数据的一部分。请注意,这必须是一个箭头函数,否则在函数定义之后需要.bind(this)
。
export default {
data() {
return {
eventHandler: (eventArgs) => {
this.doSomething();
}
}
},
methods: {
doSomething() {
// Actually do something
}
},
created() {
this.bus.$on("eventName", this.eventHandler);
},
beforeDestroy() {
this.bus.$off("eventName", this.eventHandler);
},
}
只要有一个变量(称之为moreload
),每次调用loadMore
时都会增加该变量。将该和currentPosition
作为道具传递给search
组件。在搜索中,您可以观看moreLoaded
,并采取相应的操作。
更新
黑客?我的解决方案?好吧,我从来没有
还可以使用本地化事件总线。设置它像这样:
export default {
components: {
Search
},
data() {
return {
bus: new Vue(),
transactions: [],
currentPosition: 0
}
},
methods: {
loadMore() {
this.bus.$emit('loadMore', {
currentPosition: this.currentPosition
});
}
}
}
并将其传递给搜索:
<search :bus="bus"></search>
它将把bus
作为道具(当然),并有一个像
created() {
this.bus.$on('loadMore', (args) => {
// do something with args.currentPosition
});
}
编辑:我已经采取了一种不同的方法来解决这个问题:根据接受的答案,在上检索父组件中的动态子组件值。 我正在尝试让父组件发出一个Event/Observable,以便它的子动态组件在侦听这样的事件时触发一个动作。 我已经了解到,在动态组件中使用或修饰符是不可能的,所以... 这是我用例的大纲: 动态子组件由一组4个输入元素组成。(完成) 父组件具有按钮,用于添加动态子组件。此按钮可用于添加动态子组件的
子组件事件能否到传递父组件
本文向大家介绍Vue父组件调用子组件事件方法,包括了Vue父组件调用子组件事件方法的使用技巧和注意事项,需要的朋友参考一下 Vue父组件向子组件传递事件/调用事件 不是传递数据(props)哦,适用于 Vue 2.0 方法一:子组件监听父组件发送的方法 方法二:父组件调用子组件方法 子组件: 父组件: 以上这篇Vue父组件调用子组件事件方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希
我有两个组件:父组件,我想改变子组件的状态: 和子组件: 我需要从父组件更改子组件的打开状态,或者当单击父组件中的按钮时,从父组件调用子组件的toggleMenu()?
假设我的父组件有两个子组件: 我从Child2获得一个输入,并将其传递给父组件(到目前为止,我知道该怎么做)。但是,我需要将该输入传递给Child1,以更新它的状态。 我怎么能那么做?
我已经创建了一个按钮和文本组件,并将它们包含在搜索组件中。现在,我想用搜索组件的处理程序覆盖按钮的默认handleClick事件。但this.handleClick指向按钮组件的事件处理程序。。请帮忙。。我需要从搜索中单击,而不是从按钮中获取。。