watch
반응형 상태를 감시하는 감시자로서 반응형 상태가 변경될때마다 콜백을 트리거한다.
사용시점
- 상태변경에 반응하여 “부수 효과”를 수행해야 하는 경우
- 예를 들어 DOM을 변경하거나 비동기 작업 결과에 따라 다른 상태를 변경하는 경우가
주의사항
const obj = reactive({ count: 0 }) // 이것은 작동하지 않습니다. watch()에 숫자를 전달하고 있기 때문입니다. watch(obj.count, (count) => { console.log(`Count는: ${count}입니다`) })
해당 watch는 동작하지 않아요.
왜냐하면 숫자를전달하고 있기 때문입니다. 그러기 위해서는 getter 함수를 사용하세요
// 대신, getter를 사용하십시오: watch( () => obj.count, (count) => { console.log(`Count는: ${count}입니다`) } )
깊은 감시자
watch() 를 사용하면 암묵적으로 깊은 감시자입니다.
3번쨰 인자에 {deep: true}를 선언하여 깊은 감시자로 만들 수 있습니다.
주의사항
- 객체의 모든 중첩된 속성을 순회하므로 대규모 데이터 구조에서 사용할 경우 비용이 많아질 수 있어요
- 필요할 때만 사용하고 성능에 미치는 영향에 주의하셔야 합니다.
Eager 감시자
watch() 는 기본적으로 Lazy Mode 에요
감지된 소스가 변경될 때까지 콜백이 호출되지 않아요
그러나 경우에 따라 즉시 실행할 필요가 있을 수 있어요
예를 들어, 초기 데이터 가져오고 관련 상태가 변경될 떄 대마다 데이터를 다시 가져오고 싶을 떄가 그래요
immediate: true
옵션을 전달하여 감시자의 콜백을 즉시 실행하도록 강제할 수 있어요watch( source, (newValue, oldValue) => { // 즉시 실행된 후, `source`가 변경될 때 다시 실행됩니다. }, { immediate: true } )
Once
소스가 변경될 떄 한번만 트리거 되길 원한다면
once: true
옵셥을 활성화 하세요.watch( source, (newValue, oldValue) => { // `source`가 변경될 때 한 번만 트리거됩니다. }, { once: true } )
watchEffect
반응형 상태에 종속적인 상태까지 자동으로 추적할 수 있게 해줍니다.
주의사항
watchEffect는 동기적 실행 동안에만 종속성을 추적합니다.,
비동기 콜백과 함께 사용할 때는 await 전에 접근한 속성만 추척되요
watch와의 비교
모두 반응형 상태를 감시하여 부수효과를 수행할 수 있다는 점이 공통점입니다.
이둘은 반응형 종속성 추적 방식의 차이가 있습니다.
watch : 콜백 내부에 접근한 것은 추적하지 않음
- 종송성 추적을 부수효과와 완전 분리하여 콜백 실행시기를 더 정확하게 제어가 가능
watchEffect : 종송적 추적과 부쇼효과를 하나의 단계로 취급
- 종속성 추적과 함께 관리되어 더 간결한 코드 , 가독성있는 코드를 작성하는데 이점이 있음.
콜백 플러시 타이밍
vue 컴포넌트 업데이트와 사용자가 생성한 감시자 콜백 모두 트리거 할 수 있어요
실행흐름 이해
감시자 콜백은 부모 컴포넌트 업데이트 후, 소유자 컴포넌트의 DOM 업데이트 전에 호출됩니다.
이는 감시자 콜백 내부에서 소유자 컴포넌트의 DOM에 접근하려 할떄, dom 업데이트 전 상태일 것을 의미해요
후처리 감시자
- Vue가 DOM을 업데이트한 후 소유자 컴포넌트의 DOM에 접근
// option 활성화 watch(source, callback, { flush: 'post' }) watchEffect(callback, { flush: 'post' }) // post용 메소드 제공 import { watchPostEffect } from 'vue' watchPostEffect(() => { /* Vue 업데이트 후 실행됨 */ })
동기 감시자
- 업데이트 이전에 동기적으로 실행되는 감시자
watch(source, callback, { flush: 'sync' }) watchEffect(callback, { flush: 'sync' }) import { watchSyncEffect } from 'vue' watchSyncEffect(() => { /* 반응형 데이터 변경 시 동기적으로 실행됨 */ })
동기 감시자 주의사항
- 반응형 변이가 감지될 때 마다 트리거 되므로 배열과 같이 동기적으로 여러번 변경될 수 있는 데이터 소스에 사용을 지양해주세요!
감시자 중지
감시자 사용 주의사항
비동기적으로 감시자를 선언하지 마세요!
생성되면 소유자 컴포넌트에 바인딩 되지 않으며 메모리 누수를 피하기 위해 수동으로 정지해야 합니다!
가능하면 동기적으로 선언하기를 매우 권장드려요!
비동기적으로 선언하지 말고 감시 로을 조건부로 만드세요!
// 비동기적으로 로드될 데이터 const data = ref(null) watchEffect(() => { if (data.value) { // 데이터가 로드될 때 무언가를 수행합니다. } })