前端基础之《Vue(15)—组件通信(2)》

接上一篇。

八、事件总线例子

1、什么是事件总线
const bus = new Vue(),不给选项就是事件总线,给选项就是组件了。

事件总线函数:
(1)bus.$on('频道', callback):监听一个“频道”
(2)bus.$emit('频道', '消息'):向指定“频道”上发送消息
(3)bus.$off():取消订阅“频道”
(4)bus.$once():对某个“频道”只监听一次

2、什么是“订阅-发布”模式
这里的事件总线,就是一种“订阅-发布”模式。
在Vue的背后源码中的Dep类也是一种“订阅-发布”模式。
“订阅-发布”模式,也叫做“观察者模式”。

3、代码

<html>
<head>
    <title>组件通信-事件总线</title>
    <style>
        .row {
            line-height: 22px;
        }
    </style>
</head>
<body>
    <div id="app">
        <comp-teacher></comp-teacher>
        <hr>
        <comp-student></comp-student>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>

    <script>

        const bus = new Vue() // 事件总线(事件系统)

        Vue.component('comp-teacher', {
            template: `
            <div>
                <h2>老师在线</h2>
                <input type="text" v-model='msg' @keyup.enter='send' />
                <button @click='send'>发送消息</button>
                <div v-html='content'></div>
            </div>
            `,
            data() {
                return {
                    msg: '',
                    content: ''
                }
            },
            methods: {
                send() {
                    // 使用事件总线向qqq频道上发送消息
                    bus.$emit('qqq', this.msg)
                    this.msg = ''
                }
            },
            mounted() {
                bus.$on('stu', msg=>{
                    this.content += `<div class='row'>学生说:${msg}</div>`
                })
            }
        })

        Vue.component('comp-student', {
            template: `
            <div>
                <h2>学生在线</h2>
                <input type="text" v-model='msg' @keyup.enter='send' />
                <button @click='send'>发送消息</button>
                <div v-html='content'></div>
            </div>
            `,
            data() {
                return {
                    msg: '',
                    content: ''
                }
            },
            methods: {
                send() {
                    // 学生发消息
                    bus.$emit('stu', this.msg)
                    this.msg = ''
                }
            },
            mounted() {
                // 使用事件总线,监听qqq这个频道
                bus.$on('qqq', msg=>{
                    console.log('student---qqq频道上有消息来了', msg)
                    this.content += `<div class='row'>老师说:${msg}</div>`
                })
            }
        })

        const app = new Vue({
            
        })
        app.$mount('#app')

    </script>

</body>
</html>

九、Vue归纳

十几个指令(内置指令)
底层原理(响应式、生命周期、两个重要API)
组件化(computed、watch、props、template、data、methods、组件注册、组件命名)
五个内置组件(slot、transtion、component、keep-alive)
逻辑复用技术(自定义组件、混入、过滤器、自定义指令、原型链)
组件间通信方案(9种)
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值