Преобразовать код под Vue.js
У меня есть функция на JQuery:
$('.dropdown-toggle').click(function(e){
e.preventDefault();
$(this).parent().toggleClass('open');
$(document).mouseup(function(e){
let item = $(".dropdown.open");
if (item.has(e.target).length === 0){
item.removeClass('open');
}
})
});
Можно ли ее как-то преобразовать чтобы она работала на Vue.js 3 ?
Я думал в верстке на каждый div[.dropdown-toggle] сделать типа
<div class="dropdown-toggle" @click="function...">...
На так как таких блоков много, я думаю это не лучшее решение.
Буду очень благодарен за помощь!
UPD. Вот что у меня получилось:
mounted() {
let dropdowns = this.$el.querySelectorAll('.dropdown-toggle');
dropdowns.forEach(dropdown => {
dropdown.addEventListener('click', function(event) {
let parent = event.target.closest('.dropdown');
parent.classList.toggle("open");
});
});
}
Но не могу понять как сделать чтобы класс open удалялся если кликнуть в любом другом месте страницы...
UPD. получилось сделать таким образом
window.addEventListener('mouseup', event => {
const opened_dropdown = this.$el.querySelector('.dropdown.open');
if (opened_dropdown) {
if ( !opened_dropdown.contains(event.target) ) {
opened_dropdown.classList.remove("open");
}
}
}, false);
Огромная просьба - если видите какие-то недостатки такого решения, или есть более изящный вариант, напишите в ответ.