Директива v-for
— это мощный инструмент для рендеринга списков данных в Vue.js приложениях. Рассмотрим ее назначение, синтаксис и лучшие практики использования.
v-for
используется для:
Базовый синтаксис:
<ul>
<li v-for="item in items" :key="item.id">
{{ item.text }}
</li>
</ul>
Доступ к индексу:
<div v-for="(item, index) in items" :key="index">
{{ index }}. {{ item.name }}
</div>
<div v-for="(value, key, index) in myObject">
{{ index }}. {{ key }}: {{ value }}
</div>
<span v-for="n in 10">{{ n }} </span> <!-- Выведет числа от 1 до 10 -->
Обязательное требование: Всегда указывайте уникальный :key
для каждого элемента.
Правильно:
<div v-for="user in users" :key="user.id">
Неправильно:
<div v-for="user in users"> <!-- Без key -->
Почему это важно:
При использовании с компонентами:
<my-component
v-for="(item, index) in items"
:key="item.id"
:item="item"
@remove="removeItem(index)"
/>
Используйте computed-свойства вместо фильтрации в v-for:
computed: {
activeUsers() {
return this.users.filter(user => user.isActive)
}
}
Плохая практика:
<li v-for="user in users" v-if="user.isActive"> <!-- Не рекомендуется -->
Лучшее решение:
<template>
для оберткиVue не может обнаружить:
this.items[index] = newValue
this.items.length = newLength
Правильные методы:
Vue.set(this.items, index, newValue) // Для Vue 2
this.items.splice(index, 1, newValue) // Альтернатива
Для больших списков используйте:
Пример пагинации:
computed: {
paginatedItems() {
const start = (this.currentPage - 1) * this.pageSize
return this.items.slice(start, start + this.pageSize)
}
}
<div v-for="(group, name) in groupedItems">
<h3>{{ name }}</h3>
<div v-for="item in group">{{ item.name }}</div>
</div>
Проблема: "Duplicate keys detected"
Решение: Убедитесь, что :key
уникален для каждого элемента
Проблема: Медленный рендеринг Решение:
Директива v-for
— это основной инструмент для работы со списками в Vue.js. Правильное ее использование (с :key
, через computed свойства и без смешивания с v-if
) позволяет создавать эффективные и поддерживаемые интерфейсы для работы с коллекциями данных.