[Medium] watch vs watchEffect
1. Что такое watch и watchEffect?
Что такое
watchиwatchEffect?
watch и watchEffect — это API Vue 3 для реакции на изменения реактивного состояния.
watch
Определение: явно наблюдает за одним или несколькими источниками и выполняет callback при их изменении.
<script setup>
import { ref, watch } from 'vue';
const count = ref(0);
const message = ref('Hello');
// наблюдение за одним источником
watch(count, (newValue, oldValue) => {
console.log(`count изменился с ${oldValue} на ${newValue}`);
});
// наблюдение за несколькими источниками
watch([count, message], ([newCount, newMessage], [oldCount, oldMessage]) => {
console.log('count или message изменились');
});
</script>
watchEffect
Определение: выполняется немедленно и автоматически отслеживает реактивные зависимости, используемые внутри callback.
<script setup>
import { ref, watchEffect } from 'vue';
const count = ref(0);
const message = ref('Hello');
// автоматически отслеживает count и message
watchEffect(() => {
console.log(`count: ${count.value}, message: ${message.value}`);
// перезапускается при изменении count/message
});
</script>
2. watch vs watchEffect: ключевые различия
Основные различия между
watchиwatchEffect
1. Объявление источника
watch: явные источники.
const count = ref(0);
const message = ref('Hello');
watch(count, (newVal, oldVal) => {
console.log('count изменился');
});
watch([count, message], ([newCount, newMessage]) => {
console.log('count или message изменились');
});
watchEffect: неявное отслеживание зависимостей.
const count = ref(0);
const message = ref('Hello');
watchEffect(() => {
console.log(count.value); // отслеживается автоматически
console.log(message.value); // отслеживается автоматически
});
2. Время выполнения
watch: ленивый по умолчанию; выполняется только после изменения источника.
const count = ref(0);
watch(count, (newVal) => {
console.log('выполнено');
});
count.value = 1; // запуск ает callback
watchEffect: выполняется немедленно, затем перезапускается при обновлении зависимостей.
const count = ref(0);
watchEffect(() => {
console.log('выполнено'); // немедленный первый запуск
console.log(count.value);
});
count.value = 1; // выполняется снова
3. Доступ к старому значению
watch: предоставляет newValue и oldValue.
const count = ref(0);
watch(count, (newVal, oldVal) => {
console.log(`с ${oldVal} на ${newVal}`);
});
watchEffect: прямого доступа к старому значению нет.
const count = ref(0);
watchEffect(() => {
console.log(count.value); // только текущее значение
});