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

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日

相关文章

  • 如何为Python终端提供持久性历史记录

    为Python终端提供持久性历史记录是一个非常实用的功能。Python自带了一个REPL(Read-Eval-Print Loop)交互式解释器,该解释器默认提供的历史记录是一次性的,每次重新启动一下终端都会清空。下面是如何为Python终端提供持久性历史记录的完整攻略。 1. 安装readline库 readline库是一个用于提供终端输入历史记录的库,可…

    python 2023年6月2日
    00
  • Python工程师面试题 与Python Web相关

    以下是“Python工程师面试题与PythonWeb相关”的完整攻略: 一、PythonWeb基础 1.1 什么是WSGI? WSGI(Web Server Gateway Interface)是Python Web应用程序和Web服务器之间的标准接口。它定义了Web服务器如何与Python Web应用程序通信,以及Python Web应用程序如何响应Web…

    python 2023年5月14日
    00
  • Python按照list dict key进行排序过程解析

    Python按照listdictkey进行排序过程解析 在Python中,可以使用sorted()函数对列表中的元素进行排序。如果列表中的元素是字典可以使用key参数指定按照哪个键进行排序。本攻略将详细介绍Python按照listdictkey进行排序的过程,包括如使用sorted()函数按照字典键进行排序、如何使用lambda函数按照字典值进行排序等方面。…

    python 2023年5月13日
    00
  • Python 从列表中取值和取索引的方法

    在Python中,列表是一种常用的数据类型,它可以存储多个值,并且可以根据索引值来访问和修改列表中的元素。本攻略将详细介绍如何从列表中取值和取索引的方法,包括基本语法、示例说明和常见问题解答等方面。 基本语法 在Python中,可以使用方括号[]和索引值来访问列表中的元素。列表的索引值从0开始,表示列表中的第一个元素。以下是一个示例代码,演示如何从列表中取值…

    python 2023年5月13日
    00
  • Python中不可错过的五个超有用函数

    下面我将为你详细讲解“Python中不可错过的五个超有用函数”的攻略。 1. map函数 作用: map()会根据提供的函数对指定序列做映射。这里的“映射”指的是,在应用于序列中的每个项目时,该函数所执行的操作,例如:对序列中的所有元素求平方、将所有元素都乘以2等。map()返回一个列表,其中包含应用指定函数的结果。 语法: map(function, it…

    python 2023年6月5日
    00
  • Python 如何安装Selenium(推荐)

    下面是详细讲解“Python 如何安装Selenium(推荐)”的完整攻略。 1. 确认安装Python和pip 在安装Selenium之前,要先确认已经在电脑上安装了Python和pip。如果没有的话,可以参考以下链接进行安装:- Python官网:https://www.python.org/downloads/- pip官网:https://pip.p…

    python 2023年5月18日
    00
  • Python中list列表的赋值方法及遇到问题处理

    在Python中,列表是一种常用的数据类型,可以存储多个元素。本文将详细讲解Python中list列表的赋值方法及遇到问题处理,包括浅拷贝和深拷贝区别、如何避免浅拷贝带来的问题以及如何使用()函数进行深拷贝。并提供两个实例说明。 浅拷贝和深拷贝的区别 在Python中,赋值操作会创建新的对象,并将其引用赋值给变量。对于列表来说,赋值操作会创建一个新的列表对象…

    python 2023年5月13日
    00
  • Python pandas中read_csv参数示例详解

    下面是详细的攻略: Python pandas中read_csv参数示例详解 pandas是Python中一个非常流行的数据处理库,其中的read_csv()函数可以用于读取CSV文件。read_csv()函数有很多参数,本文将介绍其中一些常用的参数及其用法。 参数说明 read_csv()函数的常用参数如下: filepath_or_buffer:CSV文…

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