IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 使用 vue 事件总线(EventBus) -> 正文阅读

[JavaScript知识库]使用 vue 事件总线(EventBus)

EventBus的简介

EventBus又称为事件总线。在Vue中可以使用EventBus来作为沟通桥梁的概念,就像是所有组件共用相同的事件中心,可以向该中心注册发送事件或接收事件,所以组件都可以上下平行地通知其他组件,但也就是太方便所以若使用不慎,就会造成难以维护的灾难,因此才需要更完善的Vuex作为状态管理中心,将通知的概念上升到共享状态层次。

如何使用EventBus

初始化

首先创建事件总线并将其导出,方便其他模块使用或者监听它,有两种方式来处理

第一种,创建一个event_bus.js文件

// event_bus.js

import Vue from 'vue';
export const EventBus = new Vue();

另外一种方式,直接在main.js把EventBus挂载到Vue原型上面

// main.js

Vue.prototype.$EventBus = new Vue();

发送事件(EventBus.$emit)

// a.vue
<template>
	<button @click="decrease">-</button>
</template>

<script>
	import { EventBus } from '../event_bus.js';
	export default {
		name: 'a',
		data () {
			return {
				num: 1,
				deg: 180
			}
		},
		
		methods: {
			decrease () {
				EventBus.$emit('decreased', {
					num: this.num,
					deg: this.deg
				})
			}
		}
	}
</script>

// b.vue
<template>
	<button @click="increment">+</button>
</template>

<script>
	import {EventBus } from '../event_bus.js';
	export default {
		name: 'b',
		data () {
			return {
				num: 1,
				deg: 180
			}
		},

		methods: {
			increment () {
				EventBus.$emit('incremented', {
					num: this.num,
					deg: this.deg
				})
			}
		}
	}
</script>

上面我们在a和b分别发送了decreased和incremented,接下来,需要在另一个组件中接收这两个事件

接收事件(EventBus.$on)

现在可以在组件App.vue中使用EventBus.$on接收事件

<template>
	<div id="app">
		<div :style="{transform: 'rotateY(' + degValue + 'deg)'}"></div>
		<div class="front">
			<div class="increment">
				<A />
			</div>
			<div class="show-front">
				{{ fontCount }}
			</div>
			<div class="decrement">
				<B />
			</div>
		</div>
		<div class="back">
			<div class="increment">
				<A />
			</div>
			<div class="show-back">
				{{ backCount }}
			</div>
			<div class="decrement">
				<B />
			</div>
		</div>
	</div>
</template>

<script>
	import A from './components/a';
	import B from './components/b';
	export default {
		name: 'App',
		components: {
			A,
			B
		},
		data () {
			degValue: 0,
			fontCount: 0,
			backCount: 0
		},
		
		mounted () {
			EventBus.$on('incremented', ({num, deg}) => {
				this.fontCount += num;
				this.$nextTick(() => {
					this.backCount += num;
					this.degValue += deg;
				})
			});
			EventBus.$on('decreased', ({num, deg}) => {
				this.fontCount -= num;
				this.$nextTick(() => {
					this.backCount -= num;
					this.degValue -= deg;
				})
			})
		}
	}
</script>

移除事件监听者

import { EventBus } from './event_bus.js';
EventBus.$off('decreased', {})

或者使用全局EventBus挂载到Vue.prototype上面

// vue_bus.js

const install = function (Vue) {
	const Bus = new Vue({
		methods: {
			emit (event, ...args) {
				this.$emit(event, ...args);
			},
			on (event, callback) {
				this.$on(event, callback);
			},
			off (event, callback) {
				this.$off(event, callback);
			}
		}
	});
	Vue.prototype.$bus = Bus;
};

export default install;

在main.js中使用插件

import VueBus from './vue_bus';
Vue.use(VueBus);

使用vue-bus有两点需要注意,第一是 b u s . o n 应 该 在 c r e a t e d 钩 子 内 使 用 , 如 果 在 m o u n t e d 使 用 , 它 可 能 接 受 不 到 其 他 组 件 来 自 c r e a t e d 钩 子 发 出 的 事 件 ; 第 二 点 是 使 用 了 bus.on应该在 created钩子内使用,如果在mounted使用,它可能接受不到其他组件来自created钩子发出的事件;第二点是使用了 bus.oncreated使mounted使created使bus.on,在beforeDestroy钩子里应该使用$bus.off解除

created () {
	this.$bus.on('handleChange', this.handleClick);
}

beforedestroy () {
	this.$bus.off('handleChange', this.handleClick);
}
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-18 10:03:42  更:2021-09-18 10:04:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 23:34:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码