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日

相关文章

  • Pandas DataFrame转换为字典的方法

    将Pandas DataFrame对象转换为字典通常用于将数据传递给其他接收字典类型的函数或程序。下面是将Pandas DataFrame对象转换为字典的方法: 1. 使用to_dict()方法 Pandas DataFrame的to_dict()方法通过将DataFrame的数据转换为一个字典来实现。该方法接受一个orient参数,指定字典的输出方向。默认…

    python 2023年5月13日
    00
  • 详解python路径拼接os.path.join()函数的用法

    当进行文件 or 文件夹拼接操作时,Python提供了os.path.join()函数。本文将详解os.path.join()函数并提供代码示例。 一、os.path.join()函数的用法 在Python操作文件时,经常需要处理文件路径合并问题。使用Python内置库os.path可以方便的处理平台间的差异,使用其中的os.path.join()函数可以实…

    python 2023年6月2日
    00
  • Python爬虫运用正则表达式的方法和优缺点

    Python爬虫运用正则表达式的方法和优缺点 在Python爬虫中,正则表达式是一种非常重要的工具,可以用于解析HTML、XML等文本数据。本攻略将详细讲Python爬中正则表达式的使用方法,包括正则表达式的基本语法、常用的正则表达式模式、以及何正则表达式解析HTML、XML等文本数据。同时,我们也会探讨正则表达式的优缺点。 正则表达式基本语法 正则表达式是…

    python 2023年5月14日
    00
  • python使用requests POST提交一个键多个值方式

    下面是关于Python使用requests POST提交一个键多个值的完整攻略。 什么是POST请求和多值提交? POST请求是一种HTTP的请求方法,与GET请求相对应,用于在HTTP上向指定的资源提交数据。 多值提交则是指在提交POST请求时,表单的某个键(key)对应了多个值(value)。 使用requests库发送POST请求 使用Python的r…

    python 2023年6月3日
    00
  • Python实现的自定义多线程多进程类示例

    下面是关于Python实现自定义多线程多进程类的完整攻略。 标准的Python多线程多进程实现 Python内置了threading和multiprocessing两个模块来实现多线程和多进程。 多线程示例 import threading class MyThread(threading.Thread): def __init__(self, name):…

    python 2023年6月6日
    00
  • 推荐技术人员一款Python开源库(造数据神器)

    当需要造数据进行测试或实验时,可以使用Python开源库生成数据。下面介绍一种生成数据的Python开源库,即Faker。 一、Faker简介 Faker是一个用于生成随机数据的Python第三方库,可生成各种各样的数据,如人名、地址、电子邮件、IP地址、电话号码、文本片段等。Faker所生成的数据都是随机的,并且生成的数据是符合规范的。 二、Faker的安…

    python 2023年5月18日
    00
  • python 自动提交和抓取网页

    Python 是一种功能强大的编程语言,可以编写自动化脚本来实现很多自动化操作,其中包括自动提交和抓取网页。在本文中,我们将为您详细介绍如何使用 Python 自动提交和抓取网页的完整攻略。 环境搭建 在开始之前,我们需要确保环境已经准备好。我们需要安装 Python 和一些必要的包,比如 requests 和 beautifulsoup4,在执行下面的命令…

    python 2023年5月14日
    00
  • python 格式化输出百分号的方法

    首先,在 Python 中,我们可以使用百分号 ( % ) 来格式化字符串。当我们需要将一个值插入到另一个字符串中时,我们可以在字符串中放置一个 %s,然后再使用另一个字符串中的变量来替换它。如果我们想要插入一个百分号,我们可以使用两个相邻的百分号 ( %% ) 来表示一个百分号。 以下是两个示例: 将一个字符串插入到另一个字符串中,并使用百分号来表示一个浮…

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