Vue watch의 세번째 인자 "flush"
2022년 12월 28일
최근 vue3에서 watch를 사용하면서 겪은 시행착오를 적어본다.
결론부터 말하자면
watch의 세 번째 인자인 flush로 callback의 발생 타이밍을 조절할 수 있다.
아래는 내가 겪은 상황이다.
- api로 데이터를 받아와서 pinia(빈 배열)에 넣었음.
- watch로 pinia의 데이터를 감지하고 DOM을 업데이트하려고 했음.
(A라는 돔 안에 v-for를 돌려서 B를 채워넣고, 첫 번째 B를 자동 선택하는 기능을 watch 함수의 callback으로 넣었음.) - B가 채워지긴 했는데 자동 선택하는 기능이 실행되지 않았음.
- 타이밍 문제인 거 같아서 setTimeout 안에 넣어보니 실행됨.
- 근데 아무리 봐도 setTimeout으로 해결하는 건 별로 좋지 않은 선택이라고 생각함.
- Vue Watch Guide를 보니 callback의 발생 타이밍을 조절 가능한 옵션이 있었음.
- flush: ‘post’ 옵션을 주어 해결함. => callback이 DOM 업데이트 이후에 실행됨.
watch(source, callback, { ..., flush: 'post', });
기존 watch의 세 번째 인자에서 많이 쓰는
immediate(watch 즉시 콜백), deep(깊은 변경감시 === 배열, 객체 내부 변경 감시) 말고 flush라는 옵션은 처음 봤다.
flush는 ‘pre’, ‘post’, ‘sync’가 있는데, 각각의 옵션에 대한 설명은 아래와 같다.
- ‘pre’ = 기본값이다. callback이 DOM 업데이트 이전에 실행됨.
- ‘post’ = callback이 DOM 업데이트 이후에 실행됨.
- ‘sync’ = callback이 DOM 업데이트와 동시에 실행됨.
이 옵션을 몰라서 시간을 낭비했다. 다시금 내가 쓰려는 도구의 문서를 잘 살펴봐야겠다는 다짐을 한다.