Vue eventBus事件总线封装后再用的方式

yizhihongxing

Vue中经常会遇到子组件向父组件数据传递、兄弟组件之间数据共享等问题,这时候可以使用eventBus事件总线来解决。

事件总线就是一个事件中心,任何组件都可以向它注册事件或者触发事件,从而实现组件之间的通信。

① 创建eventBus

在Vue中,可以通过两种方式创建eventBus:

1.通过Vue实例创建:

// EventBus.js
import Vue from 'vue'
export default new Vue()

上面代码通过导出一个新建的Vue实例来创建eventBus。在其他组件中使用时,只需要导入该文件即可。

// ComponentA.vue
<script>
  import EventBus from '@/eventBus.js'
  export default {
    mounted() {
      // 向eventBus注册一个名为'eventA'的事件
      EventBus.$on('eventA', this.handleEventA)
    },
    methods: {
      handleEventA(data) {
        console.log(`eventA:${data}`)
      }
    }
  }
</script>

2.直接创建:

// EventBus.js
import { EventEmitter } from 'events'
export default new EventEmitter()

上面代码通过导出一个新建的EventEmitter实例来创建eventBus。在其他组件中使用时,也是导入该文件。

// ComponentB.vue
<script>
  import EventBus from '@/eventBus.js'
  export default {
    mounted() {
      // 向eventBus注册一个名为'eventB'的事件
      EventBus.on('eventB', this.handleEventB)
    },
    methods: {
      handleEventB(data) {
        console.log(`eventB:${data}`)
      }
    }
  }
</script>

② 触发事件

在Vue中,可以使用$emit方法触发事件,也可以直接调用eventBus的emit方法。

// ComponentC.vue
<template>
  <button v-on:click="emitEvent">触发事件</button>
</template>
<script>
  import EventBus from '@/eventBus.js'
  export default {
    methods: {
      emitEvent() {
        // 触发名为'eventC'的事件
        EventBus.emit('eventC', { msg: 'Hello, world!' })
      }
    }
  }
</script>

其他组件接收到该事件后,就可以根据需求执行相应的操作。

// ComponentD.vue
<script>
  import EventBus from '@/eventBus.js'
  export default {
    mounted() {
      // 向eventBus注册一个名为'eventC'的事件
      EventBus.on('eventC', this.handleEventC)
    },
    methods: {
      handleEventC(data) {
        console.log(`eventC:${data.msg}`)
      }
    }
  }
</script>

以上就是使用eventBus实现组件之间通信的完整攻略,通过创建eventBus实例和触发事件,就可以让不同组件之间实现数据的共享和传递。

示例1:父子组件之间的通信

// Parent.vue
<template>
  <div>
    <h1>{{ message }}</h1>
    <Child></Child>
  </div>
</template>
<script>
  import Child from '@/components/Child.vue'
  import EventBus from '@/eventBus.js'
  export default {
    components: {
      Child
    },
    data() {
      return {
        message: ''
      }
    },
    mounted() {
      EventBus.$on('child-event', (data) => {
        this.message = data
      })
    }
  }
</script>

// Child.vue
<template>
  <button v-on:click="sendMessage">向父组件传递数据</button>
</template>
<script>
  import EventBus from '@/eventBus.js'
  export default {
    methods: {
      sendMessage() {
        EventBus.$emit('child-event', '这是来自子组件的数据')
      }
    }
  }
</script>

在父组件中监听子组件传递的事件,一旦接收到事件,就更新组件的数据。

示例2:兄弟组件之间的通信

// ComponentA.vue
<template>
  <button v-on:click="sendMessage">向兄弟组件传递数据</button>
</template>
<script>
  import EventBus from '@/eventBus.js'
  export default {
    methods: {
      sendMessage() {
        EventBus.$emit('event-a', '这是来自ComponentA的数据')
      }
    }
  }
</script>

// ComponentB.vue
<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>
<script>
  import EventBus from '@/eventBus.js'
  export default {
    data() {
      return {
        message: ''
      }
    },
    mounted() {
      EventBus.$on('event-a', (data) => {
        this.message = data
      })
    }
  }
</script>

