Vue v-for: итерация одного элемента индивидуально в массиве

Я хочу перебрать массив тегов span и добавить is-active к следующему в строке каждые 3 секунды. У меня он работает, но после первого добавляет все остальное. Как мне просто вытащить этот класс из активного и добавить его к следующему элементу массива?

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

Я не уверен, что здесь можно сыграть index и как получить индекс элемента span для добавления / вычитания is-active. Что я делаю неправильно?

var firstComponent = Vue.component('spans-show', {
  template: `
<h1>
	<span class = "unset">Make</span>
	<br>
	<span class = "unset">Something</span>
    <br>
	<span v-for = "(span, index) of spans" :class = "{ 'is-active': span.isActive, 'red': span.isRed, 'first': span.isFirst }" :key = "index">{{ index }}: {{ span.name }}</span>
</h1>
`,

  data() {
    return {
      spans: [
        {
          name: 'Magical.',
          isActive: true,
          isRed: true,
          isFirst: true
        },
        {
          name: 'Inspiring.',
          isActive: false,
          isRed: true,
          isFirst: true
        },
        {
          name: 'Awesome.',
          isActive: false,
          isRed: true,
          isFirst: true
        }
      ]
    };
  },

  methods: {
    showMe: function() {
      setInterval(() => {
        // forEach
        this.spans.forEach(el => {
          if (el.isActive) {
            el.isActive = false;
          } else {
            el.isActive = true;
          }
        });
      }, 3000);
    }
  },

  created() {
    window.addEventListener('load', this.showMe);
  },

  destroyed() {
    window.removeEventListener('load', this.showMe);
  }
});

var secondComponent = Vue.component('span-show', {
  template: `
<span v-show = "isActive"><slot></slot></span>
`,

  props: {
    name: {
      required: true
    }
  },

  data() {
    return {
      isActive: false
    };
  }
});

new Vue({

  el: "#app",
  components: {
    "first-component": firstComponent,
    "second-component": secondComponent
  }
});
.container {
  position: relative;
  overflow: hidden;
  width: 100%;
}

.wrapper {
  position: relative;
  margin: 0 auto;
  width: 100%;
  padding: 0 40px;
}

h1 {
  font-size: 48px;
  line-height: 105%;
  color: #4c2c72;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  font-family: archia-semibold, serif;
  font-weight: 400;
  margin: 0;
  height: 230px;
}

span {
  position: absolute;
  clip: rect(0, 0, 300px, 0);
}

span.unset {
  clip: unset;
}

span.red {
  color: #e43f6f;
}

span.is-active {
  clip: rect(0, 900px, 300px, -300px);
}
<div id = "app">
  <div class = "container">
    <div class = "wrapper">
      <spans-show>
        <span-show></span-show>
      </spans-show>
    </div>
  </div>
</div>

<script src = "https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.min.js"></script>
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
728
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для достижения желаемого результата предлагаю немного изменить подход.

Вместо того, чтобы изменять значение isActive для отдельных элементов, мы можем создать переменную (например, activeSpan, которая будет отвечать за текущий активный диапазон и увеличивать его с течением времени.

setInterval(() => {
  // Increment next active span, or reset if it is the one
  if (this.activeSpan === this.spans.length - 1) {
    this.activeSpan = 0
  } else {
    this.activeSpan++
  }
}, 3000);

В шаблоне компонента мы делаем класс is-active условным и зависимым от переменной activeSpan:

:class = "{ 'is-active': index === activeSpan, 'red': span.isRed, 'first': span.isFirst }"

Если вам все еще нужно обновить значения внутри массива spans, это можно сделать более простым способом, например, через map. Также включен такой случай как необязательный в приведенное ниже решение.

Рабочий пример: JSFiddle

Примечание: нет необходимости добавлять оконных слушателей для события load, так как само приложение загружается после того, как DOM будет готов. Вместо этого метод может быть вызван внутри ловушки created. Он включен в решение выше.

спасибо за это ... можно ли это перенести?

Ricky-U 16.04.2021 09:42

Другие вопросы по теме