Вы можете воспользоваться индексом элемента ..., доступным в директиве v-for (например, v-for="(item, i) in items"
), чтобы связать его (индекс элемента) с функцией, которая показывает элемент, изменив его свойство.:
Обновление : первоначальный ответ был удален после уточнения требований.
Поскольку вы предпочитаете не менять элементы, вы можете заключить их в объект Map
(как ключи) и сохранить параметры видимости отдельно как значения Map
.К сожалению, насколько мне известно, на данный момент Vue.js не поддерживает реактивность для Map
объектов, поэтому мне приходится запускать рендеринг вручную, используя forceUpdate
:
Vue.config.devtools = false;
Vue.config.productionTip = false;
Vue.component('child', {
template: '<p>Visible child</p>'
})
new Vue({
el: "#demo",
template: `
<div>
<div v-for="item in items">
<button @click="toggleChild(item)">Toggle child</button>
<div>{{item.name}}</div>
<child v-if="isVisible(item)" :item="item"></child>
</div>
</div>
`,
data () {
return {
itemsMap: new Map(
[
{ name: 'test1' },
{ name: 'test2' }
].map(item => [item, { visible: false }])
)
};
},
methods: {
toggleChild(item) {
this.itemsMap.set(item, { visible: !this.itemsMap.get(item).visible });
this.$forceUpdate();
},
isVisible(item) {
return this.itemsMap.get(item).visible;
}
},
computed: {
items: function() {
return Array.from(this.itemsMap.keys());
}
}
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="demo"></div>