Vue全局事件总线你了解吗

当进行 Vue 项目开发时,有时需要在组件之间进行通信,常见的方式有props、自定义事件、Vuex等。除了这些方式,还可以使用Vue的全局事件总线来实现组件之间的通信。

什么是Vue全局事件总线?

Vue全局事件总线是通过Vue实例来实现的全局事件总线。Vue实例是一个事件代理,它中转和分发事件通知,从而实现各组件之间的通信。它的实现是通过创建一个Vue实例来实现:

// event-bus.js
import Vue from 'vue';
const EventBus = new Vue();
export default EventBus;

上面的代码中,我们创建了一个Vue的实例,并将其导出。这个实例用于事件监听和分发,我们可以在组件中引入它来实现组件之间的通信。

如何使用Vue全局事件总线?

使用Vue全局事件总线需要以下两步:

  1. 组件传递事件:在触发事件的组件中,使用$emit方法,向全局事件总线发送事件。
// component1.vue
<template>
  <div>
    <button @click="sendMessage">向另一个组件发送信息</button>
  </div>
</template>
<script>
import EventBus from './event-bus'
export default {
  methods: {
    sendMessage() {
      EventBus.$emit('message', 'Hello, I am Component1.');
    }
  }
}
</script>
  1. 组件接收事件:在监听事件的组件中,使用$on方法,监听全局事件总线中的事件。
// component2.vue
<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>
<script>
import EventBus from './event-bus'
export default {
  data() {
    return {
      message: ''
    }
  },
  mounted() {
    EventBus.$on('message', (msg) => {
      this.message = msg;
    });
  }
}
</script>

上述代码中,在触发事件的组件component1.vue中,我们向全局事件总线中发送了一个“message”事件,并携带了“Hello, I am Component1.”的信息。在监听事件的组件component2.vue中,我们通过$on方法监听了“message”事件,并在事件回调中更新了message参数值。这样,当我们在component1.vue组件中点击发送信息按钮后,component2.vue组件中的p标签就会显示“Hello, I am Component1.”的信息。

示例1:结合vue-router使用Vue全局事件总线

我们在项目中经常会使用vue-router进行页面的跳转。那么,如何才能在不同的页面之间传递数据呢?

我们可以将全局事件的实现放在路由配置文件中,这样就能够在任何组件中使用它了。

// router.js
import Vue from 'vue';
import Router from 'vue-router';
import EventBus from './event-bus';

Vue.use(Router);

export default new Router({
  routes: [
    {
      path: '/',
      name: 'home',
      component: Home
    },
    {
      path: '/about',
      name: 'about',
      component: About,
      beforeEnter(to, from, next) {
        EventBus.$emit('navigateTo', to.name);
        next();
      }
    }
  ]
});

在上述代码中,我们使用了beforeEnter导航守卫函数,可以在路由切换前触发,所以可以通过它来触发事件。在该函数中,我们向全局事件总线中发送了一个“navigateTo”事件,并携带了to.name的字符串值。

在监听“navigateTo”事件的组件中,我们只需要在mounted钩子函数中注册监听事件即可:

// component.vue
<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>
<script>
import EventBus from './event-bus'
export default {
  data() {
    return {
      message: ''
    }
  },
  mounted() {
    EventBus.$on('navigateTo', (routeName) => {
      this.message = `跳转到了名称为${routeName}的路由`;
    });
  }
}
</script>

在上述代码中,我们在监听“navigateTo”事件的组件中获取到了传递过来的routeName参数,并将其显示在页面上。

示例2:在子组件中使用全局事件总线

在某些情况下,我们需要在子组件中实现跨级组件的通信。例如,在一个组件中有一个子组件,我们要在子组件中实现向父组件发送事件的情况,这时候可以使用全局事件总线。

// parent.vue
<template>
  <div @click="changeCount">
    <child></child>
  </div>
</template>
<script>
import Child from './child.vue'
import EventBus from './event-bus';
export default {
  name: "Parent",
  components: {Child},
  data() {
    return {
      count: 0
    }
  },
  methods: {
    changeCount() {
      this.count++;
      EventBus.$emit('countChange', this.count);
    }
  }
}
</script>

在上述代码中,我们在父组件parent.vue中定义了一个数据count和一个方法changeCount。在changeCount方法中,我们先将count的值加一,然后向全局事件总线中发送了一个“countChange”事件,并将count参数值一起传递出去。

