万金油:vue中央事件总线的使用

vue中央事件总线这种方法适用于任何情况的父子组件通信,同级别组件通信,相当于组件通信间的万金油。但是碰到多人合作时,代码的维护性较低,代码可读性低(这个缺点可以忽略)。

在vue-cli中使用 集中式事件管理机制:

第一步:在 src 新建 emit/emit.js,.js文件内容:

import Vue from 'vue';

const Emit = new Vue({});

export{
    Emit
}

复制代码

第二步:在 src/main.js 下引入

import {Emit} from './emit/emit.js';

Vue.proptotype.Emit = Emit;

复制代码

示例:index.vue为父组件,两个子组件 header.vue、footer.vue。

在mounted生命周期里通过this.Emit.$on()监听。

在destroyed生命周期里面通过this.Emit.$off()解除绑定。一定要解除绑定事件!!!

//父组件:index.vue:
<template>
	<div class="indexPageWrap">
		<header></header>
        <footer></footer>
	</div>
</template>
<script type="text/javascript">
   import header from './header.vue';
   import footer from './footer.vue';
    export default{
        data () {
        	return {
        	    index:0
        	}
        },
        mounted () {
            this.Emit.$on('fromHeader',this.indexFormHeader);
            this.Emit.$on('fromFooter',this.indexFromFooter);
        },
        //注意:在组件销毁时,一定要解除绑定事件:
        destroyed(){
            this.Emit.$off('fromHeader');
            this.Emit.$off('fromFooter');
        },
        components : {
        	header,
        	footer
        },
        methods : {
            indexFormHeader(vlaue){
                console.log('from header');
                console.log(value)
            },
            indexFromFooter(){
                console.log('from footer')
            }
        }
    }
</script>
<style type="text/css">
	
</style>
复制代码

子组件 header.vue

通过this.Emit.$emit()传递数据

//子组件 header.vue
<template>
	<div class="headerPageWrap">
		<div @click="headerEmit">Emit<div>
	</div>
</template>
<script type="text/javascript">
    export default{
    	data () {
    		return {
    			index:0
    		}
    	},
    	mounted () {
    	    this.Emit.$on('headerTofooter',this.headerFromFoot)
    	},
    	destroyed(){
    	    this.Emit.$off('headerTofooter')
    	},
    	components : {
    		
    	},
    	methods : {
    	    headerEmit(){
            	this.Emit.$emit('fromHeader',{value:"123"}); //可以传递数据
            },
            headerFromFoot(){
            	console.log('from footer');
            }
    	}
    }
</script>
<style type="text/css">
	
</style>
复制代码
//子组件 footer.vue
<template>
	<div class="footerPageWrap">
		<div @click="footerEmit">Emit<div>
        <div @click="footerEmitToHeader">Emit<div>
	</div>
</template>
<script type="text/javascript">
    export default{
        data () {
            return {
            	index:0
            }
        },
        mounted () {
        
        },
        components : {
        
        },
        methods : {
            footerEmit(){
            	this.Emit.$emit('fromFooter'); //不传递数据
            },
            footerEmitToHeader(){
               this.Emit.$emit('headerTofooter'); //不传递数据
            }
        }
    }
</script>
<style type="text/css">
	
</style>
复制代码
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值