Vue.js активно использует Proxy-объекты для реализации реактивности. Proxy в JavaScript — это объект-обёртка, который позволяет перехватывать и настраивать базовое поведение других объектов, включая чтение, запись и вызовы методов. В контексте Vue Proxy служит основным инструментом для отслеживания изменений данных и автоматического обновления DOM.
Синтаксис создания Proxy выглядит так:
const target = { message: "Hello" };
const handler = {
get(target, prop, receiver) {
console.log(`Чтение свойства ${prop}`);
return Reflect.get(target, prop, receiver);
},
set(target, prop, value, receiver) {
console.log(`Установка свойства ${prop} = ${value}`);
return Reflect.set(target, prop, value, receiver);
}
};
const proxy = new Proxy(target, handler);
target — объект, который оборачивается.handler — объект с ловушками (get,
set и др.), позволяющими перехватывать операции.Reflect используется для корректной делегации
стандартных операций объекту.При обращении к свойствам через proxy автоматически
вызываются методы из handler, что позволяет
реагировать на изменения данных.
Vue 3 отказался от устаревшей системы
Object.defineProperty и полностью перешёл на Proxy. Это
дало несколько ключевых преимуществ:
Поддержка вложенных объектов Ранее для реактивности приходилось рекурсивно определять геттеры и сеттеры на всех уровнях объекта. Proxy позволяет перехватывать любые уровни вложенности динамически.
Поддержка динамически добавляемых свойств В Vue
2 добавление новых свойств в объект требовало вызова
Vue.set. В Vue 3 Proxy перехватывает операцию
set и сразу делает новое свойство реактивным.
Оптимизация производительности Proxy создаётся один раз для объекта и автоматически отслеживает все операции без необходимости обхода всех свойств.
Для создания реактивного объекта Vue использует функцию
reactive:
import { reactive } from 'vue';
const state = reactive({
count: 0,
user: {
name: 'Alice'
}
});
state.count++; // Автоматически обновляет привязки в шаблоне
state.user.name = 'Bob'; // Обновление вложенного объекта также реактивно
Внутри reactive Vue создаёт Proxy с ловушками
get, set, deleteProperty и
другими для отслеживания чтения и изменения свойств. Каждое изменение
автоматически уведомляет систему реактивности и обновляет DOM.
Основные ловушки, используемые Vue:
get(target, prop, receiver) Отслеживает чтение свойства. При чтении свойства Vue регистрирует зависимость, чтобы знать, какие компоненты нужно обновлять при изменении.
set(target, prop, value, receiver) Отслеживает запись. При изменении значения Vue инициирует повторный рендер компонентов, использующих это свойство.
deleteProperty(target, prop) Отслеживает удаление свойства, чтобы реактивно обновлять компоненты при удалении данных.
has(target, prop) и
ownKeys(target) Используются для отслеживания операций
типа prop in obj и обхода объекта в циклах
for...in или Object.keys.
Когда компонент читает значение реактивного объекта через Proxy, Vue автоматически регистрирует зависимость. Каждое обновление свойства инициирует эффект, который повторно вычисляет шаблон компонента.
import { reactive, effect } from 'vue';
const state = reactive({ count: 0 });
effect(() => {
console.log(`Count: ${state.count}`);
});
state.count++; // Лог автоматически обновится
Proxy позволяет Vue автоматически определять, какие именно свойства были использованы, без необходимости ручного указания зависимостей.
ref.Proxy.prototype, поэтому методы встроенных объектов
работают стандартным образом.JSON.stringify Proxy
превращается в обычный объект.Proxy является центральным элементом реактивной системы Vue 3. Он обеспечивает:
Благодаря Proxy Vue стал более гибким и производительным, позволяя создавать сложные интерфейсы с минимальными усилиями по управлению состоянием.