๋๋ ์ ๋ฐฐ ๊ฐ๋ฐ์๋ถ๋ค์ฒ๋ผ watch๋ก ๋๋ฒ๊ทธ ํ๊ณ ์ถ์ด์ ์ฐ๋ ๊ธ
1. watch๋ ๋ฌด์์ธ๊ฐ
Vue3 Composition API์์ ๋ฐ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ํ๊ณ , ๋ณํ๊ฐ ์๊ธธ ๊ฒฝ์ฐ ํน์ ๋ก์ง(=์ฝ๋ฐฑํจ์)๋ฅผ ์คํํ๋ค.
์ฃผ๋ก ๋ฐ์ํ ๋ฐ์ดํฐ(ref, reactive)์ ๋ณํ๋ฅผ ๊ฐ์งํ์ฌ ์ฌ์ฉ์๊ฐ ์ํ๋ ์์ ์ ์ฌ์ฉํ๋๋ก ํ ์ ์๋ค.
- ๋ฐ์ดํฐ ๋ณํ๋ฅผ ๊ฐ์ง - ํน์ ์์ ํธ๋ฆฌ๊ฑฐ
- ๋น๋๊ธฐ ๋ก์ง ์ํ(ex. APIํธ์ถ)
- ๋๋ฒ๊น ์ ์ ์ฉ(๋ด๊ฐ ์ ์ผ ๋ฐฐ์ฐ๊ณ ์ถ์ ์ด์ !!!!!!1!)
- ๋ถํ์ํ ๋ ๋๋ง ๋ฐฉ์ง ๋ฑ
2. watch์ ๊ตฌ์กฐ
watch(source, callback, options?)
- source : ๊ฐ์ ๋์. ๊ฐ์ํ ref๋ reactive, getterํจ์, ๋ฐฐ์ด๋ก ์ ๋ฌ ๊ฐ๋ฅํ๋ค.
- callback : ๊ฐ์ง๋ ๋ณํ๊ฐ ๋ฐ์ํ์ ๋ ์คํํ ํจ์. ์ฆ ์ฝ๋ฐฑํจ์์ด๋ค. ๋ ๊ฐ์ ๋งค๊ฐ๋ณ์(์ ๊ฐ newValue, ์ด์ ๊ฐ oldValue)๋ฅผ ๊ฐ์ง๋ค.
- options : ์ถ๊ฐ ์ค์ ์ ์ํ ๊ฐ์ฒด. ์ฃผ๋ก immediate์ deep๋ฅผ ๋ง์ด ์ฌ์ฉํ๋๋ผ.
- immediate : ๊ฐ์์๊ฐ ์์ฑ๋๋ ์ฆ์ ์ฝ๋ฐฑ ํธ์ถ. ์ต์ด ํธ์ถ ์ ์ด์ ๊ฐ์ undefined
- deep : ์ ๋ฌ๊ฐ ์์ค(=source)๊ฐ ๊ฐ์ฒด์ธ ๊ฒฝ์ฐ, ๊น์ ๋ณ๊ฒฝ์ฌํญ์๋ ์ฝ๋ฐฑ์ด ์คํ๋๋๋ก ํ๋ค. ๊ฐ์ฒด ๋ด๋ถ๊น์ง ๊น์ ๊ฐ์ ์ํ
- flush : ์ฝ๋ฐฑ์ ๋ฐ์ ํ์ด๋ฐ์ ์กฐ์ ํ๋ค(watchEffect)
- onTrack / onTrigger : ๊ฐ์์์ ์์กด์ฑ์ ๋๋ฒ๊ทธํ๋ค.
- once : ์ฝ๋ฐฑ์ ํ๋ฒ๋ง ์คํํ๋ค. ์ฒซ๋ฒ์งธ ์ฝ๋ฐฑ ํจ์๊ฐ ์คํ๋ ํ ์๋์ผ๋ก ์ค์งํ ์ ์๋ค.
3. watch์ ์ฌ์ฉ๋ฒโญโญ
์ฌ์ค์ ์ค๋ ํฌ์คํ ์์ ์ ์ผ ์ค์ํ ๋ถ๋ถ์ด๋ค.
๊ธฐ๋ณธ ์ฌ์ฉ
- ref๊ฐ์
const count = ref(0);
watch(count, (newValue, oldValue) => {
console.log(`Count changed from ${oldVal} to ${newVal}`);
});
- getter(reactive) ๊ฐ์
const state = reactive({ count:0 });
watch(()=>state.count, (newValue, oldValue)=>{
// newValue์๋ ์ฆ๊ฐ๋ count๊ฐ, oldValue์๋ ๊ธฐ์กด์ count๊ฐ์ด ์ถ๋ ฅ๋ ๊ฒ์ด๋ค.
});
- immediate ์คํ
const keyword = ref('');
watch(keyword, (newValue) => {
console.log('์ฐพ๋ ๊ฐ : ', newValue);
}, { immediate : true });
watch์ค์ ์งํ, ํ์ด์ง ๋ก๋ฉ ์ ํ๋ฒ์ ๋ฌด์กฐ๊ฑด ์คํ ๋๋ค. ๋ฐ๋ก ๋ด๊ฐ newValue๋ฅผ ์์ฑํ์ง ์์๋!
- deep ์คํ
const ninja = reactive({
name : 'Naruto',
age : 15,
favouriteFood : 'Ramen',
});
// reactive์ ๊ฐ์ ๊ฐ์ฒด๋ฐ์ดํฐ์ด๋ฏ๋ก source๋ ํจ์๊ผด์ด์ด์ผ ํ๋ค.
watch(
() => ninja,
(newValue, oldValue) => {
// ๊ฐ์ฒด๊ฐ ์ฌ์ค์ผ๋ก ๋ฐ๋๋ค๋ฉด newValue์๋ ์ฌ์ค์ผ๊ฐ, oldValue์๋ ๋๋ฃจํ ๊ฐ ๋ค์ด๊ฐ ๊ฒ์ด๋ค.
}, {deep:true}
);
์ฌ๊ธฐ์ ninja ๊ฐ์ฒด์ name, age, favouriteFood ์ ๋ถ ๋ค ๊ฐ์งํ๋ค.
4. watch์ computed์ ์ฐจ์ด์ ?
๋ ๋ค Vue์์ ์ํ ๋ณํ์ ๋ํด ์ฒ๋ฆฌํ๋ ๊ฒ์ ์ฌ์ฉ๋์ง๋ง, ๋์ ๋ฐฉ์์์ ๋ค์ ์ฐจ์ด๊ฐ ์๋ค.
watch
- ๋ฐ์ดํฐ ๋ณํ๋ฅผ ๊ฐ์งํด ๋ถ์์ ์ธ ์์ (=api ํธ์ถ, ๋๋ฒ๊น )์ ์ํํจ
- ์ง์ ํ ์ฝ๋ฐฑํจ์ ์คํ
- ๋น๋๊ธฐ ์์ ์ ์ ํฉํจ(setTimeout๊ณผ ๊ฐ์๊ฒ)
// count๊ฐ ๋ณ๊ฒฝ๋๋ฉด alert ์คํ
const count = ref(0);
watch(count, (newValue)=>{
alert(newValue, 'ํ ๋๋ฌ์ง');
});
computed
- ์๋ก์ด ๊ฐ ๊ณ์ฐ, ์บ์ฑ๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณต
- ๋ฐ์ดํฐ ๋ณํ ์ ์๋ก์ด ๊ฐ ๊ณ์ฐ ํ ์บ์ฑ
- ๋น๋๊ธฐ ์์ ์ง์ ์ํจ
const givenName = ref('Naruto');
const familyName = ref('Uzumaki');
// givenName๊ณผ familyName์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
const fullName = computed(()=>{
`${familyName.value} ${givenName.value}` // Uzumaki Naruto ์ถ๋ ฅ๋จ
});
giveName.value = 'Sasuke';
familyName.value = 'Uchiha';
console.log(`${familyName.value} ${givenName.value}` ); // Uchiha Sasuke ์ถ๋ ฅ๋จ
5. watch vs watchEffect
watch๋ source๊ฐ ๋ฐ๋์ ๋ช ์์ ์ผ๋ก ํ์ํ๋ฉฐ, newValue์ oldValue๋ฅผ ์ธ์๋ก ๋ฐ๋๋ค.
๊ทธ๋ ์ง๋ง ๊ทธ ๋ชจ๋ ๊ฒ์ ํ๋ฐฉ์ ํ์ ์๊ฒ๋ ๋ง๋ค์ด๋ฒ๋ฆฌ๋ ์น๊ตฌ๊ฐ ๋ฐ๋ก watchEffect....
watchEffect๋ watch์ ๊ธฐ๋ฅ์ ๋น์ทํ์ง๋ง
โ source๊ฐ ํ์ ์๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๊ทธ๋ฅ ๋ด๋ถ์์ ์ฌ์ฉ๋ ๋ชจ๋ ๋ฐ์ํ ๋ฐ์ดํฐ๊ฐ ์ข ์๋๋ค.
โก ์ฝ๋ฐฑ ํจ์์ ์ธ์๊ฐ ์ ๊ณต๋์ง ์๊ณ , ๋ด๋ถ์์ ์ํ๋ฅผ ์ง์ ํ์ธํ๋ค.
const count = ref(0);
watchEffect(()=>{
console.log('๋๋ฅธ ํ์ :' , count.value);
});
// ref๊ฐ ์ฌ๊ธฐ์ count๋ฐ์ ์์ง๋ง
// name์ด๋ age ๋ฑ์ ref๊ฐ ์ฌ๋ฌ๊ฐ ์๊ธธ ๋์๋ watchEffectํจ์ ๋ด์ ์์ฑํด์ ๊ทธ๋ฅ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
๋๋ถ๋ถ์ ์ํฉ์์ ๊ทธ๋ฅ watch๋ฅผ ์ฌ์ฉํ๊ณ , ๊ฐ๋จํ๊ฒ ๋ฐ์ํ ๋ฐ์ดํฐ๋ฅผ ์ถ์ ํ๊ฑฐ๋ ๊ฐ์ ๋์ ์ง์ ์์ด ์ํ ๋ณํ์ ๋ฐ์ํ๋ ค ํ ๋ ์ฌ์ฉํ ์ ์๋ค.
watchEffect๋ก ๊ท์ฐฎ๊ฒ source ์ค์ ์์ด ๋๋ฒ๊น ๊ฐ๋ฅํ ์ง๋....?
+ ์ถ๊ฐ ๊ถ๊ธ์ฆ
watch์์ source์๋ฆฌ์ ์ผ๋ฐ๋ณ์๋ฅผ ์ธ ๋์ () => {}์ ์ฐจ์ด๋ ๋ฌด์์ผ๊น?
1. ์ผ๋ฐ ๋ณ์๋ฅผ source์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
- ์ผ๋ฐ ๋ณ์๋ refํน์ reactive๋ก ์ถ์ถํ ํน์ ๋ณ์๊ฐ ์ฌ ์ ์๋ค.
- Vue๋ ์ด ๋ณ์๋ฅผ ๋ฐ์ํ์ผ๋ก ์ถ์ ํ๊ณ , ๊ฐ์ด ๋ฐ๋ ๋ ๋ง๋ค ์ฝ๋ฐฑ(callback)์ด ์คํ๋๋ค.
- ๊ฐ๋จํ "๋จ์ผ ๋ณ์"๋ฅผ ๊ฐ์ํ ๋ ์ฌ์ฉํ๋ค.
2. () => {}๋ฅผ source์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
- ํจ์ ๋ด๋ถ์์ ์ฐธ์กฐ๋ ๋ฐ์ํ ๊ฐ๋ค์(()=>{}์์ ์ค์ ๋ ๊ฐ๋ค)์ ์๋์ผ๋ก ์ถ์ ํ๋ค.
- ์ด ๋ณ์๋ค์ ๊ฐ์งํด์ ์ฝ๋ฐฑ(callback)์ ์คํํ๋ ๊ฒ์ ๊ฐ๋ค.
- ํน์ ์กฐ๊ฑด์ด๋ค ๊ณ์ฐ๋ ๊ฐ, ์ฌ๋ฌ ๋ฐ์ํ ๋ณ์์ ์กฐํฉ์ ๊ฐ์ํ๋ค. ๋ฐ๋ผ์ ๋จ์ผ๋ณ์ ๋ฟ ๋ง ์๋๋ผ ๋ณต์กํ ๊ณ์ฐ์(computed)๋ ์กฐ๊ฑด๋ ์ถ์ ํ ์ ์๋ค.
- ๋ณต์กํ ์กฐ๊ฑด, ๊ณ์ฐ์(computed)๊ฐ ์์ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋๋ค.
[์ถ์ฒ]
'Frontend๐จ > Vue3.js๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| toValue()์ toRaw() (feat. MaybeRefOrGetter<T>, Proxy) (0) | 2025.10.02 |
|---|---|
| [Vue] Vue-Query ์ด์ ๋ฆฌ (0) | 2025.01.05 |