Урок 5 :: List Rendering :: Отображение списка
Вот, что мы с Вами сделаем на этом уроке.
Пройдем по этой ссылке:
List Rendering ➳
... Все внимательно послушаем, посмотрим, прочитаем.
Затем сделаем конспект (мой см ниже).
Конспект
Отображение спискаВ этом уроке мы рассмотрим концепцию отображения списка.
Чтобы начать этот урок, вы можете либо получить программой git коммандой checkout исходный код в ветке
L5-start
репозитория, либо перейти в CodePen, чтобы взять файлы там.
Примечание переводчика
Чтобы перейти на ветку с файлами начала урока 5 выполните команду:
git checkout L5-start
Наша Цель
Отобразить на HTML странице список из массива в нашем объекте
data
.
Циклическое перемещение по массивам данных
В исходном коде у нас теперь есть массив деталей (array of
details
).
📄 main.js
const app = Vue.createApp({ data() { return { ... details: ['50% cotton', '30% wool', '20% polyester'] } } })
Теперь возникает вопрос: как мы можем отобразить эти данные в виде списка?
Мы начнем с создания неупорядоченного списка в нашем index.html. На
li
внутри него мы добавим еще одну директиву Vue: v-for
.
📄 index.html
<ul> <li v-for="detail in details">{{ detail }}</li> </ul>
Внутри
v-for
выражения мы написали: detail in details
. Здесь details
относится к массиву details
в наших данных, а detail
- это псевдоним текущего элемента из этого массива, который мы проходим по циклу, отображая каждый элемент массива в новом li
.
Каждый
li
будет отображать этот элемент массива, потому что во внутреннем HTML мы написали выражение: {{ detail }}
для отображения каждого элемента массива.
Если мы проверим браузер, мы увидим, что отображается список всех элементов массива
details
.
Пока все хорошо, но как на самом деле работает
v-for
?
Варианты Цветов Товара
Чтобы лучше ознакомиться с визуализацией списков с помощью
v-for
, мы рассмотрим другой пример в нашем приложении. Давайте добавим новый массив variants
(варианты) в наши данные:
📄 main.js
data() { return { ... variants: [ { id: 2234, color: 'green' }, { id: 2235, color: 'blue' } ] } }
Теперь у нас есть массив, содержащий объект для каждого варианта нашего продукта. Каждый вариант продукта имеет идентификатор (
id
) и цвет (color
). Поэтому для нашей следующей задачи мы распечатаем каждый вариант цвета и используем идентификатор (id
), чтобы помочь Vue отслеживать элементы нашего списка.
📄 index.html
<div v-for="variant in variants" :key="variant.id">{{ variant.color }}</div>
Обратите внимание на то, как мы используем точечную нотацию для отображения каждого варианта (
variant
) при циклическом просмотре массива вариантов (variants
). Но что атрибут :key
здесь делает?
Ключевой атрибут: Необходимость для элементов списка
Набрав строку
:key="variant.id"
, мы используем сокращение для v-bind
, чтобы привязать идентификатор варианта id
к ключевому атрибуту key. Это дает каждому элементу DOM уникальный ключ, чтобы Vue мог ухватиться за элемент и не потерять его по мере обновления в приложении.
Это обеспечивает некоторое повышение производительности, и позже, если вы делаете что-то вроде анимации своих элементов, вы обнаружите, что ключевой атрибут
key
действительно помогает Vue эффективно управлять вашими элементами при их перемещении по DOM.
Задача кодирования
Мы подошли к концу этого урока, теперь будем решать новые задачи кодирования.
Вот, что надо сделать.
Добавьте массив размеров
sizes
в объект data
.
Используйте
v-for
для отображения размеров (sizes
) в списке.
Вы можете найти код решения, загрузив L5-end ветвь репозитория или просмотрев решение в Codepen.
Чтобы перейти на ветку с файлами окончания урока 5 выполните команду:
git checkout L5-end
Код файла index.html данного урока
<div id="app"> <div class="nav-bar"></div> <div class="product-display"> <div class="product-container"> <div class="product-image"> <img v-bind:src="image"> </div> <div class="product-info"> <h1>{{ product }}</h1> <p v-if="inStock">In Stock</p> <p v-else>Out of Stock</p> <ul> <li v-for="detail in details">{{ detail }}</li> </ul> <!-- solution --> <ul> <li v-for="(size, index) in sizes" :id="index">{{ size }}</li> </ul> <!-- solution --> <div v-for="variant in variants" :id="variant.id"> {{ variant.color }} </div> </div> </div> </div> </div> <!-- Import App --> <script src="./main.js"></script> <!-- Mount App --> <script> const mountedApp = app.mount('#app') </script>
Код файла main.js данного урока
const app = Vue.createApp({ data() { return { product: 'Socks :: Носки', image: '../assets/images/socks_blue.jpg', inStock: true, details: ['50% cotton - хлопок', '30% wool - шерсть', '20% polyester - полиэстер'], // solution sizes: ['S', 'M', 'L', 'XL', 'Русский Размер'], // solution variants: [ { id: 2234, color: 'green - зеленые' }, { id: 2235, color: 'blue - голубые' }, ] } } })
Результат выполнения данного урока
{{ product }}
In Stock
Out of Stock
- {{ detail }}
- {{ size }}
{{ variant.color }}
Примечание переводчика
1. Я слегка меняю контент оригинальных файлов курса для тренировки, проверки русификации и т.д. В частности я поменял в HTML коде:
:key=
на
:id=
Т.к. мне кажется, некорректные атрибуты нельзя использовать. Проверьте сами.
2. Код для
HTML
я размещаю в этом файле между тегами body
.
3. Обратите внимание, чтобы в консоле браузера не было ошибок.
Теперь Нажмите здесь для перехода к следующему уроку ➳
... или ...