Я хочу перебрать массив тегов 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>


![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Для достижения желаемого результата предлагаю немного изменить подход.
Вместо того, чтобы изменять значение 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. Он включен в решение выше.
спасибо за это ... можно ли это перенести?