์ ์ด ์ปดํฌ๋ํธ vs useRef
useState
- ์ ์ด ์ปดํฌ๋ํธ์์ ์ฌ์ฉ
- ์ํ๊ฐ ๋ณํํ ๋๋ง๋ค ๋ฆฌ๋ ๋๋ง ๋ฐ์
- ์ ๋ ฅ ๊ฐ์ ์ค์๊ฐ ์ํ ๋ฐ์์ด ํ์ํ๊ฑฐ๋ ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ์ํฅ์ ์ค ๋ ์ฌ์ฉ
- ํผ ๊ฒ์ฆ, ์ค์๊ฐ ๊ฒ์, UI ๋ฐ์ ๋ฑ์ ์ฌ์ฉ
useRef
- ๋น์ ์ด ์ปดํฌ๋ํธ์์ ์ฌ์ฉ
- ์ ๋ ฅ๊ฐ์ DOM์์ ์ง์ ๊ฐ์ ธ์ด
- ๋ ๋๋ง๊ณผ ๋ฌด๊ดํด์, ๋ฆฌ๋ ๋๋ง๋ผ๋ ์ด๊ธฐํ๋์ง ์๋ ๋ณ์๊ฐ ํ์ํ ๋ ์ฌ์ฉ
- ์ต์ข ์ ๋ ฅ ๊ฐ๋ง ํ์ํ ๋, ์ฑ๋ฅ์ ํฅ์์ํค๊ณ ์ถ์ ๋๋ ๊ตณ์ด ์ฌ์ฉํ์ง ์์๋ ๋จ
- ๋ก๊ทธ์ธ ์ฐฝ, ๋น๋ฐ๋ฒํธ ์ ๋ ฅ ๋ฑ์ ์ฌ์ฉ
- ๋ฆฌ์กํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ DOM์ ํตํด ์ค์ DOM์ ์กฐ์ํ๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ ์๋ ๋ฐฉ์๊ณผ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๊ผญ ํ์ํ ๋๋ง ์จ์ผํจ
useRef
์ฌ์ฉ๋ฐฉ๋ฒ
1. DOM ์ฃผ์๋ฅผ ๋ด์์ค ๊ณต๊ฐ ์์ฑ
const domRef = useRef(null) // ์ฒ์์๋ null์ ๋ฃ์ด ๋น ๊ณต๊ฐ์ผ๋ก
2. DOM ์ฃผ์๋ฅผ ๋ด๊ณ ์ถ์ ์์์ ref ์์ฑ์ผ๋ก ์ฐ๊ฒฐ
<element ref={domRef} />
3. current ์์ฑ์ผ๋ก ์์์ ์ ๊ทผ
domRef.current // = <element ref={domRef} />
์์ - ๋ฆฌ๋ ๋๋ง ์์ด ์ค์ DOM์ ์ ๊ทผ
useState์ useRef๋ฅผ ์ฌ์ฉํด์ ์ ๋ ฅ๊ฐ์ ๊ฐ์ ธ์จ๋ค๊ณ ํ ๋, ๋ ๋๋ง์์ ์ฐจ์ด๋ฅผ ์์๋ณผ ์ ์๋ค.
1. useState ์ฌ์ฉ
function App() {
return (
<>
<ControlledInput />
</>
);
}
// ์ ์ด ์ปดํฌ๋ํธ
const ControlledInput = () => {
const [inputValue, setInputValue] = useState('');
console.log('๋ฆฌ๋ ๋๋ง');
return (
<input value={inputValue} onChange={(e) => setInputValue(e.target.value)} />
);
};
2. useRef ์ฌ์ฉ
function App() {
return (
<>
<ControlledInput />
<hr />
<UseRefInput />
</>
);
}
const UseRefInput = () => {
const inputRef = useRef(null);
console.log('useRef ๋ฆฌ๋ ๋๋ง');
return (
<>
<input ref={inputRef} />
</>
);
};
input์ value๋ ๋ค์๊ณผ ๊ฐ์ด ์ ๊ทผํ ์ ์๋ค.
const UseRefInput = () => {
const inputRef = useRef(null);
console.log('useRef ๋ฆฌ๋ ๋๋ง');
const getInputValue = () => {
console.log(inputRef.current.value);
};
return (
<>
<input ref={inputRef} />
<button onClick={getInputValue}>input ๊ฐ ๊ฐ์ ธ์ค๊ธฐ</button>
</>
);
};
์์ ๊ฐ์ ๊ฐ์ ธ์จ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก, useRef๋ก input์์๋ฅผ ๋๋ฅด์ง ์๊ณ ๋ focus ํจ๊ณผ๋ฅผ ์ค ์ ์๋ค. (๋์ ์์ ์์๋ ๋ฒํผ์ ๋๋ฅด๊ธด ํ๋ค....)
function App() {
return (
<>
<UseRefInput />
</>
);
}
// useRef
const UseRefInput = () => {
const inputRef = useRef(null);
console.log('useRef ๋ฆฌ๋ ๋๋ง');
const getInputValue = () => {
console.log(inputRef.current.value);
};
// input์ focusํ๋ ํจ๊ณผ!
const focusInput = () => {
inputRef.current.focus();
};
return (
<>
<input ref={inputRef} />
<button onClick={getInputValue}>input ๊ฐ ๊ฐ์ ธ์ค๊ธฐ</button>
<button onClick={focusInput}>input์ focusํ๊ธฐ</button>
</>
);
};
์์ - ๋ฆฌ๋ ๋๋ง๊ณผ ๊ด๊ณ์์ด ์ด๊ธฐํ ๋์ง ์๋ ๋ณ์
useRef๋ ์ปดํฌ๋ํธ์ ๋ ๋๋ง๊ณผ ๊ด๊ณ์์ด ๊ฐ์ด ์ ์ง๋๊ฒ ํ ์ ์๋ค.
- numberRef๋ผ๋ ๋ณ์์ useRef๋ฅผ ์์ฑ
- keep value ๋ฒํผ - ํ์ฌ counter์ ๊ฐ์ numberRef์ ์ ์ฅ
- show value ๋ฒํผ - numberRef์ ์ ์ฅ๋ ๊ฐ์ ์ฝ์๋ก ์ถ๋ ฅ
function App() {
return (
<>
<Counter />
</>
);
}
// counter ๊ฐ์ ํน์ ์์ ์์ ์ ์ฅํ๋ useRef ์์
const Counter = () => {
const [counter, setCounter] = useState(0);
const numberRef = useRef(null);
return (
<>
<div>counter : {counter}</div>
<button onClick={() => setCounter((prev) => prev + 1)}>+</button>
<button onClick={() => setCounter((prev) => prev - 1)}>-</button>
<button onClick={() => (numberRef.current = counter)}>keep value</button>
<button onClick={() => console.log(numberRef.current)}>show value</button>
</>
);
};
useRef๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฌด๋ฆฌ ๋ฆฌ๋ ๋๋ง๋ผ๋ useRef๊ฐ ์ฐธ์กฐํ๋ ๋ฉ๋ชจ๋ฆฌ๋ ๋์ผํ ๊ฐ์ฒด๋ฅผ ์ ์งํ๊ธฐ ๋๋ฌธ์ numberRef.current์ ๊ฐ์ด ์ ์ง๋๋ค. ๋ฌผ๋ก useRef์ ๊ฐ์ ์ ์ฅํด๋ ๋ ๋๋ง๋์ง ์์ผ๋ฉฐ ๋ฐ๋ผ์ ์ปดํฌ๋ํธ๊ฐ ๊ทธ๋๋ก ์ ์ง๋๋ค.
๋ฌผ๋ก ๊ฐ์ ์ ์ฅํ๋ ์ useState ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ๋ค์๊ณผ ๊ฐ์ด ํํํด์ค ์๋ ์๋ค.
const [savedValue, setSavedValue] = useState(null);
// ์๋ต....
<button onClick={() => setSavedValue(counter)}>keep value</button>
์ด ๊ฒฝ์ฐ์๋ ๋ฒํผ์ ๋๋ฅผ๋๋ง๋ค ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋ผ๊ธฐ ๋๋ฌธ์ ๋ฆฌ๋ ๋๋ง์ด ๊ตณ์ด ํ์ํ์ง ์๋ค๋ฉด useRef๊ฐ ํจ์จ์ ์ด๋ค.
'react' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React / ์คํ์ผ๋ง (1) - SCSS (0) | 2025.04.15 |
---|---|
React / custom Hook (1) | 2025.04.11 |
React / ์๋ช ์ฃผ๊ธฐ (0) | 2025.04.10 |
React / Router ์ค์ต - ๋๋ฌผ ์ ๋ณด ์ฌ์ดํธ ๋ง๋ค๊ธฐ (0) | 2025.04.09 |
React / Router (0) | 2025.04.09 |