Альтернативные классы Vue в v-for

У меня есть массив (история), который выталкивает два элемента каждый раз, когда нажимается кнопка. Эти два элемента должны иметь разные стили CSS при печати.

HTML

<ul class="info">
  <li :class="{ 'style-one' : toggle, 'style-two' : toggle }" v-for="item in history">{{item}}</li>
</ul>

JS (Vue)

methods: {
  attack: function() {
  this.history.unshift(this.playerDamaged);
  this.history.unshift(this.monsterDamaged);
}

Проблема в том, что нет возможности изменить истинность toggle во время цикла. Есть ли лучший способ подойти к этому?


person tazboy    schedule 25.03.2017    source источник


Ответы (1)


РЕШЕНИЕ 1:

Вы можете использовать этот код:

<ul class="info">
  <li v-for="item in history" :key="item"
      :class="{ 'style-one' : item.isPlayer, 'style-two' : !item.isPlayer }"
      >

   {{ item.text }}

  </li>
</ul>

methods: {
  attack: function() {
  this.history.unshift({ text: this.playerDamaged, isPlayer: true });
  this.history.unshift({ text: this.monsterDamaged, isPlayer: false });
}

ОБНОВЛЕНО - РЕШЕНИЕ 2 [Не использовать объекты]:

Вы можете использовать другое решение без объектов:

<ul class="info">
  <li v-for="(item, index) in history" :key="item"
      :class="'style-' + ((index % numberOfPlayers) + 1)"
      >

   {{ item }}

  </li>
</ul>

//This part don't have to deal with Array of Objects :
methods: {
  attack: function() {
  this.history.unshift( this.playerDamaged );
  this.history.unshift( this.monsterDamaged );
},
computed: {
    numberOfPlayers: function() {
        return 2;
    }
  }

Если вы хотите добавить игрока (например, монстра 2), вам нужно обновить вычисленное значение numberOfPlayers до 3 (или лучше: listOfPlayers.length, если оно у вас есть) и создать класс «.style-3».

Пример кода:

new Vue({
  el: "#app",
  data: function() {
    return {
    	myArray: ['player attack', 'monster attack','player attack', 'monster attack']
    }
  },
  computed: {
    numberOfPlayers: function() {
    	return 2;
    }
  }
});
.style-1 {
  color: blue;
}

.style-2 {
  color: red;
}
<script src="https://vuejs.org/js/vue.min.js"></script>

<div id="app">

  <div v-for="(item, index) in myArray" :key="item"
       :class="'style-' + ((index % numberOfPlayers) + 1)"
       >
      {{ item }}
  </div>

</div>

person Happyriri    schedule 25.03.2017
comment
Хорошо сделано. Нет ли другого способа сделать это, кроме передачи объекта в массив? - person tazboy; 25.03.2017
comment
Да, есть другой способ (без объектов): см. мой ответ ОБНОВЛЕНО. - person Happyriri; 25.03.2017
comment
Спасибо, что нашли время, чтобы написать это. Отличная информация! - person tazboy; 26.03.2017