v-for
v-for
Принимает:
Array | Object | number | string | Iterable
Многократно отрисовывает элемент или блок шаблона, основываясь на переданных данных. Значение директивы должно следовать синтаксису alias in expression
— в alias
будет элемент текущей итерации:
<div v-for="item in items">
{{ item.text }}
</div>
Отображение массива элементов с помощью v-for
v-for
Директива v-for
используется для отрисовки списка элементов на основе массива данных. У директивы v-for
особый синтаксис записи: item in items
, где items
— исходный массив, а item
— ссылка на текущий элемент массива:
<ul id="example-1">
<li v-for="item in items">
{{ item.message }}
</li>
</ul>
var example1 = new Vue({
el: '#example-1',
data: {
items: [
{ message: 'Foo' },
{ message: 'Bar' }
]
}
})
Результат:

Внутри блока v-for
доступны свойства из области видимости родителя. У v-for
также есть второй опциональный параметр с индексом текущего элемента.
<ul id="example-2">
<li v-for="(item, index) in items">
{{ parentMessage }} - {{ index }} - {{ item.message }}
</li>
</ul>
var example2 = new Vue({
el: '#example-2',
data: {
parentMessage: 'Родитель',
items: [
{ message: 'Foo' },
{ message: 'Bar' }
]
}
})
Результат:

Вместо in
разделителем можно использовать of
, как в итераторах JavaScript:
<div v-for="item of items"></div>
v-for
для объекта
v-for
для объектаv-for
можно также использовать для итерирования по свойствам объекта:
<ul id="v-for-object" class="demo">
<li v-for="value in object">
{{ value }}
</li>
</ul>
new Vue({
el: '#v-for-object',
data: {
object: {
title: 'How to do lists in Vue',
author: 'Jane Doe',
publishedAt: '2016-04-10'
}
}
})
Результат:

Можно использовать второй аргумент для получения имени свойства (ключа объекта):
<div v-for="(value, name) in object">
{{ name }}: {{ value }}
</div>
Результат:

И третий — для индексов:
<div v-for="(value, name, index) in object">
{{ index }}. {{ name }}: {{ value }}
</div>
Результат:

v-for
и диапазоны
v-for
и диапазоныВ v-for
можно передать целое число. В этом случае шаблон будет повторён указанное число раз.
<div>
<span v-for="n in 10">{{ n }} </span>
</div>
Результат:

v-for
и тег template
v-for
и тег template
Подобно использованию с v-if
, также можно использовать тег <template>
с директивой v-for
для отображения блока из нескольких элементов.
<ul>
<template v-for="item in items">
<li>{{ item.msg }}</li>
<li class="divider" role="presentation"></li>
</template>
</ul>
Компоненты и v-for
v-for
Можно использовать v-for
на компонентах, как и на обычных элементах:
<my-component v-for="item in items" :key="item.id"></my-component>
Однако, в компонент никакие данные не передаются автоматически, поскольку у компонентов изолированные области видимости. Для передачи итерируемых данных в компонент необходимо явно использовать входные параметры:
<my-component
v-for="(item, index) in items"
:item="item"
:index="index"
:key="item.id"
></my-component>
Причина, почему item
не передаётся в компонент автоматически, в том, что это сделает компонент жёстко связанным с логикой работы v-for
. Но если указывать источник данных явно, компонент можно будет использовать и в других ситуациях.
v-for
и v-if
v-for
и v-if
Не рекомендуется использовать вместе v-if
и v-for
.
Когда присутствуют вместе на одном элементе, v-for
имеет больший приоритет, чем v-if
. Поэтому v-if
будет выполняться для каждой итерации цикла. Это полезно, когда нужно отобразить только некоторые элементы списка, например:
<li v-for="todo in todos" v-if="!todo.isComplete">
{{ todo }}
</li>
В результате будут отображены только задачи, которые ещё не выполнены.
Если необходимо по условию пропускать выполнение всего цикла, переместите v-if
на внешний элемент (или на <template>
). Например:
<ul v-if="shouldRenderTodos">
<li v-for="todo in todos">
{{ todo }}
</li>
</ul>
Last updated
Was this helpful?