반응형
참고
다음과 같이 마우스가 5초 이상 움직이지 않는 경우, 새로고침을 하도록 해보자.
또한 페이지 내에서 마우스가 움직이는 것이 아니라면 여전히 타이머는 증가한다.
구현
타이머를 표시할 변수를 useState로 선언한다.
const [seconds, setSeconds] = useState(0);
최초 렌더링시 useEffect에서 mousemove 이벤트를 등록한다.
5초 이상 시간이 지나는 경우 window.location.reload()로 새로고침을 실행하였다.
useEffect(() => {
let timer;
const handleMouseMove = () => {
setSeconds(0);
};
document.addEventListener("mousemove", handleMouseMove);
const incrementTimer = () => {
setSeconds((prevSeconds) => {
if (prevSeconds + 1 >= 5) window.location.reload();
return prevSeconds + 1;
});
};
timer = setInterval(incrementTimer, 1000);
...
}, []);
마지막으로 clean-up 함수에서 interval를 제거하고, 이벤트를 해제한다.
return () => {
clearInterval(timer);
document.removeEventListener("mousemove", handleMouseMove);
};
전체 코드는 다음과 같다.
import React, { useState, useEffect } from "react";
const RefreshTimer = () => {
const [seconds, setSeconds] = useState(0);
useEffect(() => {
let timer;
const handleMouseMove = () => {
setSeconds(0);
};
document.addEventListener("mousemove", handleMouseMove);
const incrementTimer = () => {
setSeconds((prevSeconds) => {
console.log(prevSeconds);
if (prevSeconds + 1 >= 5) window.location.reload();
return prevSeconds + 1;
});
};
timer = setInterval(incrementTimer, 1000);
return () => {
clearInterval(timer);
document.removeEventListener("mousemove", handleMouseMove);
};
}, []);
return (
<div>
<h1>타이머: {seconds}초</h1>
</div>
);
}
export default RefreshTimer;
반응형
'개발 > React' 카테고리의 다른 글
리액트 - Netlify로 리액트 프로젝트 배포하기 (0) | 2024.04.25 |
---|---|
리액트 - 페이지 가시성 확인하기 (useEffect with Visibility Change Event) (0) | 2024.04.24 |
리액트 Custom Hook - 모든 페이지의 로컬 스토리지 변경 감지하기 (useLocalStorage) (0) | 2024.04.15 |
리액트 Custom Hook - input 입력 유효값 검사하기 (useInput) (0) | 2024.04.15 |
리액트 Custom Hook - useRef로 useState 이전 값 저장하기 (usePrevious) (0) | 2024.04.15 |
댓글