在ComponentA中触发事件,ComponentB监听该事件并更新自身的数据。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue eventBus事件总线封装后再用的方式 - Python技术站

(0)
上一篇 2023年6月13日
下一篇 2023年6月13日

相关文章

  • 如何在 Redis 中使用管道(pipeline)来提高性能?

    Redis 是一种高性能的键值存储数据库,支持多种数据结构,包括字符串、哈希表、列表、集合和有序集合等。Redis 的管道(pipeline)是一种批量操作 Redis 数据库的方式,可以显著提高 Redis 数据库的性能。下面是如何在 Redis 中使用管道来提高性能的完整使用攻略。 连接 Redis 数据库 在使用 Redis 的管道前,我们需要先连接 …

    python 2023年5月12日
    00
  • Python强化练习之Tensorflow2 opp算法实现月球登陆器

    Python强化练习之Tensorflow2opp算法实现月球登陆器 本文将介绍如何使用Tensorflow 2.0实现opp算法来控制月球登陆器的着陆。我们将介绍opp算法的原理实现步骤,并提供两个示例,分别演示如何使用Python实现简单和复杂的月球着陆控制。 opp法原理 opp算法是一种基于模型预测控制(MPC)的控制法。该算法通过预测未来状态来计算…

    python 2023年5月14日
    00
  • python代码实现烟花实例

    下面是详细讲解“Python代码实现烟花实例”的完整攻略。 1. 准备 在开始编写代码之前,请确保你已经了解了以下知识点: Python编程语言基础 Pygame游戏开发库的基础使用方法 随机数生成函数的使用 同时,你需要在电脑上安装好Python和Pygame相关的开发环境。如果你还没有掌握这些知识点和技能,可以先去学习一下。 2. 编写代码 下面是Pyt…

    python 2023年5月19日
    00
  • Python常用base64 md5 aes des crc32加密解密方法汇总

    Python常用加密解密方法汇总 在Python中,常用的加密解密方法有许多,比如base64、md5、aes、des、crc32等等。本文将对这些方法进行详细的讲解,并提供一些使用示例。 base64加密解密 base64是一种将二进制数据编码为ASCII字符的方法,通常用于在HTTP协议、电子邮件、XML等场景下传输较长的标识信息,以便于处理和传输。Py…

    python 2023年5月31日
    00
  • Python使用matplotlib绘制Logistic曲线操作示例

    下面我来详细讲解“Python使用matplotlib绘制Logistic曲线操作示例”的完整攻略。 1. 简介 Logistic曲线,也称S曲线,是一种常用于描述生物学、经济学等领域中,样本数量变化趋势的曲线图。在Python中,我们可以使用matplotlib库来轻松绘制Logistic曲线。 2. 绘制Logistic曲线 首先,我们需要导入matpl…

    python 2023年6月5日
    00
  • fastapi篇(一)

    fastapi是一个高性能的web开发框架 性能极高,可与 NodeJS, Go 媲美。(得益于Starlette和Pydantic)。 Starlette 是一个轻量级 ASGI 框架/工具包。它非常适合用来构建高性能的 asyncio 服务,并支持 HTTP 和 WebSockets。 官方网址:https://www.starlette.io/   P…

    python 2023年5月9日
    00
  • python 中raise用法

    当Python执行期间发生某些异常错误,可以使用raise语句来引发异常。通过raise语句抛出的异常必须是某个已定义异常类的实例,或是某个继承自Exception类的实例。这里是关于Python中raise用法的详细攻略。 什么是Python中的raise? raise语句通常用于抛出一个异常。当出现某种错误时,可以使用raise语句抛出异常并终止程序,可…

    python 2023年5月13日
    00
  • 如何利用python实现kmeans聚类

    当我们需要对大量数据进行分类时,k-means聚类是一种常用的方法。Python语言有很多扩展库可以方便地实现k-means聚类。下面是一些利用Python实现k-means聚类的攻略: 准备数据 首先需要准备数据,k-means聚类是根据欧几里得距离进行数据点的分类,所以确保你的数据是数值数据。一般格式如下: 数据点编号 x1 x2 … xn 1 1.…

    python 2023年6月6日
    00
合作推广
合作推广
分享本页
返回顶部