class myEvent {
constructor(){
this.Eventarr= [];
this.on = this.on.bind(this);
this.emit = this.emit.bind(this);
this.off = this.off.bind(this);
this.once = this.once.bind(this);
}
on(type,callback){
if( findEventarrIndex(this,type) < 0 ) {
let Event = new CustomEvent(type);
let listenerfun = () =>{
let params = this.Eventarr.filter(value => value.type === type)[0].params
callback(...params);
}
this.Eventarr.push({Event,type,params:null,once:false,listenerfun});
window.addEventListener(type,listenerfun);
} else{
throw new Error(`已经定义 ${type} 事件无法重复定义`)
}
}
off(type){
let index = findEventarrIndex(this,type)
if( index>=0 ) {
window.removeEventListener(this.Eventarr[index].type, this.Eventarr[index].listenerfun);
this.Eventarr.splice(index,1);
}else {
throw new Error(`找不带事件 ${type} 无法移除`)
}
}
emit(type, ...rest){
let index = findEventarrIndex(this,type)
if( index >= 0 ){
this.Eventarr[index].params = rest;
window.dispatchEvent(this.Eventarr[index].Event);
} else {
throw new Error(type+ '事件未定义')
}
}
once(type,callback){
if( findEventarrIndex(this,type) < 0 ) {
let Event = new CustomEvent(type);
let listenerfun = () =>{
let index = findEventarrIndex(this,type)
callback(...this.Eventarr[index].params);
window.removeEventListener(this.Eventarr[index].type, this.Eventarr[index].listenerfun);
this.Eventarr.splice(index,1);
}
this.Eventarr.push({Event,type,params:null,once:true,listenerfun});
window.addEventListener(type,listenerfun);
}else{
throw new Error(`已经定义 ${type} 事件无法重复定义`)
}
}
}
const findEventarrIndex = (vm, type) =>{
return vm.Eventarr.findIndex(value => value.type === type )
}
const install = (Vue) =>{
Vue.prototype.$myEvent = new myEvent()
}
export default {
install
}