Обычный способ создать контроллер типа радиогруппы (где одновременно может быть выбран только один элемент) - это иметь переменную, которая указывает, какой из них выбран. Затем каждый элемент сравнивает себя с выбранным, чтобы определить, должен ли он находиться в открытом состоянии.
Поскольку у вас есть несколько router-link
, которые не знают друг о друге, родительский объект должен будет иметь переменную индикатора which-one-is-selected. handleClick
вашего router-link
должно $emit
событие , которое родительский объект будет обрабатывать путем изменения переменной индикатора. И router-link
должен получить переменную-индикатор как prop и использовать ее в , вычисленном , чтобы установить класс open
соответствующим образом.
Ваш код может выглядеть следующим образом:
<template>
<router-link tag="li" class="nav-item nav-dropdown" :class="openClass" :to="url" disabled>
<div class="nav-link nav-dropdown-toggle" @click="handleClick"><i :class="icon"></i> {{name}}</div>
<ul class="nav-dropdown-items">
<slot></slot>
</ul>
</router-link>
</template>
<script>
export default {
props: {
name: {
type: String,
default: '',
selectedItem: Object
},
url: {
type: String,
default: ''
},
icon: {
type: String,
default: ''
}
},
computed: {
openClass() {
return this.selectedItem === this ? 'open' : '';
}
}
methods: {
handleClick(e) {
e.preventDefault();
this.$emit('setSelected', this);
}
}
};
</script>