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日

相关文章

  • 什么是Vue.js框架 为什么选择它?(第一课)

    什么是Vue.js框架? Vue.js是一款用于构建用户界面的渐进式JavaScript框架。它的核心是一个轻量级的,响应式的数据绑定系统,使开发者能够更轻松地构建交互式的用户界面。Vue.js还提供了一系列工具和插件,用于帮助我们轻松地组织和管理我们的代码。 总的来说,Vue.js框架有以下特点: 渐进式框架:Vue.js是一个渐进式的框架,这意味着你可以…

    Vue 2023年5月28日
    00
  • 在项目中封装axios的实战过程

    在项目中封装axios能够使代码更加简洁易读,并且可以统一管理请求接口、请求头等信息,提高代码的可维护性和可拓展性。下面是封装axios的完整攻略: 步骤一:安装axios并创建实例 首先需要在项目中安装axios依赖包,通过npm仓库下载、或者使用CDN链接在html文件中引入。 安装命令:npm install axios 接着,我们需要在项目中创建一个…

    Vue 2023年5月28日
    00
  • Vue中ref的用法及演示

    下面是“Vue中ref的用法及演示”的完整攻略。 一、什么是Vue中的ref ref 是 Vue 提供的一个属性,可以用来给元素或组件注册引用信息。比如,渲染后,我们可以使用$refs来访问这个元素。 二、Vue中ref的用法 1. 绑定ref 我们对组件(或元素)绑定ref属性,Vue将会提供一个组件实例(或元素)的引用,我们在组件内可以使用 this.$…

    Vue 2023年5月28日
    00
  • vue3中reactive数据被重新赋值后无法双向绑定的解决

    在Vue3中,数据响应式的实现由Vue2中的Object.defineProperty改为了ES6的Proxy,使得Vue3的响应式系统在性能和功能上都有了提升。但是,在Vue3中,当我们直接给响应式对象中的属性进行重新赋值时,这个属性就会脱离响应式系统,从而失去了双向绑定的功能,即无法自动更新页面。下面给出两个示例,分别说明这个问题的存在及解决方式。 问题…

    Vue 2023年5月27日
    00
  • 对VUE中的对象添加属性

    对VUE中的对象添加属性,可以通过以下步骤进行: 步骤1:定义一个VUE对象 <script> export default { data () { return { user: { name: ‘张三’, age: 20 } } } } </script> 步骤2:添加属性 接下来就可以随时添加属性了,可以通过以下两种方式: 方式1…

    Vue 2023年5月28日
    00
  • 基于vue2.0+vuex的日期选择组件功能实现

    下面是关于“基于vue2.0+vuex的日期选择组件功能实现” 的完整攻略。 1. 确定需求 在开发一个基于 vue2.0+vuex 的日期选择组件之前,首先需要确定几个核心需求: 可以显示当前选择的日期 可以手动选择日期 可以通过快捷按钮选择日期(比如“今天”、“明天”、“本周”等) 可以显示所选日期所对应的具体内容(比如日程安排等) 可以支持选择日期范围…

    Vue 2023年5月29日
    00
  • await 错误捕获实现方式源码解析

    让我们来详细讲解一下“await 错误捕获实现方式源码解析”的完整攻略。 什么是 await? 在 JavaScript 中,await 关键字可以用于暂停执行异步函数,并等待该异步函数的返回结果。我们可以使用 await 来获取异步操作中的结果,而不必使用回调函数或者 Promise 链来处理异步结果。 await 的错误捕获实现方式 在使用 await …

    Vue 2023年5月28日
    00
  • 详解template标签用法(含vue中的用法总结)

    详解template标签用法(含vue中的用法总结) 简介: <template> 标签是一个通用的占位符元素,可以作为组件的模板,也可以作为一段代码片段,使你可以在渲染这段代码片段时,避免包含在页面中。这个标签在Vue的使用中尤其重要,在Vue的单文件组件中大量使用,尤其是作为组件的模板。 基本用法: <template> 标记的作…

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