В ядре Vue.js лежит реактивная система, позволяющая автоматически отслеживать изменения состояния и обновлять пользовательский интерфейс без необходимости ручного вмешательства. Каждый объект данных, к которому привязан шаблон, становится реактивным. Vue.js использует механизм геттеров и сеттеров через Proxy, что обеспечивает отслеживание чтения и записи свойств.
Принцип работы:
reactive() или ref().Это обеспечивает избирательное обновление, что является ключевым фактором высокой производительности.
Реактивность охватывает как простые объекты, так и массивы. Однако
существует важный момент: методы массива, такие как push,
pop, splice, уже встроенно вызывают реактивные
обновления, тогда как прямое присвоение нового индекса
arr[10] = value не всегда отслеживается корректно. Для
таких случаев рекомендуется использовать Vue.set() или
полную реактивную замену массива через reactive().
Vue отслеживает вложенные объекты рекурсивно, что позволяет автоматически реагировать на изменения глубоко вложенных данных. Однако при динамическом добавлении новых свойств важно использовать специальные методы для поддержания реактивности.
ref и примитивные типыПримитивные значения (строки, числа, булевы) не могут быть обернуты в
reactive(), поэтому используется ref(). При
этом значение хранится в поле .value, что позволяет Vue
отслеживать его изменения:
import { ref } from 'vue';
const count = ref(0);
count.value++;
computed и ленивые
вычисленияcomputed создаёт вычисляемые свойства,
которые пересчитываются только при изменении зависимостей. Это снижает
лишние рендеры и уменьшает нагрузку на DOM.
import { computed } from 'vue';
const doubled = computed(() => count.value * 2);
Не все данные требуют полной реактивности. Для больших объектов или
коллекций рекомендуется использовать shallowReactive() или
shallowRef(), чтобы отслеживать только верхний уровень
объекта. Это снижает накладные расходы на наблюдение за глубокими
структурами.
Разделение состояния на более мелкие реактивные объекты позволяет Vue отслеживать изменения точечно и минимизировать перерисовку. В больших приложениях это критично для поддержания высокой производительности.
watch и
watchEffectwatch используется для наблюдения за конкретными
реактивными источниками и выполнения побочных эффектов при изменении
данных. Это полезно для асинхронных операций и интеграции с внешними
библиотеками.
import { watch } from 'vue';
watch(count, (newValue, oldValue) => {
console.log(`Изменение: ${oldValue} → ${newValue}`);
});
watchEffect автоматически отслеживает все реактивные
зависимости, используемые внутри функции, и выполняется при их
изменении.
v-once для статических частей
шаблона.key при рендере списков для корректного
диффинга.Vue применяет виртуальный DOM для минимизации операций с реальным DOM. Реактивная система фиксирует изменения данных, а виртуальный DOM вычисляет минимальный набор изменений. Это позволяет обновлять только изменённые узлы, обеспечивая высокую скорость рендеринга даже при сложных интерфейсах.
Пример: при изменении одного элемента в массиве Vue перерисует только этот элемент, а не весь список.
ref или
reactive.computed для сложных вычислений вместо
прямых вызовов внутри шаблона.watch для побочных эффектов вместо лишних
реактивных вычислений в шаблоне.Реактивная система Vue.js сочетает гибкость и
производительность, позволяя строить сложные интерфейсы с
минимальными накладными расходами на обновление DOM, если правильно
использовать возможности reactive, ref,
computed и watch.