Как работает реактивность в Vue.js?
Что такое реактивность?
Реактивность - это когда данные изменяются, Vue автоматически обновляет связанные с ними элементы интерфейса. Это достигается с помощью системы отслеживания зависимостей.
Как это работает?
- Vue отслеживает изменения в реактивных переменных.
- При изменении значения компоненты, зависящие от него, автоматически перерисовываются.
- Для работы с реактивными данными используются
ref()
иreactive()
.
ref()
ref()
используется для создания реактивных значений. Он подходит для работы с примитивами (числа, строки, булевы значения) и объектами.
Пример использования ref()
<script setup>
import { ref } from 'vue';
const count = ref(0);
const increment = () => {
count.value++;
};
</script>
count = ref(0);
— создаем реактивное значениеcount
, равное 0.count.value++
— т.к.ref()
требует доступа через.value
, мы увеличиваем значениеcount
именно так.- При изменении
count.value
Vue автоматически обновляет шаблон (template
).
reactive()
reactive()
используется для создания реактивных объектов и массивов.
Пример использования reactive()
<script setup>
import { reactive } from 'vue';
const state = reactive({ count: 0 });
const increment = () => {
state.count++;
};
</script>
state = reactive({ count: 0 });
— создаем объектstate
с реактивным свойствомcount
.state.count++
— увеличиваем значениеcount
без.value
, так какreactive()
работает напрямую с объектами.- Vue автоматически отслеживает изменения и обновляет интерфейс.
Разница между ref() и reactive()
Критерий | ref() | reactive() |
---|---|---|
Поддержка примитивов | Да | Нет |
Поддержка объектов | Да | Да |
Доступ к значениям | Через .value | Прямой доступ |
Глубокая реактивность | Нет | Да |
Изменение структуры | Легко (можно присвоить новое значение) | Нельзя (структура фиксирована) |
Когда использовать?
ref()
— если нужно работать с примитивами.reactive()
— если нужно создать реактивный объект.- Комбинация — можно использовать
ref()
внутриreactive()
, если нужно хранить примитивные значения в реактивном объекте.
Пример комбинированного подхода:
<script setup>
import { reactive, ref } from 'vue';
const state = reactive({
count: ref(0)
});
const increment = () => {
state.count.value++;
};
</script>
state = reactive({ count: ref(0) });
— объектstate
содержит реактивное значениеcount
, созданное черезref()
.state.count.value++
— доступ кref()
внутриreactive()
требует.value
.- Такой подход удобен, если часть данных в объекте должны быть примитивами с возможностью присвоения нового значения.
Итог
Vue.js предоставляет два мощных механизма для работы с реактивными данными:
ref()
— для примитивных значений и объектов с доступом через.value
.reactive()
— для работы с объектами и массивами без.value
.
Оба метода можно комбинировать в зависимости от требований проекта. Выбор зависит от структуры данных и удобства работы с ними.