리액트로 프론트를 시작했다보니 두 프레임워크의 차이점을 발견하고나면 꽤나 신기하다.
Vue.js watch
는 리액트에는 없는 개념이다.
데이터 변화에 대응하는 도구로 React의 useEffect와 개념적으론 비교할 수 있지만, 사용 방식이 상당히 다르다!
1. 개념
해당 데이터가 변경될 때 특정 작업을 수행할 수 있도록 해주는 강력한 도구다.
- Vue 컴포넌트 내에서 반응형 데이터(
data
,props
또는computed
속성에 있는 데이터)를 감시(watch) - 데이터 변화를 감지해 API 호출, 컴포넌트 업데이트, 복잡한 계산 등 로직을 쉽게 처리
- 복잡한 컴포넌트의 상태 관리
computed
나 methods
와 적절히 조합하여 사용하면 딱 좋당
2. watch
의 기본 사용법
watch
는 컴포넌트의 watch
옵션 안에 선언된다.
감시하려는 데이터와 그 데이터가 변경될 때 호출될 콜백 함수를 정의한다.
export default {
data() {
return {
count: 0 // count 데이터가 변경될 때마다 watch에 정의된 콜백 함수가 실행된다.
};
},
watch: {
count(newVal, oldVal) { // 콜백 함수의 첫 번째 인자는 새 값(`newVal`), 두 번째 인자는 이전 값(`oldVal`)을 받게된다.
console.log(`count 값이 ${oldVal}에서 ${newVal}로 변경되었습니다.`);
}
}
};
3. 즉시 실행(immediate
)
기본적으로 watch
는 감시하는 데이터가 처음 변경될 때만 실행된다.
처음 설정될 때도 콜백을 실행하고 싶다면immediate
옵션을 사용하면 된다.
export default {
data() {
return {
count: 0
};
},
watch: {
count: {
handler(newVal, oldVal) {
console.log(`count 값이 ${oldVal}에서 ${newVal}로 변경되었습니다.`);
},
immediate: true
}
}
};
컴포넌트가 생성될 때 count
의 초기 값에 대해 watch
가 한 번 실행됩니다.
4. 깊이 감시(deep
)
기본적으로 watch
는 객체나 배열의 최상위 속성만 감시한다!
객체 내부의 속성이나 배열의 요소 변화를 감시하고 싶을떈 deep
옵션을 사용해야 한다.
export default {
data() {
return {
user: {
name: 'John',
age: 30
}
};
},
watch: { // user 객체 내부의 속성(name 또는 age)이 변경될 때마다 watch 콜백이 실행된다.
user: {
handler(newVal, oldVal) {
console.log('user 객체가 변경되었습니다:', newVal);
},
deep: true
}
}
};
5. 감시 대상이 여러 개인 경우
watch
를 사용하여 여러 데이터를 감시할 수도 있습니다.
export default {
data() {
return {
firstName: 'John',
lastName: 'Doe',
fullName: ''
};
},
watch: {
firstName(val) {
this.fullName = `${val} ${this.lastName}`;
},
lastName(val) {
this.fullName = `${this.firstName} ${val}`;
}
} // firstName과 lastName을 감시하여 전체 이름을 업데이트할 수 있다.
};
여기서 firstName
이나 lastName
중 하나라도 변경되면 fullName
이 업데이트되는 것이다.
6. 특정 함수를 감시하는 경우
컴포넌트의 상태에 따라 동적으로 변경되는 값을 감시해야 할 때, watch
에서 특정 함수를 지정하여 그 결과 값을 감시할 수 있다.
export default {
data() {
return {
a: 1,
b: 2
};
},
computed: {
sum() {
return this.a + this.b;
}
},
watch: {
sum(newVal) {
console.log(`합계가 ${newVal}로 변경되었습니다.`);
}
}
};
이 예제에서 a
나 b
가 변경되면 sum
의 결과가 변경되고, 이에 따라 watch
콜백이 실행된다.
7. 비동기 작업 처리할 때 사용하는 방법
예를 들어, 사용자가 검색어를 입력할 때마다 API를 호출하고 싶은 경우에도 사용할 수 있다.
export default {
data() {
return {
query: '',
results: []
};
},
watch: {
query: {
handler: _.debounce(function (newQuery) {
this.search(newQuery);
}, 500),
immediate: true
}
},
methods: {
async search(query) {
const response = await fetch(`/search?q=${query}`);
this.results = await response.json();
}
}
};
query
가 변경될 때마다 search
메서드를 호출하여 검색 결과를 가져온다.
내 사랑_.debounce
를 사용해 사용자가 입력을 멈춘 후 500ms 후에 검색을 시작하도록 하여 API 호출 횟수를 줄였다.
8. watch
의 주의 사항
- 부적절한 사용: 모든 상태 변화를
watch
로 처리하면 코드가 완전 복잡해진다. 간단한 연산은computed
속성을 사용하는 것이 낫다. - 성능:
deep
옵션을 남용하면 성능이 저하된다.
'Front-end > Vue' 카테고리의 다른 글
🚀 Vue의 Lazy Loading: 성능 최적화 비법 대공개! 🔄 (0) | 2025.02.19 |
---|