강의를 보지않고 혼자서 hooks로 전환했을 때는 버그가 있었다. setTimeout이 제대로 취소되지 않았고, startTime이 제대로 설정되지 않아서 평균 반응속도가 이상하게 나오는 현상이 발생했다.
강의를 보고 이유를 알아보니 React Hooks에서 값이 바뀌는 부분은 그냥 사용하면 안되고 useRef를 사용해야한다는 것을 새롭게 알게 되었다.
useRef vs useState
useRef와 useState의 차이 : 렌더링의 차이가 있다.
useRef는 값이 바뀌어도 렌더링이 안되지만 useState는 값이 바뀌면 리렌더링이 발생한다.
useRef 사용처 2가지
1. useRef는 DOM을 넣는거 말고 다른 방식으로 사용되는게 값이 바뀌기는 하지만 화면에 영향을 끼치고 싶지는 않을 때 사용한다.
2. DOM을 넣어두고 DOM을 직접 제어하고 싶을 때 사용
※ useRef는 current써주는것에 주의해야한다.
import React, {useRef, useState} from "react";
import response from "./Response";
const ResponseHooks = () => {
const [state,setState] = useState('waiting');
const [message, setMessage] = useState('클릭해서 시작하세요.');
const [result, setResult] = useState([]);
const timer = useRef(null);
const startTime = useRef(0);
const onClickScreen = () => {
if(state === 'waiting'){
setState('ready');
setMessage('색이 바뀌면 클릭해주세요');
const max = 2000; //2초
const min = 500 // 0.5초
const randTime = Math.floor(Math.random() * (max - min + 1)) + min;
timer.current = setTimeout(()=>{
startTime.current = new Date().getTime();
setState('now');
setMessage('클릭해주세요!!');
},randTime);
}else if(state === 'ready'){
alert('너무 성급합니다. 다시 시작하겠습니다.');
setState('waiting');
setMessage('클릭해서 시작하세요.');
clearTimeout(timer.current);
}else if(state === 'now'){
clearTimeout(timer.current);
const endTime = new Date().getTime();
const responseTime = endTime - startTime.current;
setMessage('클릭해서 시작하세요.');
setState('waiting');
setResult((prev) => {
return [...prev, responseTime];
});
}
}
const onResetClick = () => {
setResult([]);
}
const renderAverage = () => {
return result.length === 0 ?
null:
<>
<div>평균 시간{result.reduce((a,c)=>a+c) / result.length }ms</div>
<button onClick={onResetClick}>리셋</button>
</>
}
return(
<>
<div
id="screen"
className={state}
onClick={onClickScreen}
>
{message}
</div>
{renderAverage()}
</>
)
}
export default ResponseHooks;
hooks로 변환된 ResponseHooks.jsx 전체코드
'코딩이야기 > 인터넷 강의' 카테고리의 다른 글
section4. 5-2 setInterval과 라이프사이클 연동하기 (0) | 2024.05.29 |
---|---|
section4. 5-1 리액트 라이프사이클 소개 (0) | 2024.05.28 |
section4. 4-2. setTimeout넣어 반응속도체크 (0) | 2024.05.27 |
section4. 4-1 React 조건문 (0) | 2024.05.27 |
section2. 3-12. React.createRef (0) | 2024.05.23 |