composition APIμ
watch
λ λ°μν μνκ° λ³κ²½ λ λλ§λ€, μ΄λ₯Ό κ°μ§νμ¬ νΉμ μμ μ μννκ² νλ "κ°μμ μν "μ νλ€.watch(/* Source Type */, (newValue, oldValue) => {});
ν λ§λλ‘, λ°μν μνκ° λ³κ²½ λμμ λ μ΄λ₯Ό κ°μ§νμ¬ λ€λ₯Έ μμ (DOMλ³κ²½, λΉλκΈ° μμ λ±λ±..)μ ν΄μΌνλ μν©μμ μ¬μ©νλ μμ±μ΄λ€.
κ°λ¨ν μμλ₯Ό μ΄ν΄λ³΄μ.
<script setup>
const message = ref('Hello');
watch(message, (newValue, oldValue) => {
console.log('newValue' : newValue);
console.log('oldValue' : oldValue);
})
</script>
μμ μμμμ message
μ κ°μ΄ 'Hello World!'λ‘ λ³κ²½λλ€λ©΄, μ½μμ°½μλ λ€μκ³Ό κ°μ΄ μΆλ ₯λ κ²μ΄λ€.
newValue : Hello World!
oldValue : Hello
watch
μ 첫 λ²μ§Έ 맀κ°λ³μλ λ€μν νμ
(ref
, reactive
, computed
, array
λ±)μ΄ λ μ μλ€.
const x = ref(0);
const y = ref(0);
// ref
watch(x, (newX) => {
console.log(newX);
})
// getter
watch(
() => x.value + y.value,
(sum) => {
console.log(sum);
}
)
// array
watch([x, () => y.value], ([newX, newY]) => {
console.log(newX, newY);
})
μ¬κΈ°μ μ£Όμν μ μ μμ κ°μ λ°©μμΌλ‘λ λ°μν κ°μ²΄μ μμ±μ λ³Ό μ μλ€λ κ²μ΄λ€.
μ°λ¦¬λ λ무λ λΉμ°νκ²λ watch
λ₯Ό κ°μ²΄μ μμ±μλ μ¬μ©νλ €κ³ μλν΄λ³Ό κ²μ΄λ€. (λλ κ·Έλ¬μΌλ―λ‘...)
const obj = reactive({ count: 0 });
watch(obj.count, (newValue) => {
console.log('newValue: ', newValue);
});
watchκ° μ λλ‘ μλνμ§ μλλ€.
μ κ·Έλ΄κΉ?
console.log(typeof obj.count);
// number μΆλ ₯
obj.countμ νμ
μ λ°μν κ°μ²΄κ° μλ 'number'νμ
μ΄λ€.
κ·Έλ¬λ―λ‘ watchκ° λμνμ¬ κ°μ§ν μ μλ€.
κ·Έλ¬λ©΄ λ°©λ²μ΄ μμκΉ?
λμ getterν¨μλ₯Ό μ¬μ©νλ©΄ λλ€.
const obj = reactive({ count: 0 });
watch(() => obj.count, (newValue) => {
console.log('newValue: ', newValue);
});
λ, μ¬κΈ°μ κ°μ²΄μ μμ±μ΄ μλ κ°μ²΄ κ·Έ μ체λ₯Ό 첫λ²μ§Έ 맀κ°λ³μλ‘ μ£Όλ©΄ μ΄λ»κ² λ κΉ?
<script setup>
const obj = reactive({ count: 0 });
watch(obj, (newValue, oldValue) => {
console.log('newValue' : newValue);
console.log('oldValue' : oldValue);
})
</script>
newValue
, oldValue
λͺ¨λ κ°μ κ°μ²΄λ₯Ό λ°λΌλ³΄λ―λ‘, countκ° 1λ‘ λ³κ²½λ λ newValue
, oldValue
λͺ¨λ 1μ μΆλ ₯νλ€.
deepκ³Ό immediateλ watch μ€λΈμ νΈμ μ΅μ μ΄λ€.
deep : μ§μ ν μμ± μμ μμΌλ©°, μ§μ ν μμ±μ μμ± κ°λ κ°μνλ€.
immediate : watchμ μ²λ¦¬λ₯Ό νμ΄μ§λ₯Ό μ΅μ΄μ μ¦μ μ€ννλ€.
deep
μ, μ§μ ν μμ±μμ μλ μμ±μ κ°λ κ°μνκ² νλ watch
μ μ΅μ
μ΄λ€.
λ°μν κ°μ²΄λ₯Ό μ§μ watch()
νλ©΄ μμμ μΌλ‘ κΉμ κ°μμκ° μμ±λλ€. μ¦, μμ± λΏλ§μλλΌ λͺ¨λ μ€μ²©λ μμ±μλ νΈλ¦¬κ±°λλ€.
μμλ₯Ό ν΅ν΄ μ΄ν΄λ³΄μ.
const person = reactive({
name: 'νκΈΈλ',
age: 30,
hobby: 'μ΄λ',
obj: {
count: 0,
},
});
watch(person, (newValue) => {
console.log('newValue: ', newValue);
});
person
κ°μ²΄μ obj
μμ±μ count
κ° λ³κ²½λμ΄λ, μ΄λ₯Ό κ°μ§νμ¬ μ½μμ°½μ μΆλ ₯λλ€.
λ€λ§, getter
ν¨μλ‘ κ°μ²΄λ₯Ό λκΈΈ κ²½μ°μλ κ°μ²΄μ κ°μ΄ λ°λ κ²½μ°μλ§ νΈλ¦¬κ±° λλ€. μ€μ²©λ μμ±μ νΈλ¦¬κ±° λμ§ μλλ€.
μμμ μ°λ¦¬λ κ°μ²΄μ μμ±μ 첫λ²μ§Έ 맀κ°λ³μλ‘ μ¬μ©ν λ watch
κ° λμνμ§ μμ getter
ν¨μλ₯Ό μ¬μ©νμλ€.
watch(
() => person.obj,
(newValue) => {
// κ°μ²΄μ κ°μ΄ λ°λ κ²½μ°μλ§ νΈλ¦¬κ±° λλ€.
}
);
μ΄ κ²½μ°, obj
μ μμ±μΈ count
κ° λ³κ²½λμ΄λ watch
κ° λμνμ§ μλλ€. obj
μμ²΄κ° λ³κ²½λ λλ§ λμνλ€.
ex) obj: "Hello!" λ‘ objκ° λ³κ²½λμ κ²½μ°μλ§ λμ.
deep
μ΅μ
μ μ¬μ©νλ©΄ κΉμ κ°μμλ‘ κ°μ ν μ μλ€.
watch(
() => person.obj,
(newValue) => {
console.log('newValue: ', newValue);
},
{ deep: true } //λ§μ§λ§ 맀κ°λ³μ
);
immediate
λ μ΅μ΄μ μ¦μμ€ν νκ² νλ μ΅μ
μ΄λ€.
watch
λ λ°μν λ°μ΄ν°λ₯Ό κ°μνλ€κ°, λ°μν λ°μ΄ν°μ λ³νλ₯Ό κ°μ§νμ λ μ½λ°± ν¨μκ° μ€νλλ€.
νμ§λ§, immeditate
μ΅μ
μ μ¬μ©νλ©΄ μ΅μ΄μ νμ΄μ§λ₯Ό μ½μμ λ μ¦μμ€ννκ² λ§λ€ μ μλ€.
const message = ref('Hello World!');
const reverseMessage = ref('');
watch(
message,
(newValue) => {
reverseMessage.value = newValue.split('').reverse().join('');
},
{
immediate: true,
}
);
immditate
μ΅μ
μ μ£Όμ§ μμμ λλ, message
μ λ³κ²½μ΄ μμμΌλ―λ‘ reverseMessage
μ κ°λ μ¬μ ν ''μ΄λ€.
message
μ λ³κ²½μ΄ μμ΄μΌλ§ reverseMessage
μ '!dlroW olleH'κ° λ΄κΈ΄λ€.
νμ§λ§, immediate
μ΅μ
μ true
λ‘ μ£Όλ©΄ νμ΄μ§κ° μ΅μ΄ λ‘λλ λ μ¦μμ€νλμ΄ λ°λ‘ reverseMessage
μ '!dlroW olleH'κ° λ΄κΈ΄λ€.
π« μ£Όμμ¬ν
deep μ΅μ μ ν° λ°μ΄ν° ꡬ쑰μμ μ¬μ©ν λ λΉμ©μ΄ λ§μ΄ λ€ μ μλ€. νμν κ²½μ°μλ§ μ¬μ©νκ³ μ±λ₯ μν₯μ μ£Όμν΄μΌνλ€.
computed
μ watch
λ λΉμ·ν μν μ μννλ€.
//computed
computed(() =>
message.value.split('').reverse().join('')
);
//watch
watch(
message,
(newValue) => {
reverseMessage.value = newValue.split('').reverse().join('');
}
);
computed
λ‘ κ΅¬ννλ κ²μ΄ μ’λ€.reverseMessage
λ message
κ°μ λ°λΌ κ²°μ λμ΄μ§λ μ’
μκ΄κ³μ μλ€. μ΄ μ’
μκ΄κ³ μ½λκ° λ³΅μ‘ν΄μ§λ©΄ watch
λ‘ κ΅¬νν κ²½μ° λ 볡μ‘ν΄μ§κ±°λ μ€λ³΅κ³μ° λλ μ€λ₯λ₯Ό λ°μμν¬ μ μλ€.computed
λ‘ κ΅¬ν κ°λ₯ν κ²μ΄λΌλ©΄ watch
κ° μλλΌ computed
λ‘ κ΅¬ννλκ² λλΆλΆ μ³λ€.WatchEffectλ μ½λ°± ν¨μ μμ λ°μμ± λ°μ΄ν°μ λ³νκ° κ°μ§λλ©΄ μλμΌλ‘ λ°μνμ¬ μ€ννλ€.
κ·Έλ¦¬κ³ WatchEffectμ μ½λλ μ»΄ν¬λνΈκ° μμ±λ λ μ¦μ μ€νλλ€.
μμλ₯Ό μ΄ν΄λ³΄μ.
const message = ref('');
watchEffect(()=> {
console.log(message.value);
})
μμ μμμ κ²½μ°, message
λ°μν λ°μ΄ν°κ° λ³κ²½λ λλ§λ€ μ½μμ΄ μΆλ ₯λλ€.
μ½λ°± ν¨μ μμ λ°μν λ°μ΄ν°κ° λ³κ²½λλ©΄ μλμΌλ‘ κ°μ§νμ¬ μ€νλλ κ²μ΄λ€.
μ΄κ²μ μΈμ μ¬μ©ν κΉ?
μλμ μ₯ κΈ°λ₯μ λ§λ λ€κ³ μκ°ν΄λ³΄μ.
save()
λ‘ μ μ₯ν¨μλ₯Ό λ§λ€μ΄ λκ³ , μ΄μ κ°μ΄ watchEffectλ₯Ό μ¬μ©νλ κ²μ΄λ€.
const message = ref('');
watchEffect(()=> {
save(message.value);
})
μμ κ°μ΄ μ½λλ₯Ό μμ±νλ©΄, λ΄μ©μ΄ μμ λ λλ§λ€ μλμΌλ‘ μ μ₯ν¨μ save()
κ° μ€νλλ€.
TIP! λ°μΈλ©λv-model
μ .lazy
μ΅μ
μ μ€λ€λ©΄ ν¬μ»€μ€κ° μ΄λλμμλ μ μ₯νλ λ°©μμΌλ‘λ λ³κ²½ν μ μμ κ²μ΄λ€.
watch
μ watchEffect
λ λ€ κ΄λ ¨ μμ
(api call, push route λ±)μ λ°μμ μΌλ‘ μνν μ μκ² ν΄μ€λ€. νμ§λ§ μ£Όμν μ°¨μ΄μ μ κ΄λ ¨λ λ°μν λ°μ΄ν°λ₯Ό μΆμ νλ λ°©μμ΄λ€.
μΈνλ° vue3 κΈ°λ³ΈνΈ - μ§μ½λ©
https://ko.vuejs.org/api/options-state.html#watch
κ°μ²΄λ λ°°μ΄μ μ£Όλ‘ μ¬μ©νλ μ€λ¬΄μμ watchκ° μ λμνμ§ μλ κ²½μ°κ° λ§μλ€.
watchλ₯Ό μ¬μ©νλ κ²μ΄ λ λΆνΈνμλλ° μ΄λ κ² ν¬μ€ν
νκ³ λλ μ λλ‘ μ 리 λ κΈ°λΆμ΄λ€.
μ΄ ν¬μ€ν μ λλ₯Ό μν ν¬μ€ν μ΄λ€.. μμΌλ‘λ μμ£Ό λ°©λ¬Έν λλ₯Ό μν΄ μμμ μ νλ€! watchλ₯Ό νΈλ¦¬νκ² μ μ¬μ©ν μ μκΈ°λ₯Ό!
μ’μ κΈ κ°μ¬ν©λλ€. μμ£Ό λ°©λ¬Έν κ²μ :)