在子组件child.vue中,我们只需要在mounted钩子函数中注册监听“countChange”事件就可以获取到组件之间传递的参数了。

// child.vue
<template>
  <div>
    <p>父组件中count的值为{{ count }}</p>
  </div>
</template>
<script>
import EventBus from './event-bus';
export default {
  name: "Child",
  data() {
    return {
      count: -1
    }
  },
  mounted() {
    EventBus.$on('countChange', (count) => {
      this.count = count;
    });
  }
}
</script>

在上述代码中,我们在子组件child.vue中定义了一个数据count, 并在mounted钩子函数中注册监听“countChange”事件。当我们在父组件中调用changeCount方法时,就会通过事件总线将参数传递给子组件,从而实现了子组件获取父组件数据的效果。

以上就是使用Vue全局事件总线实现组件通信的完整攻略,希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue全局事件总线你了解吗 - Python技术站

(0)
上一篇 2023年5月29日
下一篇 2023年5月29日

相关文章

  • Vue3 composition API实现逻辑复用的方法

    当我们使用Vue3进行开发时,使用Vue Composition API可以极大地提升我们的开发效率。这里详细介绍了如何使用Vue3 Composition API实现逻辑复用的方法。 什么是Vue3 Composition API Vue3 Composition API是一种新的、基于函数的API,它可以让我们更灵活地组织我们的逻辑代码,提高代码的可读性…

    Vue 2023年5月28日
    00
  • vue-router钩子函数实现路由守卫

    下面为你详细讲解Vue Router钩子函数实现路由守卫的完整攻略。 钩子函数介绍 Vue Router提供了多个钩子函数,可以在路由发生变化时执行一些操作。以下是常用的钩子函数: beforeEach(to, from, next) :进入路由之前触发,next必须调用,才能进入下一个钩子。其中参数to和from分别表示即将进入的路由和即将离开的路由。 a…

    Vue 2023年5月28日
    00
  • vue 取出v-for循环中的index值实例

    下面我将详细讲解”vue 取出 v-for循环中的index值实例”的攻略。 1. 在v-for循环中使用index 使用v-for循环时,可以给它提供一个参数,这个参数将会被自动的设置为当前项的索引值。v-for的语法如下: <template> <div> <ul> <li v-for="(item, …

    Vue 2023年5月29日
    00
  • vue cli3 项目中如何使用axios发送post请求

    以下是使用 Axios 在 Vue CLI3 项目中发送 POST 请求的攻略步骤。 步骤一:安装 Axios 使用命令行工具进入 Vue CLI3 项目的根目录,然后运行以下命令,安装 Axios: npm install axios –save 步骤二:在 Vue 项目中使用 Axios 在 Vue 项目需要发送 POST 请求的组件中,引入 Axio…

    Vue 2023年5月28日
    00
  • vue.js实现简单计时器功能

    下面是关于“vue.js实现简单计时器功能”的完整攻略: 第一步:创建Vue实例 在HTML文件中,除了引入Vue.js,还需要新建一个div作为Vue实例的挂载点,并在JavaScript中创建Vue实例。Vue实例需要定义data、methods、computed属性。其中,data定义属性名和初始值;methods定义方法,并在其中使用this来访问属…

    Vue 2023年5月29日
    00
  • Vue实现输入框@功能的示例代码

    下面是关于“Vue实现输入框@功能的示例代码”的完整攻略。 1. 标准的输入框@功能实现 首先来看一下标准的输入框@功能的实现代码: <template> <div> <input type="text" v-model="content" @input="handleInput…

    Vue 2023年5月27日
    00
  • webpack4打包vue前端多页面项目

    关于“webpack4打包vue前端多页面项目”的攻略,我会从以下几个方面进行详细讲解: 安装webpack及相关依赖 配置webpack 多页面配置 示例说明 下面我们将一步一步进行讲解。 1. 安装webpack及相关依赖 首先,我们需要全局安装webpack和webpack-cli,这里我使用的是webpack4版本: npm install webp…

    Vue 2023年5月28日
    00
  • vue函数@click.prevent的使用解析

    当我们使用Vue.js开发前端应用时,经常会在模版中使用@click指令来响应用户的点击事件,在一般情况下,点击事件会导致页面的跳转或刷新等行为,但是有时候我们需要控制点击事件的默认行为,这时候就需要使用@click.prevent修饰符。 @click.prevent能够阻止点击事件的默认行为,例如在表单的提交按钮中使用@click.prevent可以阻止…

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