10.非父子组件之间的通信-兄弟组件间的通信

一、单页面中

情景:实现点击组件A中的按钮触发组件B中的数据增加,点击组件B中的按钮触发组件A中的数据增加

const hb = new Vue();
//注册一个事件中心
<body>
<div id="app">
    <children1-item></children1-item>
    <br>
    <children2-item></children2-item>
</div>
<script src="../node_modules/vue/dist/vue.js"></script>
<script>
    const hb = new Vue();//注册一个事件中心
    Vue.component('children1-item', {
        data: function () {
            return {
                childMsg1: 0
            }
        },
        template: `
            <div>
                第一个孩子的数据:{{childMsg1}}
                <button @click="changeChild1">点击增加第二个孩子的数据</button>
            </div>
        `,
        methods: {
        //这里通过 $emit “触发”了组件B的事件,并传值。
            changeChild1: function () {
                hb.$emit('children2-hb', 1)
            }
        },
        mounted() {
        //在周期函数中“监听”当前组件的一个自定义事件,并写入事件的处理逻辑
            hb.$on('children1-hb', (val) => {
                this.childMsg1 += val;
            })
        }
    })
    Vue.component('children2-item', {
        data: function () {
            return {
                childMsg2: 0
            }
        },
        template: `
            <div>
                第二个孩子的数据:{{childMsg2}}
                <button @click="changeChild2">点击增加第一个孩子的数据</button>
            </div>
        `,
        methods: {
        //这里通过 $emit “触发”了组件A的事件,并传值。
            changeChild2: function () {
                hb.$emit('children1-hb', 1)
            }
        },
        mounted() {
         //在周期函数中“监听”当前组件的一个自定义事件,并写入事件的处理逻辑
            hb.$on('children2-hb', (val) => {
                this.childMsg2 += val;
            })
        }
    });
    const vm = new Vue({
        el: '#app'
    })
</script>

</body>

实现效果

在这里插入图片描述

二、单文件组件中

1.在main.js中写入一个事件中心,并向外暴露这个事件。

import Vue from 'vue'
import App from './App.vue'

Vue.config.productionTip = false;

const hub =new Vue();
export default hub;

new Vue({
  render: h => h(App),
}).$mount('#app');

2.在组件 A 中 import 这个事件中心

<template>
    <div>
        组件1的数据:{{msg}}
        <button @click="handle">点击</button>
    </div>
</template>

<script>
    import hub from '../main.js'
    export default {
        name: "children1",
        data() {
            return {
                msg:0
            };
        },
        methods:{
            handle:function () {
                hub.$emit('child2-event',1)
            }
        },
        mounted(){
            hub.$on('child1-event',(val)=>{
                this.msg+=val;
            })
        }
    }
</script>

<style scoped>

</style>

2.在组件 B 中 import 这个事件中心

<template>
    <div>
        组件1的数据:{{msg}}
        <button @click="handle">点击</button>
    </div>
</template>

<script>
    import hub from '../main.js'
    export default {
        name: "children1",
        data() {
            return {
                msg:0
            };
        },
        methods:{
            handle:function () {
                hub.$emit('child2-event',1)
            }
        },
        mounted(){
            hub.$on('child1-event',(val)=>{
                this.msg+=val;
            })
        }
    }
</script>

<style scoped>

</style>

实现效果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值