前端-vue之事件总线

组件通信之事件总线



前言

最近一个vue3项目中,涉及到平级组件和是跨越多层嵌套的组件间的事件通信需求,经过查阅选择了事件总线机制来解决,特此记录总结。


一、事件总线是什么?

Vue 事件总线是一种用于在 Vue 应用程序中进行组件间通信的模式。它允许不同组件之间通过一个中央的事件通道来传递消息和数据,而不需要显式地建立父子组件关系或通过 props 传递数据。事件总线可以简化组件间通信的复杂性,尤其是在跨越多层级的组件之间传递数据时特别有用。

二、实现方式

1.使用 Vue 实例作为事件总线

代码如下(示例):

1.创建一个 Vue 实例作为事件总线,并在全局范围内使用:

// eventBus.js

import Vue from 'vue';

// 创建一个独立的 Vue 实例作为事件总线
const eventBus = new Vue();

export default eventBus;

2.在需要通信的组件中,导入事件总线并使用它来发送和接收事件:

// ComponentA.vue

<template>
  <div>
    <button @click="sendMessage">Send Message</button>
  </div>
</template>

<script>
import eventBus from './eventBus';

export default {
  methods: {
    sendMessage() {
      // 发送消息到事件总线
      eventBus.$emit('message', 'Hello from Component A');
    },
  },
};
</script>
// ComponentB.vue

<template>
  <div>
    <p>{{ receivedMessage }}</p>
  </div>
</template>

<script>
import eventBus from './eventBus';

export default {
  data() {
    return {
      receivedMessage: '',
    };
  },
  mounted() {
    // 监听事件总线的消息
    eventBus.$on('message', (message) => {
      this.receivedMessage = message;
    });
  },
};
</script>

2.使用eventBus

代码如下(示例):

1.在父组件中创建eventBus并通过provide方法提供出去:

// parent.tsx

/** create event bus */
const eventBus = {
    listeners: [],

    $on(listener) {
        this.listeners.push(listener)
    },

    $emit(...args) {
        this.listeners.forEach(listener => {
            listener(...args)
        });
    }
}
/** provide event bus */
provide('eventBus', eventBus)

2.在需要使用的组件中获取并使用:

// type.ts

/** define eventBus's type */
interface EventBus {
    $on: Function,
    $emit: Function
}

export type {
    EventBus
}
// componentA.tsx

const eventBus = inject<EventBus>('eventBus')
/** call clear console event in bro component with event bus */
const clearConsole = () => {
    eventBus.$emit('clearConsole')
}
// componentB.tsx

const eventBus = inject<EventBus>('eventBus')
onMounted(() => {
  /** listen to clear console event called by bro component */
  eventBus.$on((action: string) => {
     if('clearConsole' == action) {
         clearConsole()
     }
  })
})

总结

以上就是今天要讲的内容,本文仅仅简单介绍了vue事件总线的使用,它的底层原理和代码实现有兴趣的同学可以去vue源码中钻研学习。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尽力回答你的问题。以下是前端Vue面试八股文: 1. Vue的生命周期有哪些?它们分别在什么时候触发? 答:Vue的生命周期分为8个阶段,分别是:beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDestroy、destroyed。它们的触发顺序如下: beforeCreate -> created -> beforeMount -> mounted -> beforeUpdate -> updated -> beforeDestroy -> destroyed 2. Vue组件之间如何通信? 答:Vue组件之间通信有以下几种方式: (1)props/$emit:父组件通过props向子组件传递数据,子组件通过$emit触发事件向父组件传递数据。 (2)$parent/$children:通过$parent/$children访问父/子组件实例,从而进行数据传递。 (3)$refs:通过$refs访问子组件实例,从而进行数据传递。 (4)event bus:通过事件总线来进行组件之间的通信。 (5)Vuex:使用Vuex来进行全局状态管理。 3. Vue中的路由是什么?如何实现路由跳转? 答:Vue中的路由是指根据不同的URL地址展示不同的内容。Vue中可以使用vue-router来实现路由功能。实现路由跳转可以使用以下两种方式: (1)使用<router-link>标签来实现路由跳转。 (2)使用$router.push()方法来实现路由跳转。 4. Vue中的computed和watch有什么区别? 答:computed和watch都是Vue中用于监听数据变化的方法,它们的区别如下: (1)computed是计算属性,依赖于其他属性的值,并且computed的值会被缓存,只有当依赖的属性发生变化时才会重新计算。而watch是监听属性的变化,当属性发生变化时会执行回调函数。 (2)computed适用于计算复杂的属性,而watch适用于监听某个属性的变化并执行相应的操作。 5. Vue中的v-model指令是什么?如何使用? 答:v-model指令是Vue中用于实现双向数据绑定的指令。它可以将表单元素的值与Vue实例中的数据进行绑定,从而实现数据的自动同步。使用v-model指令可以将表单元素的值与Vue实例中的数据进行绑定,例如: <input v-model="message" />

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值