Vue —— 进阶脚手架(五)(全局事件总线、消息订阅与发布)

简介: Vue —— 进阶脚手架(五)(全局事件总线、消息订阅与发布)

一、全局事件总线

1. 什么是全局事件总线?

这是一种组件间通信的方式,适用于任意组件间通信。

2. 安装全局事件总线
  new Vue({
    .....
    beforeCreate() {
      Vue.prototype.$bus = this //安装全局事件总线,$bus就是当前应用的 vm
    }
  })
3. 使用事件总线
  1. 接收数据:A组件想接收数据,则在 A组件中给 $bus 绑定自定义事件,事件的回调留在 A组件自身。
  methods: {
    demo(data) {....}
  },
  ....
  mounted() {
    this.$bus.$on('xxx', this.demo)
  }
  1. 提供数据
  this.$bus.$emit('xxx', 数据)
4. 解绑事件

最好在 beforeDestroy 钩子中,用 $off 去解绑当前组件所用到的事件。

5. 实例:实现兄弟间的组件通信(全局事件总线)

main.js

  1. 在生命周期钩子 beforeCreate() 中安装全局事件总线
  // 引入 Vue
  import Vue from 'vue'
  // 引入 App
  import App from './App.vue'
  // 关闭 vue 的生产提示
  Vue.config.production = false
  //创建 vm
  new Vue({
      el: '#app',
      render: h => h(App),
      beforeCreate() {
          Vue.prototype.$bus = this //安装全局事件总线
      }
  })

Student.vue

  1. $emit() 触发自定义事件( hello 事件)
  2. 为 School 组件提供 this.name(即张三) 数据
  <template>
    <div class="demo">
      <h2>学生姓名:{{ name }}</h2>
      <h2>学生性别:{{ sex }}</h2>
      <button @click="sendStudentName">把学生名给School组件</button>
    </div>
  </template>
  <script>
  export default {
    name: "StudentName",
    data() {
      return {
        name: "张三",
        sex: "男",
      };
    },
    methods: {
      sendStudentName() {
        this.$bus.$emit("hello", this.name);
      },
    },
  };
  </script>

School.vue

  1. 提供数据:School 组件中给 $bus 绑定自定义事件,事件的回调留在 School 组件自身。
  2. 组件被销毁之前,在 beforeDestroy() 中进行自定义事件的解绑。
  <template>
    <div class="demo">
      <h2>学校名称:{{ name }}</h2>
      <h2>学校地址:{{ address }}</h2>
    </div>
  </template>
  <script>
  export default {
    name: "SchoolName",
    data() {
      return {
        name: "哔哩哔哩",
        address: "中国",
      };
    },
    methods:{
        demo(data){
          console.log("我是School组件,我收到了数据", data);
        }
    },
    mounted() {
      this.$bus.$on("hello", this.demo);
    },
    beforeDestroy() {
      this.$bus.$off("hello");
    },
  };
  </script>

App.vue

  1. 配置相关子组件的标签
  <template>
    <div class="app">
      <h3>{{ msg }}</h3>
      <School />
      <student />
    </div>
  </template>
  <script>
  // 引入组件
  import School from "./components/School.vue";
  import Student from "./components/Student.vue";
  export default {
    name: "App",
    components: { School, Student },
    data() {
      return {
        msg: "你好啊",
      };
    },
  };
  </script>

387e21fde20041358dd3821b1ab9f4e3.png

二、消息订阅与发布

1. 什么是消息订阅与发布?

一种组件间通信的方式,适用于任意组件间通信。

2. 使用步骤
  1. 安装 pubsub:npm i pubsub-js
  2. 引入:import pubsub from 'pubsub-js'
  3. 接收数据:A组件想接收数据,则在 A组件中订阅消息,订阅的回调留在 A组件自身。
  methods: {
    demo(data) {....}   
  },
  ....
  mounted() {
    this.pubId = pubsub.subscribe('xxx', this.demo) //订阅消息
  }

提供数据:pubsub.publish('xxx', 数据)

最好在 beforeDestroy 钩子中,使用 PubSub.unsubscribe(pubid) 去取消订阅。

3. 实例:实现兄弟间的组件通信(消息订阅与发布)

main.js 不需要添加任何内容

App.vue 不需要做改变

