debounce 및 throttle은 함수 호출을 제한하여
이벤트 핸들러 호출 빈도를 줄일 수 있는 두 가지 기술입니다.
이 두 가지를 잘 활용하면 애플리케이션의 성능을 크게 향상시킬 수 있습니다.
Vue 애플리케이션에서 watcher와 이벤트 핸들러를 debounce, throttle 하는 방법을 배워봅시다.
Debounce 함수 만들기
다음은 debounce 함수의 코드 스니펫입니다.
export function debounce(fn, wait){
let timer;
return function(...args){
if(timer) {
clearTimeout(timer); // clear any pre-existing timer
}
const context = this; // get the current context
timer = setTimeout(()=>{
fn.apply(context, args); // call the function if time expires
}, wait);
}
}
debounce 함수는 디바운스할 함수와 대기 시간(밀리초)의 두 가지 인수를 사용합니다.
해당 함수는 나중에 호출할 수 있는 함수를 반환합니다.
const debouncedFunction = debounce(function() { ... }, 300);
console.log(typeof debouncedFunction); // `function`
// When the debounce function is triggered:
위의 코드는 기존 제한 시간을 취소하고 인수로 전달받은 대기 시간에 따라 새 대기 시간을 설정합니다.
대기 시간이 만료되면 인수를 사용하여 콜백 함수를 호출합니다.
Throttle 함수 만들기
debounce는 사용자가 특정 시간 동안 이벤트를 수행하지 않았을 때 함수를 호출하는 반면,
throttle은 사용자가 이벤트를 수행하는 동안 설정된 시간 간격으로 함수를 호출합니다.
export function throttle(fn, wait){
let throttled = false;
return function(...args){
if(!throttled){
fn.apply(this,args);
throttled = true;
setTimeout(()=>{
throttled = false;
}, wait);
}
}
}
throttle 함수가 트리거되면 throttled 변수가 false로 설정되며
제공된 함수가 인수와 함께 호출됩니다.
Watcher 디바운스하기
사용자가 텍스트 상자에 값을 입력할 때 Fetch API를 호출하고 값을 기록하는 간단한 컴포넌트를 만들어 보겠습니다.
<template>
<div id="app">
<input v-model="value" type="text" />
<p>{{ value }}</p>
</div>
</template>
<script>
export default {
data() {
return {
value: "",
};
},
watch: {
value(newValue, oldValue) {
console.log("value changed: ", newValue, oldValue);
// call fetch API to get results
}
}
};
</script>
<template>
<div id="app">
<input v-model="value" type="text" />
<p>{{ value }}</p>
</div>
</template>
<script>
import {debounce} from "./Utils.js";
export default {
data() {
return {
value: "",
};
},
created(){
this.debouncedFetch = debounce((newValue, oldValue)=>{
console.log("value changed: ", newValue, oldValue);
// call fetch API to get results
}, 1000);
},
watch: {
value(...args) {
this.debouncedFetch(...args);
}
}
};
</script>
주 : 검색 목록 갱신은 watch를 이용해 목록 갱신을 디바운스
이벤트 핸들러 디바운스하기
watch와 이벤트 핸들러의 디바운싱은 유사합니다.
사용자가 텍스트 상자에 값을 입력하는 동일한 예를 고려해 보겠습니다.
입력 후 콘솔에 로깅하고 Fetch API를 호출합니다.
<template>
<input @input="onChangeDebounced" type="text" />
</template>
<script>
import {debounce} from './Utils.js';
export default {
created() {
this.onChangeDebounced = debounce(event => {
console.log('changed value:', event.target.value);
// call fetch API to get results
}, 1000);
},
};
</script>
참고
https://blog.logrocket.com/debounce-throttle-vue/
시간나면 위 예제를 TS + setup API로 변경할 예정
'FrontEnd' 카테고리의 다른 글
ECMAScript(ESM)의 module resolution(모듈 해석)에 대해 알아보자 (0) | 2023.01.16 |
---|---|
Node.JS 앱은 어떻게 종료되는가? (0) | 2023.01.15 |
npm link를 이용하여 서드파티 npm 패키지 커스터마이징 (0) | 2023.01.12 |
[번역] Commander.js와 Typescript를 이용하여 CLI 만들기 (0) | 2023.01.12 |
[프론트엔드 아키텍처] 모노레포 1분만에 이해하기 + 터보레포 (0) | 2023.01.11 |