логотип PurpleSchool
логотип PurpleSchool

Использование массивов и методов их обработки в Vue

Автор

Олег Марков

Введение

Работа с массивами — одна из ключевых задач в разработке интерфейсов на Vue. Этот вопрос встречается буквально на каждом проекте: отображение списков, добавление и удаление элементов, сортировка, фильтрация, реактивное обновление отображаемых данных и многое другое. Vue предоставляет множество удобств для работы с массивами, сочетая простоту JavaScript с мощной системой реактивности. Здесь вы узнаете, как именно используются массивы во Vue, какие методы для их обработки существуют и как избежать типичных ошибок новичков.

Основы отображения массивов во Vue

Давайте для начала разберёмся, как выводить массивы на страницу с помощью Vue.

Как вывести массив в шаблоне

Во Vue для отображения массивов чаще всего используют директиву v-for.

Пример вывода простого массива

<ul>
  <li v-for="item in items" :key="item.id">
    {{ item.name }}
  </li>
</ul>
data() {
  return {
    items: [
      { id: 1, name: 'Яблоко' },
      { id: 2, name: 'Банан' },
      { id: 3, name: 'Апельсин' }
    ]
  }
}

// Здесь мы используем v-for для вывода массива объектов. :key нужен для оптимизации и правильного рендеринга списка.

Директива v-for: синтаксис и нюансы

Директива v-for может принимать не только значение, но и индекс текущего элемента.

<li v-for="(item, index) in items" :key="item.id">
  {{ index }} — {{ item.name }}
</li>

// Индекс может пригодиться, если нужно вычислять позицию элемента в списке.

Используйте для key уникальные значения (часто id из объектов), чтобы Vue правильно управлял списком при изменениях.

Работа с массивами в реактивном состоянии

Vue автоматически делает массивы реактивными, когда вы объявляете их в data. Но есть нюансы.

Добавление и удаление элементов

Добавление элемента

Добавим элемент кнопкой:

<button @click="addItem">Добавить элемент</button>
<ul>
  <li v-for="item in items" :key="item.id">
    {{ item.name }}
  </li>
</ul>
data() {
  return {
    items: [
      { id: 1, name: 'Яблоко' },
      { id: 2, name: 'Банан' }
    ],
    nextId: 3
  }
},
methods: {
  addItem() {
    // Добавляем новый элемент в массив
    this.items.push({ id: this.nextId++, name: `Продукт №${this.nextId - 1}` })
  }
}

// После вызова addItem массив и список на странице будут обновлены автоматически благодаря реактивности Vue.

Удаление элемента

Вам может понадобиться удалять элементы по индексу или по id:

<li v-for="(item, index) in items" :key="item.id">
  {{ item.name }}
  <button @click="removeItem(index)">Удалить</button>
</li>
methods: {
  removeItem(index) {
    // Удаляет элемент по индексу из массива
    this.items.splice(index, 1)
  }
}

// Метод splice делает изменение реактивным.

Популярные методы массивов и их правильное использование

Так как vue.js использует "чистый" JavaScript для работы с массивами, всё, что вы знаете о массивах в JavaScript, применимо и во Vue. Но из-за реактивности есть особенности, которые стоит учесть.

Изменяющие методы

Методы, которые изменяют исходный массив (mutating):

  • push — добавить элемент в конец
  • pop — удалить элемент с конца
  • shift — удалить элемент с начала
  • unshift — добавить элемент в начало
  • splice — добавить/удалить элемент в любой позиции
  • sort — отсортировать массив
  • reverse — изменить порядок элементов на противоположный

Vue отслеживает изменения, сделанные этими методами, и автоматически обновляет DOM.

Пример добавления/удаления с push/pop

methods: {
  добавитьФрукт() {
    this.items.push({ id: this.nextId++, name: `Новый фрукт №${this.nextId - 1}` })
  },
  удалитьФрукт() {
    this.items.pop() // Убирает последний элемент
  }
}

Неизменяющие методы

Эти методы создают новый массив, но оригинальный не трогают: filter, map, slice, concat.

Пример фильтрации

computed: {
  толькоЯблоки() {
    // Возвращаем новый массив только с яблоками
    return this.items.filter(item => item.name === 'Яблоко')
  }
}

// Фильтрация часто используется внутри вычисляемых свойств (computed) для реактивного отображения части массива.

Реактивность массивов: нюансы и подводные камни

Реактивность — ключевая фишка Vue. Но есть моменты, о которых важно знать.

Добавление или удаление по индексу

Если вы используете конструкцию вроде this.items[2] = новыйОбъект или напрямую меняете длину массива, Vue может не разглядеть эти изменения.

Как правильно задать новый элемент по индексу

// Не рекомендуется:
this.items[2] = { id: 5, name: 'Груша' } 

