Во Vue.js реактивность является основой построения интерфейсов. Два
ключевых инструмента для работы с реактивными данными — это
ref и
reactive, обеспечивающие автоматическое
отслеживание изменений и обновление DOM.
ref —
реактивная ссылка на примитивы и объектыФункция ref используется для создания реактивной
ссылки на любое значение, включая примитивы: строки, числа,
булевы значения.
import { ref } from 'vue';
const count = ref(0);
function increment() {
count.value++;
}
Особенности ref:
.value.count.value автоматически вызывают
обновление компонентов, где используется этот ref.ref Vue не делает глубокую реактивность по умолчанию —
применяется поверхностная реактивность.Пример с объектом:
const user = ref({
name: 'Иван',
age: 30
});
user.value.age++;
Здесь изменение age также отслеживается системой
реактивности.
reactive
— реактивность объектов и массивовФункция reactive предназначена для создания
реактивного объекта или массива, где Vue автоматически делает
все вложенные свойства реактивными.
import { reactive } from 'vue';
const state = reactive({
count: 0,
user: {
name: 'Иван',
age: 30
}
});
state.count++;
state.user.age++;
Особенности reactive:
.value.ref.ref и
reactive| Характеристика | ref | reactive |
|---|---|---|
| Поддержка примитивов | Да | Нет |
| Доступ к значению | Через .value |
Прямой доступ |
| Глубокая реактивность | Нет (для объектов — поверхностная) | Да |
| Применение | Примитивы, иногда объекты | Объекты и массивы |
Рекомендации по использованию:
string,
number, boolean) использовать
ref.object, array)
предпочтительнее reactive.ref часто
применяется toRefs или деструктуризация через
reactive.В шаблонах Vue обращаться к реактивным переменным можно напрямую, без
.value:
<template>
<div>
<p>Счетчик: {{ count }}</p>
<button @click="increment">Увеличить</button>
</div>
</template>
<script setup>
import { ref } from 'vue';
const count = ref(0);
function increment() {
count.value++;
}
</script>
Vue автоматически «разворачивает» ref в шаблоне, поэтому
.value использовать не нужно. Для реактивных объектов через
reactive доступ к свойствам также осуществляется
напрямую.
Иногда удобно комбинировать ref и reactive
для разных частей состояния:
const state = reactive({
todos: []
});
const filter = ref('all');
function addTodo(text) {
state.todos.push({ text, done: false });
}
function setFilter(value) {
filter.value = value;
}
Это позволяет гибко управлять примитивными значениями и сложными объектами в одном компоненте.
Для создания реакций на изменения данных используют
watch и computed. ref и
reactive интегрируются с ними одинаково.
import { reactive, watch } from 'vue';
const state = reactive({ count: 0 });
watch(() => state.count, (newValue, oldValue) => {
console.log(`Счетчик изменился с ${oldValue} на ${newValue}`);
});
Здесь watch отслеживает любое изменение свойства
count и выполняет функцию-обработчик.
ref — для одиночных примитивов и ситуаций, где нужна
ссылка на значение.reactive — для сложных объектов, массивов и структур
данных с глубокой реактивностью.ref и reactive позволяет
строить гибкие и масштабируемые состояния компонентов.Эти инструменты являются фундаментом Vue 3 Composition API и позволяют создавать реактивные интерфейсы без излишней сложности, обеспечивая прозрачное обновление данных и DOM.