Student.vue

  1. 引入 pubsub
  2. 提供订阅数据:pubsub.publish(‘xxx’)
  <template>
    <div class="demo">
      <h2>学生姓名:{{ name }}</h2>
      <h2>学生性别:{{ sex }}</h2>
      <button @click="sendStudentName">把学生名给School组件</button>
    </div>
  </template>
  <script>
  import pubsub from 'pubsub-js'
  export default {
    name: "StudentName",
    data() {
      return {
        name: "张三",
        sex: "男",
      };
    },
    methods: {
      sendStudentName() {
        pubsub.publish('hello', this.name)
      },
    },
  };
  </script>

School.vue

  1. 引入 pubsub
  2. 接收数据:this.pubId = pubsub.subscribe('xxx', this.demo)
  3. 组件被销毁之前,在 beforeDestroy() 中取消订阅。
  <template>
    <div class="demo">
      <h2>学校名称:{{ name }}</h2>
      <h2>学校地址:{{ address }}</h2>
    </div>
  </template>
  <script>
  import pubsub from 'pubsub-js'
  export default {
    name: "SchoolName",
    data() {
      return {
        name: "哔哩哔哩",
        address: "中国",
      };
    },
    methods:{
      demo(msgName, data) {
        console.log('有人发布了hello消息,hello消息的回调执行了', msgName, data);
        console.log(this);
      }
    },
    mounted() {
      this.pubId = pubsub.subscribe('hello', this.demo)
    },
    beforeDestroy() {
      pubsub.unsubscribe(this.pubId)
    },
  };
  </script>

不积跬步无以至千里 不积小流无以成江海

相关文章
|
4月前
|
JavaScript 数据可视化
vue-cli学习一:vue脚手架的 vue-cli2和vue-cli3版本 创建vue项目,vue的初始化详解
这篇文章介绍了如何使用vue-cli 2和3版本来创建Vue项目,并详细说明了两者之间的主要区别。
168 5
vue-cli学习一:vue脚手架的 vue-cli2和vue-cli3版本 创建vue项目,vue的初始化详解
|
4月前
|
JavaScript
Vue CLi脚手架创建第一个VUE项目
Vue CLi脚手架创建第一个VUE项目
56 3
|
3月前
|
存储 JavaScript 前端开发
vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!
【10月更文挑战第21天】 vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!
vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!
|
4月前
|
缓存 JavaScript 前端开发
《基础篇第4章:vue2基础》:使用vue脚手架创建项目
《基础篇第4章:vue2基础》:使用vue脚手架创建项目
100 3
|
4月前
|
JavaScript 调度
Vue事件总线(EventBus)使用指南:详细解析与实战应用
Vue事件总线(EventBus)使用指南:详细解析与实战应用
161 1
|
4月前
|
JavaScript
【小白懂系列】Vue CLi脚手架创建第一个VUE项目
【小白懂系列】Vue CLi脚手架创建第一个VUE项目
70 2
|
5月前
|
JavaScript
Vue Cli 脚手架安装
本文介绍了如何使用npm和cnpm淘宝镜像加速来安装Vue CLI脚手架工具,并验证安装成功。接着,通过Vue CLI创建新项目,并启动项目服务。
Vue Cli 脚手架安装
|
6月前
|
JavaScript
Vue学习之--------全局事件总线(2022/8/22)
这篇文章介绍了Vue中全局事件总线(GlobalEventBus)的概念和使用方法,它允许不同组件之间进行通信。文章通过图解和代码实例详细解释了如何安装全局事件总线、在组件中接收和提供数据,以及如何在组件销毁前解绑事件,以避免潜在的内存泄漏问题。
Vue学习之--------全局事件总线(2022/8/22)
|
4月前
|
JSON 缓存 JavaScript
vue尚品汇商城项目-day01【1.vue-cli脚手架初始化项目生成文件的介绍】
vue尚品汇商城项目-day01【1.vue-cli脚手架初始化项目生成文件的介绍】
51 0
|
4月前
|
JavaScript
vue尚品汇商城项目-day01【2.vue-cli脚手架初始化项目的其他配置】
vue尚品汇商城项目-day01【2.vue-cli脚手架初始化项目的其他配置】
45 0

热门文章

最新文章