Непонятно, чем мотивировано неиспользование 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);
},