Vue简单实例——全局事件总线

梦想不抛弃苦心追求的人,只要不停止追求,你们会沐浴在梦想的光辉之中。再美好的梦想与目标,再完美的计划和方案,如果不能尽快在行动中落实,最终只能是纸上谈兵,空想一番。只要瞄准了大方向,坚持不懈地做下去,才能够扫除挡在梦想前面的障碍,实现美好的人生蓝图。Vue简单实例——全局事件总线,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

 简单介绍:

使用props可以实现父组件向子组件传递数据,使用自定义事件可以实现子组件向父组件传递数据,那么,如何实现兄弟组件之间传递数据就应用到了全局事件总线这个概念。在子组件向父组件传递数据的时候,使用的是在父组件中在子组件的标签上绑定一个自定义事件,并在子组件中触发这个自定义组件,从而完成通信的过程。但是兄弟组件之前不存在互相引用组件的形式,那么这个事件要绑定在谁身上就是第一个问题。

这个人,首先要能被所有的VueComponents组件所引用到,并且能完成绑定事件和触发事件的功能。所以,能满足这两个条件的对象就是Vue实例对象。因为你所有的组件对象都是Vue调用component创建出来的,所以肯定是可以被发现的,而组件对象是肯定可以调用触发和绑定事件的,所以现在知道给谁绑定了之后,接下来就是如何获取这个对象。

要获取Vue的实例对象,就要去main.js中去,因为这里是唯一定义Vue实例对象的地方,所以在main.js中,添加如下代码:

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

Vue.config.productionTip = false

new Vue({
  render: h => h(App),
  //安装全局事件总线,就是在创建之前,给Vue实例添加一个对象,并将Vue实例赋值给这个对象,使这个对象可以作为Vue实例使用
  beforeCreate() {
    Vue.prototype.$bus = this
  }
}).$mount('#app')

 在beforCreate这个生命周期钩子函数中,给Vue实例对象添加一个对象,赋值为一个Vue实例对象,这个过程叫做安装全局事件总线。

全局事件总线的基本理念,是将所有的发送数据和接收数据的事件都绑定在一个人身上,每次触发事件的时候,都要经过这个人,所以解决了必须在子组件的标签中绑定事件的弊端,实现了即使不是父子关系的组件之间通信的问题

 发送数据的子组件:

<template>
<div>
<!--  这个子组件是用来发送数据的-->
<!--  将点击事件绑定到方法,方法中出发一个自定义事件,这个自定义事件是绑定在事件总线上的-->
  <button type="button" @click="sendData">传递数据</button>
</div>
</template>

<script>
export default {
  name: "s_com1",
  data(){
    return {
      name:'s_com1'
    }
  },
  methods:{
    sendData(){
      //这个事件名为send的事件是绑定在事件总线上的,在这个子组件上触发之后,实现了提供数据的功能
      this.$bus.$emit('send',this.name)
    }
  }
}
</script>

<style scoped>

</style>

接收数据的子组件: 

<template>
<div>
<!--  这个子组件是用来接受数据的-->
{{count}}
</div>
</template>

<script>
export default {
  name: "s_com1",
  data(){
    return {
      count:''
    }
  },
  mounted() {
    //在这个子组件中,同样使用事件总线绑定了一个事件,事件名就是发送数据的自定义事件名
    //这个绑定事件的语句要写在mounted(钩子函数)内,表示在执行方法之前,首先执行钩子函数中的内容
    //在这个钩子函数中绑定了这个自定义事件,就可以接收到来自这个定义事件所发送的数据
    //数据的接受使用的是一个方法接受
    this.$bus.$on('send',this.rec_data)
  },
  methods:{
    //接收数据的方法,方法中的形参就是接收到的来自其他组件的数据
    //在方法内部可以对数据进行逻辑操作,这里只是简单的将数据存储到组件中的数据中进行展示而已
    rec_data(data){
      this.count = data
    }
  }
}
</script>

<style scoped>

</style>

简单案例:在了解什么是全局事件总线和全局事件总线的基本使用发方法之后,做一个简单的案例

实现效果:

Vue简单实例——全局事件总线

 根据效果图可以看到在我们点击组件A内的按钮时,组件B中的数据同样发生了改变,这就是全局数据总线一个最简单的应用场景

组件A的:

<template>
  <div>
    <p>组件A</p>
    <p>点击自增后将组件中的数据传递给组件B:<button type="button" @click="sendData">{{count}}</button></p>

  </div>
</template>

<script>
export default {
  name: "s_bus_1",
  data(){
    return {
      count:0
    }
  },
  methods:{
    sendData(){
      this.count++
      this.$bus.$emit('send',this.count)
    }
  }
}
</script>

<style scoped>

</style>

组件B:

<template>
  <div>
    <p>组件A</p>
    <p>点击自增后将组件中的数据传递给组件B:<button type="button" @click="sendData">{{count}}</button></p>

  </div>
</template>

<script>
export default {
  name: "s_bus_1",
  data(){
    return {
      count:0
    }
  },
  methods:{
    sendData(){
      this.count++
      this.$bus.$emit('send',this.count)
    }
  }
}
</script>

<style scoped>

</style>

App组件:

<template>
  <div id="app">
    <h1>组件A向总线上报事件</h1>
    <s_bus_1></s_bus_1>
    <h1>组件B通过总线监听相关事件</h1>
    <s_bus_2></s_bus_2>
  </div>
</template>

<script>
import s_bus_2 from "@/components/s_bus_2";
export default {
  name: 'App',
  components: {
    s_bus_1,
    s_bus_2
  },
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

注意点:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/153361.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!