Vue js - показать / скрыть отдельный элемент в списке, созданном с помощью v-for - PullRequest
1 голос
/ 27 мая 2020

Я пытаюсь показать / скрыть отдельный элемент, так как v-for используется для многих объектов. Раньше у меня было showAeInfo как логическое, что приводило к тому, что все карты открывались / закрывались при нажатии одной кнопки. Я понял, что мне понадобится массив логических значений, чтобы каждая карта имела свои собственные данные для открытия / свертывания.

Я придумал этот код, однако теперь, когда я нажимаю кнопку, я вижу значение в массиве изменилось, но карта не открылась.

Есть идеи почему? Или есть лучший способ сделать это вместо массива showAeInfo?

Спасибо!

<template>
    <div class="container">
        <button class="btn btn-primary" @click="show">Pridaj prídavné zariadenia na túto stavbu</button>

        <modal name="addAesToConsite" height="auto" :scrollable="true">
            <div class="addAesToCSModalFlex mt-4">
                <div class="card mb-2" style="width: 18rem;" v-for="ae in aes" :key="ae.id">
                    <img :src="ae.imgPath" class="card-img-top">
                    <div class="card-body">
                        <h5 class="card-title"><a :href="ae.path">{{ ae.pseudo_id + " - " + ae.name }}</a></h5>
                        <button class="btn btn-outline-secondary"
                                @click="showAeInfo[ae.id] = true"
                                v-show="!showAeInfo[ae.id]">
                            Zobraz informácie
                        </button>
                        <button class="btn btn-outline-secondary" @click="showAeInfo[ae.id] = false" v-show="showAeInfo[ae.id]">
                            Skry informácie
                        </button>
                        <div v-show="showAeInfo[ae.id]">
                            <p class="card-text"><b>Poloha:</b> {{ aeLocationName(ae.construction_site_id) }}</p>
                        </div>
                        <a href="#" class="btn btn-primary">Pridaj toto zariadenie na stavbu</a>
                    </div>
                </div>
            </div>
        </modal>
    </div>
</template>

<script>
  export default {
    props: {
      cs: {
        required: true,
        type: Object
      },
      aes: {
        required: true,
        type: Array
      },
      machines: {
        required: true,
        type: Array
      },
      css: {
        required: true,
        type: Array
      }
    },

    mounted: function() {
      this.setShowAeInfo()
    },

    created() {
      //
    },

    data: function() {
      return {
        showAeInfo: []
      }
    },
    methods: {
      show() {
        this.$modal.show('addAesToConsite');
      },
      aeLocationName(ae) {
        var cs;
        if (ae) {
          cs = this.css.filter(tcs => tcs.id === ae)[0].name;
          return cs;
        } else {
          return 'Neznáma stavba';
        }
      },
      setShowAeInfo() {
        this.aes.forEach(ae => this.showAeInfo.push(false))
        this.showAeInfo.push(false);
      },
    }
  }
</script>

1 Ответ

1 голос
/ 27 мая 2020

new Vue({
  el: '#app',
  template: `
    <div>
      <ul>
        <li v-for="item in list" :key="item.id">
          <strong>Item:</strong> {{item.name}}
          <button @click="showItem(item.id, true)" v-show="!statusShowItem[item.id]">Zobraz informácie</button>
          <button @click="showItem(item.id, false)" v-show="statusShowItem[item.id]">Skry informácie</button>
        </li>
      </ul>
    </div>
  `,
  data() {
    return {
      statusShowItem: {},
      list: [{
          id: "1",
          name: "item1",
        },
        {
          id: "2",
          name: "item2",
        },
        {
          id: "3",
          name: "item3",
        },
      ],
    };
  },
  methods: {
    showItem(id, status) {
      if (status) {
        this.$set(this.statusShowItem, id, true);
      } else {
        this.statusShowItem[id] = false;
      }
    },
  },
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.js"></script>
<div id="app"></div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...