首页 > 其他 > 详细

vue中eventbus 多次触发的问题

时间:2017-12-27 18:41:26      阅读:595      评论:0      收藏:0      [点我收藏+]
  
相比于react,vue是一个更上手很快的框架。所说简单易用,但在做Vue项目的过程中,就会发现,坑还是有的。
组件之间传递数据是一个常见的需求,父子组件传递数据在官网有介绍,除了父子组件,一般地,任意组件之间传递数据无非2种方式:
1.vuex
2.eventbus
一般地,小项目中建议用eventbus,具体怎么用呢?
main.js
var bus = new Vue()

// in component A method
bus.$emit(‘select‘, 1)

// in component B created hook
bus.$on(‘select‘, function (id) {
    console.log(‘B页面打印:‘+id);//1
})

// in component C created hook
bus.$on(‘select‘, function(id){
    console.log(‘C页面打印:‘+id);//1
})
这样就没有问题了吗?
如果只在B页面监听事件,那没有问题(起码表现上)。
如果在B,C2组件监听事件,那就有问题了。只要C组件的页面打开过,在B组件的页面触发事件,C组件页面的监听函数也执行了。讲道理,C页面此时已经销毁了。
我们试一下:先打开C的页面:

 技术分享图片

接下来,我们打开B的页面:

技术分享图片

这真真让人迷惑。
vue的作者在git上回答过,解决办法:
在监听的B,C组件beforeDestroy()生命周期函数里取消监听:
beforeDestroy () {
    bus.$off(‘select‘,this.handle)
}

 

这时候,匿名函数就不行了。,C组件在监听的时候,回调函数改成具名函数:
bus.$on(‘select‘,this.handle)

  

 

本文的出问题写法,完整文件:

A.vue

<template>
    <div class="help-page">
        <p @click="click"">A</p>
    </div>
</template>

<script type="text/javascript">
    export default{
        data(){
            return{

            }
        },
        created(){

        },
        methods:{
            click(){
                bus.$emit(‘select‘, 1)
            }
        }
    }
</script>
<style lang="less">

</style>

  

B.vue

<template>
    <div class="help-page">
        <A></A>
        <p>B</p>
    </div>
</template>

<script type="text/javascript">
    import A from ‘./A.vue‘
    export default{
        data(){
            return{

            }
        },
        created(){
            bus.$on(‘select‘, function(id){
                console.log(‘B页面打印:‘+id);
            })

        },
        components:{
            A
        },
        methods:{

        }
    }
</script>
<style lang="less">

</style>

  

C.vue

<template>
    <div class="help-page">
        <A></A>
        <p>C</p>
    </div>
</template>

<script type="text/javascript">
    import A from ‘./A.vue‘
    export default{
        data(){
            return{

            }
        },
        created(){
            bus.$on(‘select‘, function(id){
                console.log(‘C页面打印:‘+id);
            })

        },
        components:{
            A
        },
        methods:{

        }
    }
</script>
<style lang="less">

</style>

  

vue中eventbus 多次触发的问题

原文:https://www.cnblogs.com/xiaochongchong/p/8127148.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!