화면 크기에 따라 컴포넌트를 다르게 렌더링하고 싶을 때,
화면 크기에 따라서 다른 텍스트를 보여주는 버튼을 만들 때
const [windowSize, setWindowSize] = useState({
width: window.innerWidth,
height: window.innerHeight,
});
window : 현재 스크립트가 작동 중인 창
window.innerWidth : 브라우저 윈도우의 뷰포트 너비로, 수직 스크롤바가 존재한다면 포함
useEffect(() => {
window.addEventListener('resize', handleResize);
return () => {
window.removeEventListener('resize', handleResize);
};
}, []);
resize 이벤트는 document view의 크기가 변경될 때 발생
useEffect훅에서 함수를 반환하면 컴포넌트가 unmount될 때 clean-up 함수가 실행된다. useEffect에 빈 배열을 전달하면, 컴포넌트가 처음 mount될 때와 unmount될 때 실행되는데, 컴포넌트가 unmount될 때 이벤트 리스너를 삭제하지 않으면 컴포넌트가 자주 리렌더링될 경우 메모리 누수가 발생하므로 리스너를 삭제하도록 한다.
const handleResize = debounce(() => {
setWindowSize({
width: window.innerWidth,
height: window.innerHeight,
});
}, 1000);
Debounce : 동일 이벤트가 반복적으로 시행되는 경우 마지막 이벤트가 실행되고 나서 일정 시간 동안 해당 이벤트가 다시 실행되지 않으면 그때서야 해당 이벤트의 콜백 함수를 한번만 실행
return (
<StyledButton type="primary" ghost onClick={showModal}>
{windowSize.width > 768 ? '+ Add a Card' : '+ New'}
</StyledButton>
)