@change
와 watch
는 Vue에서 각각 사용자 입력 감지와 데이터 변화 감지를 담당하는 역할입니다.예시 코드
<template>
<div class="search-box">
<!-- type="search" 는 text 대신 시멘틱 의미 부여 -->
<input
type="search"
@change="
$emit('searchMovie', $event.target.value);
inputText = $event.target.value;
$event.target.value = '';
"
placeholder="검색어 입력"
>
<button>검색</button>
</div>
<p>{{ inputText }}</p>
</template>
<script>
export default {
name: "SearchBarComponent",
props: {
data: Array,
},
data() {
return {
inputText: '',
}
},
watch: { // 반응형 감시
inputText(name) {
// 입력한 영화제목이 데이터에 있는지 확인
const findName = this.data.filter(movie => {
return movie.title.includes(name);
})
if(findName.length == 0) {
alert('해당하는 자료가 없습니다.')
}
}
},
}
</script>
✅ 1. @change
<input
type="search"
@change="..."
>
✔ 의미
@change
는 DOM 이벤트 리스너로, input 요소에서 값이 변경되고 포커스를 잃을 때 발생합니다.
- 즉, 텍스트를 입력하고 나서
Enter
를 누르거나, 다른 곳을 클릭(검색 버튼)해서 포커스를 벗어나야 이벤트가 발생합니다.
✔ 현재 코드에서의 역할
@change="
$emit('searchMovie', $event.target.value);
inputText = $event.target.value;
$event.target.value = '';
"
- 사용자가 검색창에 입력하고 포커스를 벗어나면
searchMovie
라는 이벤트를 발생시켜 부모 컴포넌트로 검색어를 보냄 ($emit
)
inputText
라는 내부 데이터에 검색어 저장
- input 창을 비움 (
$event.target.value = ''
)
✅ 2. watch: { inputText() {} }
watch: {
inputText(name) {
const findName = this.data.filter(movie => {
return movie.title.includes(name);
});
if (findName.length == 0) {
alert('해당하는 자료가 없습니다.');
}
}
}
✔ 의미
watch
는 Vue의 반응형 감시 기능입니다.
inputText
가 변경될 때마다 자동으로 실행되는 감시자 함수입니다.
✔ 현재 코드에서의 역할
inputText
가 변경되면
this.data
에서 제목에 해당 문자가 포함된 영화들을 찾아냄
- 아무것도 없으면 경고창(
alert
) 표시
✔ 즉, inputText
는 @change
이벤트를 통해 값이 바뀌고, 그걸 watch
가 감지합니다.
✅ 흐름 정리
사용자 입력
↓
@change 발생 → $emit('searchMovie', 입력값) + inputText = 입력값
↓
watch: inputText() 실행됨 → 해당 영화가 있는지 체크
✅ 참고: @change 대신 @input도 가능
@input
은 입력할 때마다 즉시 실행됨
@change
는 입력 후 포커스 벗어날 때 실행됨
<input @input="inputText = $event.target.value">
✅ 요약
항목 | 설명 |
@change | input 값이 변경되고 포커스를 잃을 때 발생 |
$emit() | 부모 컴포넌트로 이벤트를 보냄 |
watch | inputText 의 값이 바뀔 때마다 반응 |
현재 역할 | 검색어 입력 후 일치 여부 확인 + 부모에게 검색 이벤트 전달 |
Share article