728x90
반응형
watch는 단순히 데이터 변경에 반응하기 보다 일반적인 방법을 제공한다.
watch는 변경이 일어났을 때 특정행위를 할 수 있도록 해준다.
언제 사용하는지?
- 속성이 변경됨을 감시하고 퍼포먼스를 구현하려고 할 때
- API통신 responce에 대해 사용 (데이터를 바로바로 감시)
watch(newValue, oldValue){}
- 첫번째 인자: 바뀐 값
- 두 번째 인자: 바뀌기 전 값
<template>
<h2>Volume Tracker (0-20)</h2>
<h3>Current Volume - {{ volume }}</h3>
<div>
<button @click="volume += 2">Increase</button>
<button @click="volume -= 2">Decrease</button>
</div>
</template>
<script>
export default {
data() {
return {
volume: 0,
};
},
computed: {},
methods: {},
watch: {
volume(newValue, oldValue) {
if (newValue > oldValue && newValue === 16) {
alert("볼륨이 16이상입니다.");
}
// 볼륨이 increase일때만 얼럿이 활성화 되도록
},
},
};
</script>
data가 object형태 일 때
1. 기존 volume 함수를 객체형태로 바꿈
2. handle함수 생성
3. deep: true
<template>
<h2>Volume Tracker (0-20)</h2>
<h3>Current Volume - {{ volume }}</h3>
<div>
<button @click="volume.num1 += 100">Increase</button>
<button @click="volume.num1 -= 50">Decrease</button>
</div>
</template>
<script>
export default {
data() {
return {
volume: {
num1: 10,
num2: 20,
num3: 30,
},
};
},
computed: {},
methods: {},
watch: {
volume: {
handler(newValue, oldValue) {
console.log("newValue: ", newValue);
console.log("oldValue: ", oldValue);
},
deep: true,
},
},
};
</script>
data가 배열일 때 watch 사용법
참조를 반환하려면 마찬가지로 deep: true로 설정해준다.
<template>
<h2>{{ heros }}</h2>
<button @click="heros.push('antman')">add hero</button>
</template>
<script>
export default {
data() {
return {
heros: ["batman", "superman"],
};
},
watch: {
heros: {
handler(newValue) {
console.log(`update list ${newValue}`);
},
deep: true,
},
},
};
</script>
하지만 새 참조를 반환하는 경우 deep속성이 필요없다.
<template>
<button @click="heros = heros.concat(['antman'])">add hero</button>
</template>
<script>
export default {
data() {
return {
heros: ["batman", "superman"],
};
},
watch: {
heros: {
handler(newValue) {
console.log(`update list ${newValue}`);
},
},
},
};
</script>
렌더링 후 즉시 watch 시키기
watch는 기본적으로 데이터의 값이 들어있는 상태에서는 발동하지 않는다.
값이 들어오거나 변경되었을 때 watch를 발동시키는데, 만일 최초 렌더링 시에도 watch를 이용하고 싶을 때는
immediate를 true로 설정한다.
<template>
<h2>{{ name }}</h2>
<input type="text" v-model="name" />
</template>
<script>
export default {
data() {
return {
name: "망고",
};
},
computed: {},
methods: {},
watch: {
name: {
handler(newValue, oldValue) {
console.log("newValue: ", newValue);
},
immediate: true,
},
},
};
</script>
렌더링 후 바로 '망고'가 콘솔에 찍히는것을 확인할 수 있다.
728x90
'Framework > vue_Foundation' 카테고리의 다른 글
vue router 이동 (0) | 2024.08.03 |
---|---|
options API vs Composition API (vue.js) (0) | 2023.01.08 |
computed properties (vue.js) (0) | 2023.01.05 |
v-model / form handling (vue.js) (0) | 2023.01.05 |
Event handling(vue) (0) | 2023.01.05 |
댓글