// Рекомендуется:
this.$set(this.items, 2, { id: 5, name: 'Груша' })

// $set гарантирует реактивное обновление.

// В Vue 3 вместо этого можно писать так (это работает корректно с реактивностью): this.items[2] = { id: 5, name: 'Груша' }

Удаление элементов через length

Если вы, например, уменьшаете размер массива:

this.items.length = 2

Это не всегда корректно обновляет DOM, особенно в Vue 2. Используйте методы splice, pop, shift для большей надёжности.

Следите за уникальностью ключей

Если key не уникален или меняется динамически, Vue может неверно отрисовать список (например, не тот элемент будет удалён или обновлён).

Применение вычисляемых свойств для обработки массивов

Вычисляемые свойства — мощный инструмент Vue, который часто применяют к работе с массивами: фильтрация, сортировка, подсчёты и агрегаты.

Пример фильтрации в computed:

computed: {
  толькоЯблоки() {
    // Оставляем только элементы с name равным 'Яблоко'
    return this.items.filter(item => item.name === 'Яблоко')
  }
}

В шаблоне:

<ul>
  <li v-for="item in толькоЯблоки" :key="item.id">
    {{ item.name }}
  </li>
</ul>

// Вычисляемое свойство толькоЯблоки будет автоматически пересчитываться при изменении массива items.

Пример сортировки:

computed: {
  отсортированныеФрукты() {
    // Сортируем фрукты по названию
    return [...this.items].sort((a, b) => a.name.localeCompare(b.name))
  }
}

// Используем spread чтобы не мутировать оригинальный массив

Массивы в Props и событиях — передача данных между компонентами

Vue предполагает часто работу с массивами не только внутри компонента, но и при обмене данными между ними.

Передача массива как props

// Родительский компонент
<fruit-list :items="myFruits"></fruit-list>
// Дочерний компонент
props: {
  items: {
    type: Array,
    required: true
  }
}

// Вы получаете массив, который можно безопасно обработать, выводить или мутировать (если договорились изменять именно здесь).

Изменения массива через события

Лучше не мутировать props напрямую. Для этого организовывают поднятие событий в родительский компонент.

// В дочернем компоненте
methods: {
  deleteItem(index) {
    this.$emit('delete', index)
  }
}
<!-- Родитель слушает -->
<fruit-list :items="myFruits" @delete="onDelete"></fruit-list>
methods: {
  onDelete(index) {
    this.myFruits.splice(index, 1) // Удаляем элемент у себя
  }
}

Взаимодействие с массивами через формы

Очень часто используются формы, где пользователь добавляет или редактирует элементы массива.

Пример динамического списка и добавления элементов

<input v-model="newFruitName">
<button @click="addFruit">Добавить фрукт</button>
<ul>
  <li v-for="item in items" :key="item.id">
    {{ item.name }}
  </li>
</ul>
data() {
  return {
    items: [],
    newFruitName: '',
    nextId: 1
  }
},
methods: {
  addFruit() {
    if (!this.newFruitName.trim()) return // Не добавляем пустое значение
    this.items.push({ id: this.nextId++, name: this.newFruitName })
    this.newFruitName = '' // Очищаем поле
  }
}

// Это типовой сценарий добавления элементов в массив на основе пользовательского ввода.

Масштабирование: массивы с вложенностью и работа с многоуровневыми структурами

Иногда ваши данные сложнее простого списка: например, товары с категориями, сообщения с вложенными комментариями.

Рекурсивный вывод массивов

При обработке многоуровневых списков используют рекурсивные компоненты:

// items: [{ id: 1, name: 'Категория', children: [...] }, ...]
<template>
  <ul>
    <li v-for="item in items" :key="item.id">
      {{ item.name }}
      <category-list v-if="item.children" :items="item.children"></category-list>
    </li>
  </ul>
</template>

// Здесь компонент CategoryList может вызывать сам себя для отображения вложенных данных

Эффективность: оптимизация больших списков

Vue отлично работает с относительно небольшими списками. Для больших коллекций (> 500–1000 элементов) рекомендуется использовать виртуализацию через сторонние библиотеки (например, vue-virtual-scroller).

Заключение

Работа с массивами во Vue — базовый, но очень широкий пласт практики современного фронтенда. Вы научились, как выводить массивы через v-for, добавлять и удалять элементы с реактивностью, обрабатывать данные через методы массивов, использовать вычисляемые свойства для фильтрации и сортировки, передавать массивы между компонентами и работать с более сложными структурами. На старте достаточно уделить внимание базовой реактивности и особенностям v-for, по мере роста приложения не забудьте об оптимизации и управлении сложными структурами данных.

Частозадаваемые технические вопросы по теме

Вопрос 1: Как правильно отслеживать изменения в массиве объектов, если изменился объект внутри массива, а не сам массив?

Ответ:
Vue не всегда "видит" прямое изменение свойств объекта внутри массива (особенно если вы используете старый синтаксис). Решение — обновлять объект с помощью Vue.set (в Vue 2) или присваивать полностью новый объект. Например: js // Для Vue 2: this.$set(this.items, index, { ...this.items[index], name: 'Новое имя' }) // Для Vue 3: this.items[index] = { ...this.items[index], name: 'Новое имя' } Это гарантирует реактивное обновление.


Вопрос 2: Почему нельзя напрямую мутировать массив, переданный как props, в дочернем компоненте?

Ответ:
Props во Vue должны оставаться неизменными внутри дочернего компонента — это важная часть архитектуры. Мутируйте массив не напрямую, а через поднятие событий и изменение в родителе.


Вопрос 3: Как эффективно отслеживать изменения фильтрованного или отсортированного списка?

Ответ:
Используйте computed для создания фильтрованной/отсортированной версии массива. Изменения исходного массива автоматически отразятся на вычисленном свойстве благодаря реактивности Vue.


Вопрос 4: Как сделать reset/очистку массива?

Ответ:
Для полной очистки массива используйте this.items = [] или this.items.splice(0, this.items.length). Первый вариант подойдет, если массив не был передан через props.


Вопрос 5: Как избежать ошибок при использовании индекса в качестве key в v-for?

Ответ:
Используйте уникальные идентификаторы (например, id), а не index, чтобы избежать ошибок при изменении порядка элементов или их удалении. Index подходит только для статичных списков, которые никогда не будут изменяться.

Стрелочка влевоРабота с lifecycle-хуками beforeCreate и beforeMount во VueИспользование массивов и их обработка в VueСтрелочка вправо

Постройте личный план изучения Vue до уровня Middle — бесплатно!

Vue — часть карты развития Frontend

  • step100+ шагов развития
  • lessons30 бесплатных лекций
  • lessons300 бонусных рублей на счет

Бесплатные лекции

Все гайды по Vue

Руководство по валидации форм во Vue.jsИнтеграция Tiptap для создания редакторов на VueРабота с таблицами во Vue через TanStackИнструкция по установке и компонентам Vue sliderУправление пакетами Vue js с помощью npmУправление пакетами и node modules в Vue проектахКак использовать meta для улучшения SEO на VueПолный гайд по компоненту messages во Vuejs5 правил использования Inertia с Vue и LaravelРабота с модулями и пакетами в VueИнструкция по работе с grid на VueGithub для Vue проектов - подробная инструкция по хранению и совместной работеНастройка ESLint для Vue проектов и поддержка качества кодаОбработка ошибок и отладка в Vue.jsИспользование Vue Devtools для отладки и мониторинга приложенийРабота с конфигурационными файлами и скриптами VueСоздание и настройка проектов Vue с помощью Vue CLI3 способа интеграции Chart.js с Vue для создания графиковРабота с Canvas во VueИнструкция по реализации календаря во VueРабота с Ant Design Vue для создания UI на Vue
Обзор и использование утилит Vue для удобной разработкиРабота с обновлениями компонента и жизненным циклом updateРазрешение конфликтов и ошибок с помощью Vue resolveИспользование query-параметров и их обработка в маршрутах VueЗагрузка и управление состоянием загрузки в VueИспользование библиотек Vue для расширения функционалаРабота с JSON данными в приложениях VueКак работать с экземплярами компонента Instance во VueПолучение данных и API-запросы во Vue.jsЭкспорт и импорт данных и компонентов в VueОбработка событий и их передача между компонентами VuejsГайд по defineEmits на Vue 3Понимание core функционала Vue и его применениеПонимание и применение Composition API в Vue 3Понимание и работа с компилятором VueКогда и как использовать $emit и call во VueВзаимодействие с внешними API через Axios в Vue
Веб приложения на Vue архитектура и лучшие практикиИспользование Vite для быстрого старта и сборки проектов на Vue 3Работа с URL и ссылками в приложениях на VueРабота с пользовательскими интерфейсами и UI библиотеками во VueОрганизация и структура исходных файлов в проектах VueИспользование Quasar Framework для разработки на Vue с готовыми UI-компонентамиОбзор популярных шаблонов и стартовых проектов на VueИнтеграция Vue с PHP для создания динамичных веб-приложенийКак организовать страницы и маршруты в проекте на VueNuxt JS и Vue 3 для SSR приложенийСоздание серверных приложений на Vue с помощью Nuxt jsИспользование Vue Native для разработки мобильных приложенийОрганизация и управление индексной страницей в проектах VueИспользование Docker для контейнеризации приложений на VueИнтеграция Vue.js с Django для создания полноценных веб-приложенийСоздание и работа с дистрибутивом build dist Vue приложенийРабота со стилями и CSS в Vue js для красивых интерфейсовСоздание и структурирование Vue.js приложенияКак исправить ошибку cannot find module vueНастройка и сборка проектов Vue с использованием современных инструментовИнтеграция Vue с Bitrix для корпоративных решенийРазработка административных панелей на Vue js
5 библиотек для создания tree view во VueИнтеграция Tailwind CSS с Vue для современных интерфейсовИнтеграция Vue с серверной частью и HTTPS настройкамиКак обрабатывать async операции с Promise во VueИнтеграция Node.js и Vue.js для разработки приложенийРуководство по интеграции Vue js в NET проектыПримеры использования JSX во VueГайд по импорту и регистрации компонентов на VueМногоязычные приложения на Vue с i18nИнтеграция FLIR данных с Vue5 примеров использования filter во Vue для упрощения разработки3 примера реализации drag-and-drop во Vue
Управление переменными и реактивными свойствами во VueИспользование v for и slot в VueПрименение v-bind для динамической привязки атрибутов в VueУправление пользователями и их данными в Vue приложенияхСоздание и использование UI Kit для Vue приложенийТипизация и использование TypeScript в VuejsИспользование шаблонов в Vue js для построения интерфейсовИспользование Swiper для создания слайдеров в VueРабота со стилями и стилизацией в VueСтруктура и особенности Single File Components SFC в VueРабота со SCSS в проектах на Vue для стилизацииРабота со скроллингом и прокруткой в Vue приложенияхПрименение script setup синтаксиса в Vue 3 для упрощения компонентовИспользование scoped стилей для изоляции CSS в компонентах Vue3 способа улучшить навигацию Vue с push()Обработка запросов и асинхронных операций в VueПонимание и использование provide inject для передачи данных между компонентамиПередача и использование props в Vue 3 для взаимодействия компонентовПередача данных между компонентами с помощью props в Vue jsУправление property и функциями во Vue.jsРабота со свойствами компонентов VueУправление параметрами и динамическими данными во VueРабота с lifecycle-хуком onMounted во VueОсновы работы с объектами в VueПонимание жизненного цикла компонента Vue js на примере mountedИспользование модальных окон modal в Vue приложенияхИспользование методов в компонентах Vue для обработки логикиИспользование метода map в Vue для обработки массивовИспользование хуков жизненного цикла Vue для управления состоянием компонентаРабота с ключами key в списках и компонентах VueОбработка пользовательского ввода в Vue.jsРабота с изображениями и их оптимизация в VueИспользование хуков жизненного цикла в VueОрганизация сеток и гридов для верстки интерфейсов на VueСоздание и управление формами в VueОрганизация файлов и структура проекта Vue.jsКомпоненты Vue создание передача данных события и emitРабота с динамическими компонентами и данными в Vue3 способа манипулирования DOM на VueРуководство по div во VueИспользование директив в Vue и их расширенные возможностиОсновы и применение директив в VueИспользование директив и их особенности на Vue с помощью defineИспользование компонентов datepicker в Vue для выбора датОрганизация циклов и итераций во VueКак работает компиляция Vue CoreОбработка кликов и пользовательских событий в VueСоздание и использование компонентов в Vue JSИспользование классов в Vue для организации кода и компонентовИспользование директивы checked для управления состоянием чекбоксов в VueГайд на checkbox компонент во VueОтображение данных в виде графиков с помощью Vue ChartСоздание и настройка кнопок в VueСоздание и настройка кнопок в Vue приложенияхРабота с lifecycle-хуками beforeCreate и beforeMount во VueИспользование массивов и методов их обработки в VueИспользование массивов и их обработка в Vue
Использование Vuetify для создания современных интерфейсов на VueИспользование transition во VueТестирование компонентов и приложений на VueРабота с teleport для управления DOM во VueПять шагов по настройке SSR в VuejsИспользование Shadcn UI компонентов с Vue для продвинутых интерфейсовИспользование router-link для навигации в Vue RouterКак использовать require в Vue для динамического импорта модулейРабота с динамическим рендерингом и виртуальным DOM на Vue.jsИспользование ref для управления ссылками и реактивностью в Vue 3Использование Vue Pro и его преимущества для профессиональной разработкиРуководство по nextTick для работы с DOMСоздание и использование компонентов с помощью Vue js и CУправление состоянием и реактивностью через inject и provideДинамическое обновление компонентов и данных на VueГлубокое изучение документации Vue и как эффективно её использоватьИспользование Crystal с Vue для разработкиОптимизация производительности и предупреждения в VueИспользование вычисляемых свойств для динамического отображения данных на Vue js
Открыть базу знаний

Лучшие курсы по теме

изображение курса

Vue 3 и Pinia

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.9
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

TypeScript с нуля

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Next.js - с нуля

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее

Отправить комментарий