์ฐธ๊ณ ์ฌ์ดํธ
• React ๊ณต์ ๋ฌธ์ - useRef
๐ชฃ useRef
๋ ๋๋ง์ด ํ์ํ์ง ์์ ๊ฐ์ ์ฐธ์กฐํ ์ ์๋ React Hook์ด๋ค.
useRef๋ .current ํ๋กํผํฐ๋ก ์ ๋ฌ๋ ์ธ์(initialValue)๋ก ์ด๊ธฐํ๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ref ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
๋ฐํ๋ ๊ฐ์ฒด๋ ์ปดํฌ๋ํธ์ ์ ์์ ์ฃผ๊ธฐ๋ฅผ ํตํด ์ ์ง๋๋ค.
๐ฆ Parameter
• initialValue: ์ด๊ธฐ์ ์ ์ฅ๋๋ ๊ฐ์ ๋ฃ์ผ๋ฉฐ, ๋ชจ๋ ์ ํ์ ๊ฐ์ด(lite, DOM...)์ด ๋ ์ ์๋ค.
์ด ์ธ์๋ ์ด๊ธฐ ๋ ๋๋ง ํ์ ๋ฌด์๋๋ค.
๐ Return
useRef๋ ๋จ์ผ ์์ฑ์ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
{current: value}
• current: initialValue๊ฐ์ด ๋ค์ด๊ฐ ์์ผ๋ฉฐ null์ ์ฌ์ฉํด๋ ๋๋ค. ํฅํ ๋ค๋ฅธ ๊ฒ์ผ๋ก ์ค์ ํ ์ ์๋ค.
๋ ๋๋ง์ด ์งํ๋๋ฉด ๊ธฐ์กด useRef์ ์ ์ฅ๋ ๋์ผํ ๊ฐ์ฒด๊ฐ ๋ฐํ๋๋ค.
โ ๏ธ ์ฃผ์์ฌํญ
• ref.current ์์ฑ์ ์ฌ๋ ๋๋ง ์์ด ๋ณ๊ฒฝํ ์ ์๋ค. ๊ทธ๋ฌ๋ ๋ ๋๋ง์ ์ฌ์ฉ๋๋ ๊ฐ์ฒด(State์ ์ผ๋ถ)๋ฅผ ๋ณด์ ํ๋ ๊ฒฝ์ฐ ํด๋น ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์๋๋ค.
• ref.current๋ ์์ฑ์ ๋ณ๊ฒฝํ๋ฉด ์ฌ๋ ๋๋ง ๋์ง ์๋๋ค. ref๋ ์ผ๋ฐ JavaScript ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ React๋ ์ธ์ ๋ณ๊ฒฝ๋์ง ์ธ์ํ์ง ๋ชปํ๋ค.
• ์ด๊ธฐํ๋ฅผ ์ ์ธํ๊ณ ๋ ๋๋ง ์ค์๋ ์ฐ๊ฑฐ๋ ์ฝ์์ ๊ธ์งํ๋ค. ์ด๋ก ์ธํด ๊ตฌ์ฑ์์์ ๋์์ ์์ธกํ ์ ์๊ฒ ๋๋ค.
• StrictMode(์๊ฒฉ ๋ชจ๋)์์๋ ๋ ๋ฒ ํธ์ถ๋๋ฏ๋ก ์ฐธ์กฐ ๊ฐ์ฒด๋ฅผ ๋ ๊ฐ ์์ฑํ์ง๋ง ํ๋๋ ์ญ์ ๋๋ฏ๋ก ํ๋ก๋์ ์ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
๐ข ์ ์ธ
useRef ์ฐธ์กฐ๋ฅผ ์ ์ธํ๋ ค๋ฉด ๊ตฌ์ฑ ์์์ ์ต์์ ์์ค์์ ํธ์ถํ๋ค.
import { useRef } from 'react'
function RefComponent() {
const intervalRef = useRef(0);
const inputRef = useRef(null);
return (
<div>
<input ref={inputRef}/>
</div>
);
}
โ๏ธ Code
์์ ์ ์ํด Three.js์ Material์ ์ผ์ ๊ฐ๊ฒฉ๋ง๋ค ๋ณ๊ฒฝํด์ค์ผํด์ interval์ ์คํํ๋๋ฐ clear๊ฐ ์๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์๋ค.
์ด๋ useRef๋ฅผ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ์๋ค.
์๋๋ Material๊ณผ ๊ด๋ จ๋ ์ฝ๋๋ ์๋๊ณ interval์ ๊ธฐ์ด์ธ Timer ๊ธฐ๋ฅ์ด๋ค.
import { useRef, useState } from "react";
import "./App.css";
function App() {
const [startTime, setStartTime] = useState<number | null>(null);
const [now, setNow] = useState<number | null>(null);
const intervalRef = useRef<number | null>(null);
const handleStart = () => {
// ์์ ์๊ฐ Set.
setStartTime(Date.now());
// ํ์ฌ ์๊ฐ Set.
setNow(Date.now());
// ๊ธฐ์กด์ ์ธํฐ๋ฒ์ด ์๋ค๋ฉด ์ญ์
clearInterval(intervalRef.current);
intervalRef.current = setInterval(() => {
setNow(Date.now());
}, 10);
};
let sec: number = 0;
if (startTime != null && now != null) {
sec = (now - startTime) / 1000;
}
console.log(intervalRef.current);
const handleStop = () => {
clearInterval(intervalRef.current);
};
return (
<>
<div>
<p style={{ fontWeight: "800" }}>Passed Time</p>
<p style={{ fontSize: "2rem", letterSpacing: "0.25rem" }}>
{sec.toFixed(3)}
</p>
<div>
<button onClick={handleStart} style={{ margin: "0 10px" }}>
Start
</button>
<button onClick={handleStop} style={{ margin: "0 10px" }}>
Stop
</button>
</div>
</div>
</>
);
}
export default App;
๋ค์ ์ฝ๋๋ฅผ ์ ์ฉํ๋ฉด ์๋์ ๊ฐ์ด ๋ํ๋๋ฉฐ, ๋์ํด๋ณด๋ฉด ๋๋ค.
'Framework > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ React ] useCallback์ ๋ํด ์์๋ณด์. (0) | 2024.04.05 |
---|---|
[ React ] useMemo์ ๋ํด ์์๋ณด์. (0) | 2024.04.04 |
[ React ] useEffect()๋ฅผ ์ฌ์ฉํด๋ณด์. (feat. TypeScript) (0) | 2024.03.11 |
[ React ] useState()๋ฅผ ํ์ฉํด๋ณด์. (feat. TypeScript) (0) | 2024.03.11 |
[ React ] CRA - ๋ฆฌ์กํธ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด๋ณด์. (0) | 2024.03.06 |