Vue итерация массивов или объектов

Vue итерация массивов или объектов

В большинстве практических сценариев мы работаем с данными как с объектами, особенно когда перебор массива объектов. Vue позволяет легко управлять различными состояния данных через синтаксис директивы.

v-for="(item, index) in items" :key="index"

Теперь item является Объектом с различными свойствами. Вы можете
привязать каждое свойство, используя то, что вы уже узнали, чтобы отобразить его значение.
Например, предположим, что в элементе у нас будут id, title, description и
другой массив - characteristics, содержащий некоторые строки.

Мы можем отобразить информацию о заголовке и описании для каждого элемента, например:

<template>
<ul>
  <li v-for="(item, index) in items" :key="item.id">
    <h2>{{ item.title }}</h2>
    <span>{{ item.description }}</span>
  </li>
</ul>
</template>

Обратите внимание, что здесь мы не используем индекс в качестве ключа; вместо этого мы используем id как уникальный
идентификатор для ключа. Считается более безопасным подходом к использованию в качестве ключа,i d элемента или любое другое
уникальное для каждого элемента значение, и нам также не нужно включать индекс в синтаксис в данном случае, так как мы его не используем.

Поскольку characteristics— это массив, мы отображаем его значения с помощью v-for.

Вам не обязательно использовать имя item, для итерируемого элемента, как показано в примере. Вместо этого вы можете дать ему другое, более осмысленное имя, которое вам подходит.

В следующем примере мы используем str для каждого элемента в item.characteristics:

<template>
<ul>
  <li v-for="item in items" :key="item.id">
    <h2>{{ item.title }}</h2>
    <span>{{ item.description }}</span>
    <ul>
      <li v-for="(str, index) in item.characteristics" :key="index">
        <span>{{ str }}</span>
      </li>
    </ul>
  </li>
</ul>
</template>

А секция script, будет выглядеть так:

<script setup>
  const items = [
  {
    id: 1,
    title: "Item 1",
    description: "About item 1",
    characteristics: ["Summer", "Winter", "Spring", "Autumn"]
   },
   {
     id: 2,
     title: 'Item 2",
     description: 'About item 2",
     characteristics: ["North", "West", "East", "South"]
   }
  ]
</script>

В результате, у нас появится заголовок элемента, а ниже будут описание, и характеристики.

Понимание того, как перебирать коллекции объектов с помощью v-for, важно и полезно для обработки данных, особенно, если вы работаете с внешними данными. В следующем упражнении мы объединим v-for и v-if, чтобы отобразить список объектов с условием.

Упражнение - использование v-for для итерации массива объектов с использованием v-if

В этом упражнении мы будем управлять массивом данных Vue и итерировать объекты внутри него.

Создайте и импортируйте компонент, как это сделано в упражнении.

Создайте скелет компонента:

<template>
</template>

<script>
</script>

<style></style>

Затем наполним этот шаблон данными:

<script setup>
const interests = [
  {
    title: "TV",
    favorites: ["Designated Survivor","Spongebob"],
  },
  {
    title: "Games",
    favorites: ["CS:GO"],
  },
  {
    title: "Sports",
    favorites: [],
  },
];
</script>

В template мы перебираем interests и отображаем заголовок для каждого item в массиве interests:

<template>
  <div>
    <h1>Looping through array of objects</h1>
    <ul>
      <li v-for="(item, n) in interests" :key="n">
        {{ item.title }}
      </li>
    </ul>
  </div>
</template>

Давайте создадим второй цикл v-for для перебора списка favorites для каждого элемента. Примечание
что мы используем разные имена — fav и m — для нашего вложенного цикла:

<template>
  <div>
    <h1>Looping through array of objects</h1>
    <ul>
      <li v-for="(item, n) in interests" :key="n">
        {{ item.title }}
      <ol>
        <li v-for="(fav, m) in item.favorites" :key="m">{{ fav }}</li>
      </ol>
     </li>
    </ul>
</div>
</template>

При проверке элементов DOM (нажмите Ctrl + F12 или откройте Инструменты разработчика) вы можете увидеть
есть несколько пустых элементов. Это связано с тем, что движок Vue по-прежнему отображает элемент <ol>, несмотря на то, что favorites является пустым массивом:

Теперь нам нужно скрыть этот пустой элемент <ol>. Мы проверим, является ли массив избранного пустым (length > 0), а затем отобразим HTML-элемент упорядоченного списка.
Давайте добавим директиву v-if в <ol> с условием item.favorites.length > 0:

<ol v-if="item.favorites.length > 0">
  <li v-for="(fav, m) in item.favorites" :key="m">
    {{ fav }}
  </li>
</ol>

Это не повлияет на внешний вид вашей страницы, но когда вы
осмотрите дерево DOM в своем браузере, вы увидите HTML-комментарий <!------> , в режиме продакшн - такие комментарии уберуться.

В этом упражнении мы перебрали сложные массивы объектов, вывели вложенные ключи для этих объектов и управляли отображением элементов, на основе существования данных.

Далее мы поэкспериментируем с перебором коллекции с ключом (или объекта).  93