vue-happy-bus
Version:
Event Bus for Vue2. automatically cancel listening events when destroyed.
95 lines (83 loc) • 2.7 kB
JavaScript
/*!
name: vue-happy-bus
version: 1.0.3
author: tangdaohai@outlook.com
github: https://github.com/tangdaohai/vue-happy-bus
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('vue')) :
typeof define === 'function' && define.amd ? define(['exports', 'vue'], factory) :
(factory((global['happy-bus'] = {}),global.Vue$));
}(this, (function (exports,Vue$) { 'use strict';
Vue$ = Vue$ && Vue$.hasOwnProperty('default') ? Vue$['default'] : Vue$;
var version = "1.0.3";
var Vue = Vue$;
if (typeof window !== 'undefined' && window.Vue) {
Vue = window.Vue;
}
// 记录所有的事件类型与事件函数
var EventStore = {};
var Bus = new Vue();
// 移除所有事件的方法
var destroyHandler = function destroyHandler() {
// this 为调用此方法的vue组件
var currentEventObj = EventStore[this._uid];
if (typeof currentEventObj === 'undefined') {
return;
}
for (var type in currentEventObj) {
var key = Array.isArray(type) ? type.join(',') : type;
// Bus 解绑事件
Bus.$off(type, currentEventObj[key]);
}
// 删除记录的事件集合
delete EventStore[this._uid];
};
var BusFactory = function BusFactory(vm) {
// 当前调用组件的 destroyed 钩子
var destroyed = vm.$options.destroyed || [];
// 当前组件的唯一标示(vue生成的自增ID)
var uid = vm._uid;
// 初始化当前组件的事件集合对象
EventStore[uid] = {};
// 为当前组件挂载destroyed钩子
!destroyed.includes(destroyHandler) && vm.$once('hook:destroyed', destroyHandler);
return {
$on: function $on(type, handler) {
var key = Array.isArray(type) ? type.join(',') : type;
EventStore[uid][key] = handler;
Bus.$on(type, handler);
},
$off: function $off(type, handler) {
// $off() 时 type 为空,移除所有事件
if (!type) {
// 删除该uid下事件集合
delete EventStore[uid];
Bus.$off();
return;
}
var key = Array.isArray(type) ? type.join(',') : type;
// 删除对应的事件
delete EventStore[uid][key];
Bus.$off(type, handler);
},
$once: function $once() {
return Bus.$once.apply(Bus, arguments);
},
$emit: function $emit() {
return Bus.$emit.apply(Bus, arguments);
}
};
};
BusFactory.$emit = function () {
return Bus.$emit.apply(Bus, arguments);
};
BusFactory.$once = function () {
return Bus.$once.apply(Bus, arguments);
};
exports['default'] = BusFactory;
exports.Bus = Bus;
exports.version = version;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=happy-bus.js.map