当前位置: 首页 > 知识库问答 >
问题:

从父组件到子组件的事件

祁权
2023-03-14

我有一个在父组件中生成的事件,子组件必须对此作出反应。我知道在vuejs2中不建议使用这种方法,我必须执行$rootemit,这非常糟糕。所以我的代码是这个。

<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在无限滚动上被触发,事件被发送到子组件搜索。不仅仅是搜索,因为它是根,所以它正在向每个人广播。

什么是更好的方法。我知道我应该使用道具,但我不知道在这种情况下我该怎么做。

共有2个答案

窦弘义
2023-03-14

我认为@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);
    },
}
施海
2023-03-14

只要有一个变量(称之为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指向按钮组件的事件处理程序。。请帮忙。。我需要从搜索中单击,而不是从按钮中获取。。