data: () => ({
items: [
{ active: false, text: '...' },
{ active: false, text: '...' },
...
],
}),
<div
v-for="n in items"
v-text="n.text"
:class="[ { active: n.active }, 'toggle' ]"
@click="n.active = !n.active"
></div>
UPD. Вынесено из комментариев:
а как сделать чтобы не городить кучу даныx в data?
Типа, лучше городить ещё большую кучу html кода? Нет, так дела не делаются. По крайней мере, при использовании vue, тут данные первичны.
Хотя, можно и без данных - если вы разметку генерите автоматически, без копипасты:
data: () => ({
itemsCount: 5,
active: [],
}),
methods: {
toggle(item) {
const i = this.active.indexOf(item);
if (i === -1) {
this.active.push(item);
} else {
this.active.splice(i, 1);
}
},
},
<div
v-for="i in itemsCount"
v-text="`Item ${i}`"
:class="[ { active: active.includes(i) }, 'toggle' ]"
@click="toggle(i)"
></div>