UNPKG

@ylz/plugins

Version:

ylz plugins

139 lines (115 loc) 4.18 kB
/* * Copyright © 2019-2019 chenwenbin * Released under the MIT License. */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global = global || self, global['event-bus'] = factory()); }(this, function () { 'use strict'; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } } function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } /** * * 让在Vue中使用的EventBus也有生命周期 */ var EventBus = /*#__PURE__*/ function () { function EventBus(vue) { _classCallCheck(this, EventBus); if (!this.handles) { Object.defineProperty(this, 'handles', { value: {}, enumerable: false }); } this.Vue = vue; // _uid和EventName的映射 this.eventMapUid = {}; } _createClass(EventBus, [{ key: "setEventMapUid", value: function setEventMapUid(uid, eventName) { if (!this.eventMapUid[uid]) this.eventMapUid[uid] = []; this.eventMapUid[uid].push(eventName); // 把每个_uid订阅的事件名字push到各自uid所属的数组里 } }, { key: "$on", value: function $on(eventName, callback, vm) { // vm是在组件内部使用时组件当前的this用于取_uid if (!this.handles[eventName]) this.handles[eventName] = []; this.handles[eventName].push(callback); if (vm instanceof this.Vue) this.setEventMapUid(vm._uid, eventName); } }, { key: "$emit", value: function $emit() { var args = Array.prototype.slice.call(arguments); var eventName = args[0]; var params = args.slice(1); if (this.handles[eventName]) { var len = this.handles[eventName].length; for (var i = 0; i < len; i++) { var _this$handles$eventNa; (_this$handles$eventNa = this.handles[eventName])[i].apply(_this$handles$eventNa, _toConsumableArray(params)); } } } }, { key: "$offVmEvent", value: function $offVmEvent(uid) { var _this = this; var currentEvents = this.eventMapUid[uid] || []; currentEvents.forEach(function (event) { _this.$off(event); }); } }, { key: "$off", value: function $off(eventName) { delete this.handles[eventName]; } }]); return EventBus; }(); // 写成Vue插件形式,直接引入然后Vue.use($EventBus)进行使用 var $EventBus = {}; $EventBus.install = function (Vue, option) { window.$bus = Vue.prototype.$bus = new EventBus(Vue); Vue.mixin({ beforeDestroy: function beforeDestroy() { // 拦截beforeDestroy钩子自动销毁自身所有订阅的事件 this.$bus.$offVmEvent(this._uid); } }); }; return $EventBus; }));