TechScribe Notes

14_watch,watchEffect 본문

project/Vue.js

14_watch,watchEffect

yunmee0704 2024. 12. 10. 15:33

1. watch

반응형 상태 변경에 따라 api와 같은 작업을 수행할 때 watch로 특정작업 수행 가능함.

watch(/* Source Type */, (newValue, oldValue) => {});
const message = ref('Hello World');

// message 데이터 변경에 
watch(message, (newValue, oldValue) => {
  console.log('newValue: ', newValue);
  console.log('oldValue: ', oldValue);
	// 어떠한 작업을 수행하는 "감시자" 역할을 합니다.
});

 

watch 첫번째 매개 변수 : ref, reactive,computed, getter함수,array 등 다양한 타입 가능.

const x = ref(0)
const y = ref(0)

// single ref
watch(x, (newX) => {
  console.log(`x is ${newX}`)
})

// getter
watch(
  () => x.value + y.value,
  (sum) => {
    console.log(`sum of x + y is: ${sum}`)
  }
)

// array of multiple sources
watch([x, () => y.value], ([newX, newY]) => {
  console.log(`x is ${newX} and y is ${newY}`)
})

 

반응형 객체의 속성 하나만 감시하고 싶을때는 getter 함수 사용.

const obj = reactive({ count: 0 });
watch(() => obj.count, (newValue) => {
  console.log('newValue: ', newValue);
});

 

 

2.deep option

: 반응형 객체를 watch 하면 deep watch가 생성됨. 속성 뿐 아니라 중첩된 모든 속성에도 트리거 됨

const person = reactive({
  name: '홍길동',
  age: 30,
  hobby: '운동',
  obj: {
    count: 0, // 중첩된 속성
  },
});

watch(person, (newValue) => {
  console.log('newValue: ', newValue);
});

 

getter function으로 객체를 넘기면 객체의 값이 변경될 때만 트리거 되며 중첩된 속성은 트리거 되지 않는다.

watch(
	() => person.obj,
	(newValue) => {
		// 객체의 값이 바뀔 경우에만 트리거 됩니다.
	}
);

 

deep option을 사용하면 강제로 deep watch가능, 그러나 큰 데이터 구조에서 비용이 많이 발생하므로 필요할 때만 사용함.

watch(
  () => person.obj,
  (newValue) => {
    console.log('newValue: ', newValue);
  },
  { deep: true }
);

 

 

3. immediate 즉시 실행

값이 변경될 때가 아니라 아예 최초에 즉시실행 가능함.

const message = ref('Hello World!');
const reverseMessage = ref('');

watch(
  message,
  (newValue) => {
    reverseMessage.value = newValue.split('').reverse().join('');
  },
  {
    immediate: true,
  }
);

 

함수를 외부에 선언하여 즉시실행 가능( watchEffect로 더 단순화 할 수 있다.)

const message = ref('Hello World!');
const reverseMessage = ref('');

const reverseFn = () => {
  reverseMessage.value = message.value.split('').reverse().join('');
};

watch(message, reverseFn);
// 즉시실행
reverseFn();

 

 

4. compute와 watch

값을 변경시키는 결과는 비슷하지만 

-compute

:vue 인스턴트 상태(ref,reactive 변수)의 종속관계를 자동으로 세팅할 때 좋다.

const reverseMessage = computed(() =>
  message.value.split('').reverse().join('')
);
// reverseMessage 는 message의 값에 따라 결정되어짐 -> 이런것을 watch로 구현하면 복잡하거나 중복계산,오류발생

 

-watch 

:Vue 인스턴트 상태의 변경 시점에 특정한 동작을 수행할 때 적합함(api 불러오기, push route 등등)

watch(
  message,
  (newValue) => {
    reverseMessage.value = newValue.split('').reverse().join('');
  }
);//message가 변경되면, reverseMessage와 newValue 변경

 

 

5.watchEffect 

:콜백 함수 안의 반응성 데이터에 변화가 감지되면 자동으로 실행. 컴포넌트가 생성될 때 즉시 실행됨

watchEffect(async () => {
  const { data } =
							await axios.get(`https://reqres.in/api/users?page=${page.value}`);
  items.value = data.data;
});

 

-watch와 watchEffect

둘 다 특정한 동작을 반응적으로 수행할게 해주지만 

watch는 명시적으로 관찰된 소스만추적하며 콜백내 엑세스한 항목은 추적되지 않는다. 또 콜백소스가 실제로 변경된 경우에만 트리거.

watch종속성 추적을 부작용과 분리하여 콜백이 실행되어야 하는 시기를 좀 더 정확하게 제어가능함.

watchEffect는 동기 실행 중에 액세스 되는 모든 반응속성을 추적하여 더 편리하고 간결한 코드로 작성 가능하나 반응성 종속성을 덜 명시적으로 만든다

'project > Vue.js' 카테고리의 다른 글

16_Single-File Component (SFC)  (0) 2024.12.12
15_컴포넌트 기초  (0) 2024.12.12
13_양방향 바인딩 (v-model)  (1) 2024.12.04
12_이벤트처리  (0) 2024.12.03
11_디렉티브  (1) 2024.12.03