์ ๋ฐ์ดํธ ํจ์ setState๋ฅผ ํ์ฉํ์ฌ ๊ตฌํ
import { useEffect, useState } from "react";
import "./App.css";
function App() {
const [count, setCount] = useState(0);
useEffect(() => {
const timer = setInterval(() => {
setCount((prev) => prev + 1);
}, 1000);
return () => {
clearInterval(timer);
};
}, []);
return (
<div className="App">
<h1>{count}</h1>
</div>
);
}
export default App;
์ ์์ค๋ 1์ด๋ง๋ค ์นด์ดํธ๋ฅผ 1 ์ฉ ์ฌ๋ ค์ฃผ๋ ์ฝ๋์ ๋๋ค.
- useEffect ๋ ๋ฒ์งธ ์ธ์์ ๋น ๋ฐฐ์ด์ ๋ฃ์ด componenetDidMount์ ๊ฐ์ด timer ํจ์๋ฅผ ํ ๋ฒ๋ง ์ธํ ํฉ๋๋ค.
- setInnerval๋ก timer๋ฅผ ์ธํ ํ๊ณ ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ผ์ง ๋ clearInterval๋ก timer๋ฅผ ์ ๋ฆฌํฉ๋๋ค.
- useEffect ๋ ๋ฒ์งธ ์ธ์์ ๋น ๋ฐฐ์ด์ ๋ฃ์ ๊ฒฝ์ฐ ๋ ๋๋ง ํ ํ ๋ฒ๋ง ์คํ๋๊ธฐ ๋๋ฌธ์
setState์ ์ ๋ฐ์ดํธ ํจ์(setCount(prev => prev + 1))๋ฅผ ํ์ฉํ์ฌ ๊ตฌํํฉ๋๋ค.- ์ ๋ฐ์ดํธ ํจ์ setCount(prev => prev + 1) ์ฌ์ฉํ ๊ฒฝ์ฐ prev๋ ํญ์ ์ต์ ์ํ ๊ฐ์ ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋ณด์ฅํ ์ ์์ต๋๋ค.
- setState(count + 1)์ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ด๊ธฐ count ๊ฐ๋ง์ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ count๊ฐ 1์์ ๋ฉ์ถฐ ๋ฒ๋ฆฝ๋๋ค.
๋ฌธ์ ์
์
๋ฐ์ดํธ ํจ์์ธ setState๋ฅผ ์ฌ์ฉํด์ ์ํ ๋ณ๊ฒฝ์์๋ count ์
๋ฐ์ดํธ๋ฅผ ํ ์ ์์ง๋ง props๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋
ํ์ด๋จธ ํจ์๊ฐ ์คํ๋์ง ์์ต๋๋ค. useEffect ๋ ๋ฒ์งธ ์ธ์์ ๋น ๋ฐฐ์ด์ ๋ฃ์ด timerํจ์๋ฅผ ํ ๋ฒ๋ง ์ธํ
ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
useRef๋ฅผ ํ์ฉํ ํ์ด๋จธ ๊ตฌํ
import { useEffect, useRef, useState } from "react";
import "./App.css";
function App() {
const timerRef = useRef();
const [count, setCount] = useState(0);
const handleCount = () => {
setCount(count + 1);
};
const handleRestart = () => {
if (!timerRef.current) {
timerRef.current = setInterval(handleCount, 1000);
}
};
const handleStop = () => {
if (timerRef.current) {
clearInterval(timerRef.current);
timerRef.current = null;
}
};
useEffect(() => {
timerRef.current = setInterval(handleCount, 1000);
return () => {
clearInterval(timerRef.current);
};
});
return (
<div className="App">
<h1>{count}</h1>
<button onClick={handleRestart}>restart</button>
<button onClick={handleStop}>stop</button>
</div>
);
}
export default App;
timerRef.current์ timer๋ฅผ ์ ์ฅํ์ฌ ํ์ด๋จธ๋ฅผ ์ ์งํ๋ stop๋ฒํผ๊ณผ ๋ค์ ์์ํ๋ restart ๋ฒํผ์ ์ถ๊ฐํ์ฌ ๊ตฌํํ์์ต๋๋ค.
- useRef๋ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ๊ณ useRef์ timerRef ๊ฐ์ฒด๋ ์ปดํฌ๋ํธ์ ์ ์์ ์ฃผ๊ธฐ ๋์ ์ ์ง๋์ด
useRef๋ก ๊ด๋ฆฌํ๋ ๊ฐ์ state ๊ฐ์ด ๋ณ๊ฒฝ๋์ด๋ ref์ ๊ฐ์ ์ ์งํฉ๋๋ค. - count ์ํ ๋ณ๊ฒฝ๋ง์ ๋ฆฌ๋ ๋๋ง์ ๋ํ๋ด๊ณ restart ๋ฒํผ or stop ๋ฒํผ์ ํด๋ฆญํด๋ ๋ฆฌ๋ ๋๋ง์ด ์ผ์ด๋์ง ์์ต๋๋ค.
'Frontend' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐ๋ฒจ(Babel) ์ค์ ํ๊ธฐ (0) | 2022.10.31 |
---|---|
React-Query (1) | 2022.10.11 |
CRA(Create React App) ์นํฉ ์ค์ ํ๊ธฐ (2) | 2022.09.20 |
React 18 ๋ฒ์ ์ ๋ฐ์ดํธ ์ ๋ฆฌ (0) | 2022.07.27 |
TDD (ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ) (0) | 2022.06.23 |