@danilr

Почему цикл v-for Vue не работает для скрытых блоков?

Есть массив, в шаблоне через v-for выводятся блоки с информацией из массива. В каждом из блоков есть попапы, скрытые через v-if. Проблема в том, что при открытии любого попапа из цикла - в ней выводится информация из последнего элемента массива. Как это исправить?
<div class="watch-box" v-for="(watch, index) in watches" :key="index">
<div @click.self="openColors()" v-if="isColor" class="callback-overlay" v-cloak>
                    <div class="colors-popup">
                        <img @click="openColors()" class="close-pop" src="img/close.png">
                        <img class="colors-popup-img" :src=`img/catalog/${watch.model}/group.jpg`>
                    </div>
                </div>
</div>

new Vue({
    el: root,
    data:{
        watches: apiWatch,
        isColor: false
    },
    methods:{
        openColors(){
          this.isColor = !this.isColor;
        },
  • Вопрос задан
  • 357 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега Vue.js
Попапов много; свойство, управляющее их видимостью одно и по своему типу является логическим. Как вы собираетесь, имея в распоряжении всего два значения, управлять отображением 2, 3, 5, 1000 и т.д. элементов? Можно только показать всё/спрятать всё - поэтому вы и видите всегда последний элемент.

Разметку попапа выносите из цикла. Вместо логического значения храните объект (элемент watches, который хотите показать) или null (если в данный момент ничего показывать не надо):

data() {
  return {
    show: null,
    ...

Открытие попапа: @click="show = watch". Закрытие: @click="show = null". В шаблоне попапа исправляете watch на show: :src="`img/catalog/${show.model}/group.jpg`".
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы