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>

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

相关文章
|
1天前
|
JSON 缓存 JavaScript
vue脚手架安装方法——2023年5月28日版本
vue脚手架安装方法——2023年5月28日版本
72 0
|
1天前
|
开发框架 JavaScript 前端开发
探索Vue.js:从基础到进阶
Vue.js 是一款受青睐的前端框架,以其简洁、灵活和响应式设计著称。核心特性包括数据绑定、指令(如 v-if、v-for)和组件化开发。进阶技巧涉及Vuex(状态管理)、Vue Router(路由)和生命周期钩子。通过Vue CLI和Vue DevTools加速开发和调试。丰富的生态系统包含社区资源、插件和教程,助力开发者构建现代Web应用。学习Vue.js能提升开发效率和职业能力。
10 2
|
1天前
|
资源调度 JavaScript 前端开发
【vue】vue中的路由vue-router,vue-cli脚手架详细使用教程
【vue】vue中的路由vue-router,vue-cli脚手架详细使用教程
|
1天前
|
资源调度 JavaScript Linux
VueCLI:Vue项目脚手架与构建工具技术详解
【4月更文挑战第24天】VueCLI是Vue.js官方的项目脚手架,简化创建与配置,提供丰富的插件系统,支持全生命周期功能,如代码编译、打包部署。它具有易于配置、跨平台支持等优势。通过安装、创建项目、运行及构建命令,开发者能快速搭建Vue应用。VueCLI允许自定义配置(vue.config.js)和安装各类插件,如vue-router、vuex,以适应不同项目需求,提高开发效率。
|
1天前
|
JavaScript
Vue脚手架开发流程
Vue脚手架开发流程
|
1天前
|
JavaScript
在Vue中,如何使用事件总线来传递数据和触发事件?
在Vue中,如何使用事件总线来传递数据和触发事件?
16 0
|
1天前
|
JavaScript
解释 Vue 的事件总线和 emits 属性。
解释 Vue 的事件总线和 emits 属性。
24 3
|
1天前
|
JavaScript
Vue.js 进阶技巧:自定义指令的使用与实现
Vue.js 进阶技巧:自定义指令的使用与实现
|
1天前
|
缓存 JavaScript 网络架构
Vue.js 进阶技巧:keep-alive 缓存组件解析
Vue.js 进阶技巧:keep-alive 缓存组件解析
|
1天前
|
JavaScript 程序员
Vue中的全局事件总线是什么?如何使用?
Vue中的全局事件总线是什么?如何使用?
24 0