Изучите Vue: список и условный рендеринг.
Представьте, что вы разрабатываете приложение и хотите отобразить некоторые данные в браузере на основе определенных условий или у вас есть массив данных, которые вы хотите просмотреть и отобразить в браузере. Как мы можем добиться этого в Vue? В этом руководстве мы изучим List rendering
и conditional rendering
в Vue, а также то, как мы можем использовать возможности директив v-if
и v-for
.
Рендеринг списка
Директива v-for
используется для отображения массива элементов или объекта. Синтаксис очень прост и удобен; item in items
, где элемент — это отдельный item
, который будет отображаться, а items
— это список, который мы прокручиваем.
Рендеринг массива с v-for
v-for
также можно использовать для итерации по объекту, последовательность итераций будет зависеть от результата вызова Object.keys()
для объекта:
//template
<ul>
<li v-for="value in myObject">
{{ value }}
</li>
</ul>
//script
const myObject = reactive({
title: 'How to render lists in Vue',
author: 'KingstonCodes',
publishedAt: '2023-08-10'
})
При желании мы также можем включить ключ каждого свойства в объект <li v-for="(value, key) in myObject"> {{ value }} </li>
v-for и key
Чтобы сохранить состояние элементов при их отображении в браузере, мы можем ввести уникальный key
атрибут для ссылки на каждый элемент в списке:
<div v-for="item in items" :key="item.id">
{{ item }}
</div>
Директива v-for чрезвычайно важна, так как она помогает нам легко отображать списки в браузере.
Условный рендеринг
Мы можем отобразить что угодно в браузере условно, используя либо директиву v-show
, либо директиву v-if
. И v-show, и v-if
могут использоваться для достижения одного и того же результата, разница в том, что директива v-show
только переключает свойство CSS display
элемента, поэтому элемент с директивой v-show
всегда будет присутствовать в браузер.
v-show
Давайте посмотрим на пример условного рендеринга с директивой v-show
.
<div v-show="isTrue">
//content here
</div>
//script
const isTrue = ref(true)
Div всегда будет отображаться в браузере до тех пор, пока isTrue остается истинным, и аналогичным образом, когда isTrue имеет значение false, div исчезает из браузера.
v-if
Как и директива v-show
, директива v-if
также используется для условного рендеринга элементов в браузере, элемент визуализируется только тогда, когда выражение директивы возвращает истинное значение.
<div v-if="isTrue">
//content here
</div>
//script
const isTrue = ref(true)
Еще одно различие между директивой v-if
и директивой v-show
заключается в том, что мы можем использовать директивы v-else
и v-else-if
для соответствия случаям, когда выражение директивы неверно.
v-if с v-else и v-else-if
<div v-if="isTrue < 0">
//display content here
</div>
<div v-else-if="isTrue > 0">
//display content here
</div>
<div v-else>
//display content here
</div>
//script
const isTrue = ref(0)
Как и традиционные if
, else
if
и else
в JavaScript, v-if
, v-else
и v-else-if
можно использовать для достижения аналогичного результата.
В приведенном выше примере будет запущен блок v-else
, поскольку isTrue
не меньше и не больше нуля. Точно так же блок v-if
или блок v-else-if
будет работать в зависимости от того, является ли значение isTrue
больше или меньше 0.
v-for с v-if
Иногда мы можем захотеть отобразить список в браузере при выполнении определенных условий. Для этого нам нужно сначала пройтись по списку с помощью v-for
, а затем проверить, выполняется ли условие с помощью v-if
перед его отображением.
Проблема в том, что не рекомендуется использовать директивы v-for
и v-if
для одного и того же элемента, потому что, когда они существуют в одном и том же элементе, v-if
будет иметь более высокий уровень приоритета, чем v-for
, что означает что v-if
не сможет получить доступ к переменной из блока v-for
.
<!--
This will not work
-->
<li v-for="todo in todos" v-if="!todo.isComplete">
{{ todo.name }}
</li>
Чтобы исправить это, давайте переместим директиву v-for
в тег-оболочку.
<template v-for="todo in todos">
<li v-if="!todo.isComplete">
{{ todo.name }}
</li>
</template>
И все, блок v-for
всегда будет выполняться перед блоком v-if
, тем самым разрешая директиве v-if
доступ к переменной v-for
и выполнение действия.