Непонятно, чем мотивировано неиспользование v-for. Если использовать, будет гораздо проще добиться того, что вы хотите,
например:
.hidden {
opacity: 0;
}
data: () => ({
items: [
{ text: '...', hidden: true },
{ text: '...', hidden: true },
...
],
}),
mounted() {
this.items.forEach((n, i) => {
setTimeout(() => n.hidden = false, 300 * (i + 1));
});
},
<li v-for="{ text, hidden } in items" :class="{ hidden }">
<a href="">{{ text }}</a>
</li>
UPD. В комментариях было высказано мнение, что
20 таймеров это плохо
Не вопрос:
mounted() {
(function next(data, i) {
if (i < data.length) {
data[i].hidden = false;
setTimeout(next, 300, data, i + 1);
}
})(this.items, 0);
},
или
async function asyncDelayedForEach(data, callback, delay) {
for (let i = 0; i < data.length;) {
await callback.call(data, data[i], i, data);
if (++i < data.length) {
await new Promise(r => setTimeout(r, delay));
}
}
}
mounted() {
asyncDelayedForEach(this.items, n => n.hidden = false, 300);
},