В Vue.js система реактивности для массивов имеет несколько ключевых особенностей, которые важно понимать для эффективной работы. Рассмотрим их подробно.
Vue не может обнаружить следующие изменения в массивах:
// 1. Прямое присвоение по индексу
this.items[index] = newValue;
// 2. Изменение длины массива
this.items.length = newLength;
// 3. Использование оператора delete
delete this.items[index];
Почему так происходит?
Vue использует геттеры/сеттеры для отслеживания изменений, а эти операции не вызывают сеттеры массива.
Vue перехватывает и делает реактивными следующие мутационные методы:
push() // Добавление в конец
pop() // Удаление с конца
shift() // Удаление с начала
unshift() // Добавление в начало
splice() // Изменение элементов
sort() // Сортировка
reverse() // Обратный порядок
Методы, возвращающие новые массивы, требуют особого подхода:
// Не вызовет обновления:
this.items.filter(item => item.active);
// Правильно:
this.items = this.items.filter(item => item.active);
Vue.set(vm.items, index, newValue);
Vue.delete(vm.items, index);
import { set, del } from 'vue';
set(items, index, newValue);
del(items, index);
Vue по умолчанию не отслеживает изменения внутри объектов массива:
// Не будет реактивным:
this.items[0].property = newValue;
// Решение:
this.$set(this.items[0], 'property', newValue);
// Или в Vue 3:
set(this.items[0], 'property', newValue);
При использовании v-for важно:
:key
Vue использует асинхронную очередь обновлений, что может вызывать:
this.$nextTick()
Ключевые особенности обнаружения изменений в массивах Vue:
✔ Перехватывает только мутационные методы массивов
✔ Требует специальных API для прямых изменений по индексу
✔ Не отслеживает изменения длины через .length
✔ Для немутационных операций необходимо явное присваивание
✔ Для вложенных объектов требуется глубокая реактивность
✔ Важно правильно использовать ключи в v-for
Понимание этих особенностей поможет избежать распространенных ошибок и писать более эффективный Vue-код.