今天是2022年7月7日,是我学习vue的第十六天
昨天和几个弟弟妹妹们出门玩了一天,今天多学一点吧
全局事件总线(GlobalEventBus)
- 一种组件间通信的方式,适用于任意组件间通信。
- 安装全局事件总线:
new Vue({ ...... beforeCreate() { Vue.prototype.$bus = this //安装全局事件总线,$bus就是当前应用的vm }, ...... })
- 使用事件总线:
- 接收数据:A组件想接收数据,则在A组件中给$bus绑定自定义事件,事件的回调留在A组件自身。
methods(){ demo(data){......} } ...... mounted() { this.$bus.$on('xxxx',this.demo) }
- 提供数据:
this.$bus.$emit('xxxx',数据)
- 最好在beforeDestroy钩子中,用$off去解绑当前组件所用到的事件。
main.js
//引入Vue import Vue from 'vue' //引入App import App from './App.vue' //关闭Vue的生产提示 Vue.config.productionTip = false //创建vm new Vue({ el:'#app', render: h => h(App), beforeCreate() { Vue.prototype.$bus = this //安装全局事件总线 }, })
student.vue
<template> <div class="student"> <h2>学生姓名:{{ name }}</h2> <h2>学生性别:{{ sex }}</h2> <button @click="sendStudentName">把学生名给School组件</button> </div> </template> <script> export default { name: "Student", data() { return { name: "张三", sex: "男", }; }, mounted() { // console.log('Student',this.x) }, methods: { sendStudentName() { this.$bus.$emit("hello", this.name); }, }, }; </script> <style lang="css" scoped> .student { background-color: pink; padding: 5px; margin-top: 30px; } </style>
school.vue
<template> <div class="school"> <h2>学校名称:{{ name }}</h2> <h2>学校地址:{{ address }}</h2> </div> </template> <script> export default { name: "School", data() { return { name: "尚硅谷", address: "北京", }; }, mounted() { // console.log('School',this) this.$bus.$on("hello", (data) => { console.log("我是School组件,收到了数据", data); }); }, beforeDestroy() { this.$bus.$off("hello"); }, }; </script> <style scoped> .school { background-color: skyblue; padding: 5px; } </style>
消息订阅与发布(pubsub)
- 一种组件间通信的方式,适用于任意组件间通信。
- 使用步骤:
- 安装pubsub:
npm i pubsub-js
- 引入:
import pubsub from 'pubsub-js'
- 接收数据:A组件想接收数据,则在A组件中订阅消息,订阅的回调留在A组件自身。
methods(){ demo(data){......} } ...... mounted() { this.pid = pubsub.subscribe('xxx',this.demo) //订阅消息 }
- 提供数据:
pubsub.publish('xxx',数据)
- 最好在beforeDestroy钩子中,用
PubSub.unsubscribe(pid)
去取消订阅。
school.vue
<template> <div class="school"> <h2>学校名称:{{ name }}</h2> <h2>学校地址:{{ address }}</h2> </div> </template> <script> import pubsub from "pubsub-js"; export default { name: "School", data() { return { name: "尚硅谷", address: "北京", }; }, mounted() { // console.log('School',this) // this.$bus.$on("hello", (data) => { // console.log("我是School组件,收到了数据", data); // }); this.pubId = pubsub.subscribe("hello", function (msgName, data) { //msgName是消息名,data是带的数据 console.log("有人发布了hello消息,hello消息的回调执行了", msgName, data); }); }, beforeDestroy() { // this.$bus.$off("hello"); pubsub.unsubscribe(this.pubId); //通过id来取消订阅 }, }; </script> <style scoped> .school { background-color: skyblue; padding: 5px; } </style>
student.vue
<template> <div class="student"> <h2>学生姓名:{{ name }}</h2> <h2>学生性别:{{ sex }}</h2> <button @click="sendStudentName">把学生名给School组件</button> </div> </template> <script> import pubsub from "pubsub-js"; export default { name: "Student", data() { return { name: "张三", sex: "男", }; }, mounted() { // console.log('Student',this.x) }, methods: { sendStudentName() { // this.$bus.$emit("hello", this.name); pubsub.publish("hello", 666); }, }, }; </script> <style lang="css" scoped> .student { background-color: pink; padding: 5px; margin-top: 30px; } </style>