Таким образом, идея заключается в том, чтобы применить addEventListener
к вашему документу, а также к самому компоненту (хост - выпадающий список). Для этого вы можете использовать жизненный цикл, например componentdidload
.
import {Component, h, Prop, Event, EventEmitter} from '@stencil/core';
@Component({
tag: 'spa-toolbar-item',
styleUrl: 'spa-toolbar-item.scss',
})
export class spaToolbarItem {
@Prop({reflectToAttr: true, mutable: true}) toggle: boolean = false;
@Prop({reflectToAttr: true}) type: string;
@Event() onToggle: EventEmitter;
private hostElement;
private buttonElement;
closeDropdown(){
this.toggle = false;
}
toggleComponent(): void {
this.toggle = !this.toggle;
this.onToggle.emit({visible: this.toggle});
}
render() {
return
<Host ref={(el) => this.hostElement = el}>
//everything you had before in the return value
</Host>
}
componentDidLoad(){
document.addEventListener("click", ()=>{this.clickManager("document");}, true)
this.hostElement.addEventListener("click", ()=>{this.clickManager("dropdown");}, true)
}
private clickManager(identifier){
if(identifier == "dropdown"){
//the clicked dropdown -> active dropdown
this.toggleComponent();
return;
}
//all non active Dropdowns
this.closeDropdown();
}
}
. Как вы видите, у нас есть два события, которые вызывают clickManager. Первый - это документ, а второй - раскрывающийся список, по которому вы щелкнули. Конечно, вы должны удалить событие onclick на кнопке, но этот код не работает должным образом. Теперь вы можете решить, что произойдет, если вы щелкнете по раскрывающемуся списку и что произойдет со всеми неактивными раскрывающимися списками.
Это базовая концепция, которую вы можете адаптировать и изменить при необходимости.