напиши директиву отдельно от компонента и потом повесь на нужный элемент.
import {Directive, DirectiveBinding} from "vue";
export const clickOutside: Directive<HTMLElement, string> = {
mounted(el: HTMLElement, bind: DirectiveBinding) {
if(bind.value) {
window.addEventListener('click', (e) => {
if(!el.contains(<HTMLElement>e.target)) {
bind.value()
}
})
}
},
unmounted: function (el: HTMLElement, bind: DirectiveBinding) {
if(bind.value) {
window.removeEventListener('click', (e) => {
if(!el.contains(<HTMLElement>e.target)) {
bind.value()
}
})
}
}
}
Это общая директива. И затем вешаешь на любой компонент какой нужен на корневой div
<div v-click-outside="() => isFilterOpen = false">
....
</div>
А твоя директива закрывает все сразу компоненты, потому что это логично. Если она работает на всех твоих фильтрах, то клик вне конкретного фильтра - его закрывает. Соответственно если у тебя открыты все сразу фильтры и ты кликнешь ГДЕ УГОДНО на странице, то закроются все фильтры сразу.
Конечно, если кликнуть на фильтре вместо "где угодно", то закроются все фильтры кроме того, на котором ты кликнул