我们先看个简单的例子,再根据需求扩展。
现在有个需求,三个按钮中选择了两个之后就不能先择第三个了,我们怎么实现呢,代码实现如下:
class Client {
constructor(nodes) {
this.nodes = [...nodes];
this.initEvent();
}
initEvent() {
this.nodes.forEach((item) => {
item.addEventListener('click', (e) => {
this.handleClick(e.target);
});
});
}
handleClick(ele) {
//过滤节点
const items = this.nodes.filter((item) => item.classList.contains('active'));
if(items.length === 2 && !items.includes(ele)) return;
ele.classList.toggle('active');
}
}
new Client(document.querySelectorAll('.box'));
现在又有个需求,三个按钮点击三个高亮之后,随机取消掉一个。这时候我们可以使用策略模式,策略一:点击某个高亮,策略二:最多只有两个高亮,策略三:点击三个按钮点击三个高亮之后,随机取消掉一个。
class Client {
constructor(nodes, strategy) {
this.nodes = [...nodes];
this.strategy = strategy;
this.initEvent();
}
initEvent() {
this.nodes.forEach((item) => {
item.addEventListener('click', (e) => {
this.handleClick(e.target);
});
});
}
handleClick(ele) {
this.strategy.process(ele, this.nodes);
}
}
//策略一
class Strategy1 {
process(ele, nodes){
ele.classList.toggle('active');
}
}
//策略二
class Strategy2 {
process(ele, nodes){
const items = nodes.filter((item) => item.classList.contains('active'));
if(items.length === 2 && !items.includes(ele)) return;
ele.classList.toggle('active');
}
}
//策略三
class Strategy3 {
process(ele, nodes){
ele.classList.toggle('active');
//every()方法用于检测数组所有元素是否都符合指定条件
if(nodes.every(item => item.classList.contains('active'))){
//随机取消一个
nodes.filter(item => item !== ele)[Math.floor(Math.random()*2)].classList.toggle('active');
}
}
}
new Client(document.querySelectorAll('.box'), new Strategy3());
策略三实现效果: