В Vue.js реактивность массивов имеет важные особенности. В отличие от мутационных методов, некоторые операции с массивами не вызывают автоматического обновления отображения. Рассмотрим их подробно.
Эти методы возвращают новый массив, но не изменяют исходный, поэтому Vue их не отслеживает:
filter() // Создает новый массив с отфильтрованными элементами
concat() // Возвращает новый объединенный массив
slice() // Возвращает копию части массива
map() // Создает новый массив с преобразованными элементами
Пример проблемы:
// Не вызовет обновления, так как возвращает новый массив
this.items = this.items.filter(item => item.isActive);
// Требуется явное присваивание, чтобы обновить отображение
Эти методы только возвращают информацию о массиве:
includes() // Проверяет наличие элемента
indexOf() // Возвращает индекс элемента
join() // Объединяет элементы в строку
toString() // Преобразует массив в строку
lastIndexOf() // Последнее вхождение элемента
this.items[2] = newValue; // Не вызывает обновления
this.items.length = 0; // Не работает реактивно
delete this.items[1]; // Не вызывает обновления
// Всегда используйте присваивание
this.items = this.items.concat(newItems);
// Vue 2
Vue.set(this.items, index, newValue);
// Vue 3
import { set } from 'vue';
set(this.items, index, newValue);
// Альтернатива
this.items.splice(index, 1, newValue);
// Вместо delete или length
this.items.splice(index, 1); // Работает реактивно
Не вызывают автоматического обновления отображения:
✔ Все немутационные методы (filter, map, slice и др.) без присваивания
✔ Методы доступа (includes, indexOf и др.)
✔ Прямое изменение по индексу
✔ Изменение свойства length
✔ Оператор delete
Для корректной работы с массивами в Vue:
Правильное понимание этих особенностей критически важно для работы с массивами во Vue-приложениях.