Переключить" активный " класс между дочерними элементами vueJS.Два
Я просто хочу знать, как это сделать vue.JS way, прямо сейчас я могу переключать active
класс на одном элементе, когда я нажимаю другой элемент,active
класс по-прежнему отображается на предыдущем элементе, вот моя настройка:
FileOne.вю (родительский компонент)
// Say that I have 5 Items I am rendering here:
<template>
<ul v-for="item in items">
<my-list-item :item-title="article.title"
:item-content="article.content"> </my-list-item>
</ul>
</template>
<script>
import Items from './FileTwo'
export default {}
</script>
fileTwo.вю (дочерние компоненты)
// When I click each Item the `active` class should be applied to the current Item and removed from previous item:
<template>
<li :class="{'active': isRowActive}" @click.stop="toggleRowActive">
<h1>{{articleTitle}}</h1>
<p>{{itemContent}}</p>
</li>
</template>
<script>
export default {
name: 'my-list-item',
data: function () {
return {
isRowActive: false,
}
},
props: {
articleTitle: String,
articleContent: String,
},
toggleRowFn() {
this.isRowActive = !this.isRowActive;
this.showBtnReadContent = true;
},
}
</script>
2 ответов
одно из возможных решений: https://jsfiddle.net/wostex/63t082p2/28/
основная идея: если вы хотите обрабатывать дочерние состояния из родительского состояния, вы должны испустить событие "изменить свойство" из дочернего и обрабатывать вычисления внутри родительского. В моем примере я храню активный индекс Li внутри родительских данных и отправляю дочернее логическое свойство active
если текущий индекс активен или нет.
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<div id="app">
<ul>
<my-list-item :title="item.title"
:content="item.content"
v-for="(item, index) in items"
:active="index === activeLiIndex"
:index="index"
:key="item.title"
@newactive="activeLiIndex = $event"
></my-list-item>
</ul>
</div>
<script type="text/x-template" id="my-list-item">
<li :class="{'active': active}" @click.stop="toggleRowActive">
<h1>{{title}}</h1>
<p>{{content}}</p>
</li>
</script>
new Vue({
el: '#app',
data: {
items: [
{title: 'Title 1', content: 'Content 1'},
{title: 'Title 2', content: 'Content 2'}
],
activeLiIndex: null
},
components: {
'my-list-item': {
template: '#my-list-item',
props: ['title', 'content', 'active', 'index'],
methods: {
toggleRowActive() {
this.$emit('newactive', this.index);
}
}
}
}
});
кроме того, как вы можете видеть,v-for
используется на ребенка сам компонент в вашем случае. В вашем собственном примере вы создали кучу ul
теги вместо li
предметы.
обычно я сохраняю идентификатор активного элемента в хранилище (Vuex) или данные (в компоненте). Когда активный идентификатор равен идентификатору элемента, я устанавливаю связанный класс, как показано ниже.
в свойстве data:
data: function () {
return {
activeItemId: ''
}
}
методы:
setActiveItemId(itemIndex) {
this.activeItemId = itemIndex
}
шаблон:
<ul class="ready-design">
<li class="ready-design__item" v-for="(item, itemIndex) in clipArts">
<a href="javascript:void(0);"
class="ready-design__link"
:class="{'is-chosen': activeItemId === itemIndex}"
@click="setActiveItemId(itemIndex)">
<img class="..." width="70" height="70" alt="..." src="...">
</a>
</li>
</ul>
поэтому мне не нужно удалять класс из неактивных элементов.