Як працює v-for?
v-for - це директива Vue, яка використовується для рендерингу списків: масивів, об'єктів, чисел і навіть результатів ітераторів.
Простіше кажучи:
v-forповторює шаблон для кожного елемента колекції.
Базовий синтаксис
html
<li v-for="item in items">{{ item }}</li>js
data() {
return {
items: ['A', 'B', 'C']
}
}Результат - три <li>.
Змінні ітератора: item, index
html
<li v-for="(item, index) in items">
{{ index }} - {{ item }}
</li>Обов'язковий атрибут key
Vue вимагає вказувати :key для коректного трекінгу елементів:
html
<li v-for="user in users" :key="user.id">
{{ user.name }}
</li>Навіщо?
- покращує продуктивність
- допомагає правильно оновлювати DOM
- запобігає багам при перестановках
Ітерація по об'єкту
html
<div v-for="(value, key, index) in user" :key="key">
{{ key }}: {{ value }}
</div>Порядок такий: (value, key, index).
Ітерація по числу
html
<div v-for="n in 5">{{ n }}</div>Виведе цифри 1-5.
v-for всередині template
Для групування:
html
<template v-for="item in list" :key="item.id">
<h3>{{ item.title }}</h3>
<p>{{ item.text }}</p>
</template><template> сам у DOM не рендериться.
Комбінація з v-if
На одному елементі ставити не можна (Vue 3):
html
<li v-for="item in items" v-if="item.visible">Не можна</li>Але можна через <template>:
html
<template v-for="item in items" :key="item.id">
<li v-if="item.visible">{{ item.name }}</li>
</template>Або краще фільтрувати заздалегідь:
js
visibleItems() {
return this.items.filter(i => i.visible)
}Кортежі (array of arrays)
html
<div v-for="([key, value]) in Object.entries(obj)" :key="key">
{{ key }}: {{ value }}
</div>v-for з компонентами
Можна передавати item як пропси:
html
<UserCard
v-for="user in users"
:key="user.id"
:user="user"
/>Як працює v-for "під капотом"
Vue робить так:
- Проходить по колекції
- Створює віртуальні DOM-ноди для кожного елемента
- Зіставляє їх за ключами (
key) - Оптимально оновлює реальні DOM-вузли при зміні даних
Без key Vue використовує ін-плейс патчинг - може поводитися непередбачувано.
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.