共计 1397 个字符,预计需要花费 4 分钟才能阅读完成。
前言
因为业务须要,须要在封装的弹窗组件中引入定时器实现倒计时成果,然而如果同时触发两个弹窗,就会导致计时器 bug,前一个弹窗的定时器没有被革除,倒计时就会错乱,此时想到的解决办法就是采纳队列模式,将每一个须要的弹窗存到队列中,顺次的将弹窗展现进去,同时革除定时器
什么是队列
队列(Queue) 是先进先出(FIFO, First-In-First-Out)的线性表。在具体利用中通常用链表或者数组来实现。队列只容许在尾部进行插入操作(入队 enqueue),在头部进行删除操作(出队 dequeue)。队列的操作形式和堆栈相似,惟一的区别在于队列只容许新数据在后端进行增加。
JavaScript 实现队列的成果
function ArrayQueue(){var arr = [];
// 入队操作
this.push = function(element){arr.push(element);
return true;
}
// 出队操作
this.pop = function(){return arr.shift();
}
// 获取队首
this.getFront = function(){return arr[0];
}
// 获取队尾
this.getRear = function(){return arr[arr.length - 1]
}
// 清空队列
this.clear = function(){arr = [];
}
// 获取队长
this.size = function(){return length;}
}
和 vue 封装的弹窗组件应用
首先要配合组件封装队列要进行批改
class Queue {dataStore = []
constructor(){this.dataStore=[]
}
enqueue(e) {this.dataStore.push(e)
console.warn('入队',this.dataStore);
}
dequeue() {this.dataStore.shift()
console.warn('出队',this.dataStore);
}
front() {console.log(this.dataStore,'front')
return this.dataStore[0]()}
select(){return this.dataStore[0]
}
back() {return this.dataStore[this.dataStore.length - 1]
}
isEmpty() {if (this.dataStore.length == 0) {return true}
return false
}
toString() {return this.dataStore.join(',')
}
}
export default Queue
在弹出第一个队列的时候须要自执行。
在你的封装组件的函数中引入这个队列,同时实例化这个队列,写入两个办法.
const pushDialog = (eventName) => {if (queue.isEmpty()) {queue.enqueue(eventName);
openDialog();} else {queue.enqueue(eventName);
}
}
const openDialog = () => {
// 关上弹窗
queue.front();}
在装置的办法中将每一个弹窗退出队列中
须要留神的是,每个弹窗是要被销毁的,不然会导致办法反复。
举例在确认办法和定时器后怎么出队列和清空定时器
正文完
发表至: javascript
2020-07-22