Vue.js построен на системе реактивности, позволяющей автоматически отслеживать изменения данных и обновлять DOM. Каждое свойство объекта, обернутое Vue, становится реактивным через геттеры и сеттеры. Это позволяет эффективно связывать состояние приложения с отображением, избегая ручного обновления интерфейса.
Реактивность основана на двух ключевых механизмах:
Использование этих механизмов позволяет создавать высокопроизводительные интерфейсы без сложного кода синхронизации состояния.
Объекты становятся реактивными с помощью
reactive или ref. Основное различие:
reactive оборачивает объект целиком, сохраняя вложенные
свойства реактивными.ref оборачивает примитивное значение или объект,
предоставляя .value для доступа.import { reactive, ref } from 'vue';
const state = reactive({ count: 0 });
const message = ref('Привет');
Особенности массивов:
push, pop,
splice) отслеживаются Vue.splice или reactive массивы.state.items.splice(1, 1, 'новый элемент'); // гарантированно реактивно
Вычисляемые свойства (computed)
позволяют создавать кэшируемые вычисления, которые
автоматически обновляются при изменении зависимостей.
import { computed } from 'vue';
const doubled = computed(() => state.count * 2);
Ключевые моменты:
doubled.value.Наблюдатели (watch) полезны для
выполнения побочных эффектов:
import { watch } from 'vue';
watch(() => state.count, (newValue, oldValue) => {
console.log(`Count изменился с ${oldValue} на ${newValue}`);
});
Различие:
computed – для вычисления
значений.watch – для реакции на изменения,
часто используется для асинхронных операций.При работе с большими структурами данных важно минимизировать количество пересчетов и обновлений DOM.
Техники:
const userInfo = reactive({ name: 'Иван', age: 30 });
const userPreferences = reactive({ theme: 'dark', notifications: true });
shallowReactive и
shallowRef: Эти методы делают только
верхний уровень объекта реактивным, снижая накладные расходы
при работе с вложенными структурами.import { shallowReactive } from 'vue';
const data = shallowReactive({ nested: { value: 0 } });
Оптимизация массивов:
splice или
push.При обновлении списка Vue использует виртуальный DOM для минимизации операций с настоящим DOM.
Рекомендации:
key для v-for, чтобы
Vue мог точно сопоставлять элементы.<li v-for="item in items" :key="item.id">{{ item.name }}</li>
Для сложных вычислений или фильтраций больших массивов важно избегать ненужных пересчетов.
computed для ленивых вычислений.const filteredItems = computed(() => items.value.filter(item => item.active));
nextTickИногда требуется выполнить код после обновления DOM, чтобы гарантировать корректное состояние элементов:
import { nextTick } from 'vue';
state.count++;
await nextTick();
console.log('DOM обновлен');
nextTick полезен при интеграции с внешними библиотеками,
манипуляциями DOM и тестировании.
v-once и
v-memov-once – одноразовый рендеринг, когда
содержимое компонента не меняется.v-memo (Vue 3.3+) – кэширует результат
вычисления шаблона при неизменных зависимостях, снижая количество
операций рендера.<div v-once>{{ state.message }}</div>
Эти инструменты позволяют экономить ресурсы при отображении статичных или редко изменяющихся данных.
При подписке на часто изменяющиеся данные (например, ввод пользователя) полезно ограничивать частоту выполнения функций:
import { watch } from 'vue';
import { debounce } from 'lodash';
watch(() => state.input, debounce((value) => {
console.log('Обновление после паузы', value);
}, 300));
Это предотвращает чрезмерные обновления компонентов и снижает нагрузку на приложение.
computed и watch только там,
где действительно необходимо.shallowReactive для больших и вложенных
объектов.Эти подходы обеспечивают быструю и предсказуемую реактивность, снижая нагрузку на рендеринг и увеличивая отзывчивость интерфейса.