728x90
๐ useContext
- ์ํ๋ฅผ ์ ์ญ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํจ.
- useState Hook ๊ณผ ํจ๊ป ์ฌ์ฉํ๋ฉด ๊น์ด ์ค์ฒฉ๋ ์ปดํฌ๋ํธ ๊ฐ ์ํ๋ฅผ ๋ ์ฝ๊ฒ ๊ณต์ ํ ์ ์์.
- ์ํ๋ ํด๋น ์ํ์ ์ก์ธ์คํด์ผํ๋ ์คํ์ ๊ฐ์ฅ ๋์ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ๋ณด๊ด๋์ด์ผ ํจ.
๐ Props drilling

- ์ปดํฌ๋ํธ3 ์์ User ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด,
- ๋ฐ๋์ ๊ทธ ์ ์ ์๋ ์ปดํฌ๋ํธ2์์ 3์ผ๋ก User ๋ฅผ ๋ฃ์ด์ค์ผ ์ ๋๋ก 3์์ User๋ฅผ ์ฌ์ฉํ ์ ์๋จ ๋ง์.
- ๋ง์ฝ 10๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ component ๊ฐ ์๋ค๋ฉด,
- 10๋จ๊ณ์ Props drilling ์ด ํ์ํ ๊ฒ์.
- --> ์ด๋ฌํ ์ด์ ๋ก, useContext ๊ฐ ์๊ฒจ๋จ.
๐ useContext ์ฌ์ฉํด๋ณด๊ธฐ
import { createRoot } from "react-dom/client";
import { useState, createContext, useContext } from "react";
const UserContext = createContext(); // useContext ์ฌ์ฉํด๋ณด๊ธฐ.
function Component1() {
const [user, setUser] = useState("Linux");
const [user2, setUser2] = useState("test");
return (
<>
<UserContext.Provider value={user2}>
<h1>{`์๋
๋๋ ${user2} !`}</h1>
<h1>{`์๋
๋๋ ${user} !`}</h1>
<Component2 user={user}/>
</UserContext.Provider>
</>
);
}
function Component2( {user} ){
return (
<>
<h1>component 2</h1>
<Component3 user={user}/>
</>
);
}
function Component3( {user} ){
const user2 = useContext(UserContext);
return (
<>
<h1>component 3</h1>
<h2>{`Hello ${user} again!!`}</h2>
<h2>{`Hello ${user2} again!!`}</h2>
</>
);
}
createRoot(document.getElementById('react4')).render(< Component1/>);
- import { createContext, useContext } from "react";
- const UserContext = createContext();
- ์ฒ์์ UserContext ๋ผ๋ ๋ณ์๋ฅผ useContext ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ์ ์ธํ ๊ฒ.
- <UserContext.Provider value={user2}>
<Component2 />
</UserContext.Provider>- ์๋์ผ๋ก Component2 ์ Props ๋ฅผ ๋ฃ์ด์ ์ ๋ฌํ์ง ์์๋ ์๋์ผ๋ก component2์์ ์ฌ์ฉํ ์ ์๊ฒ ๋จ.
- ๊ผญ! <UserContext.Provider> ๋ก ๊ฐ์ธ์ค์ผํจ.
- const user2 = useContext(UserContext);
- ์ฌ์ฉํ ๋๋ ์ฒ์์ ์ ์ธํ UserContext ๋ผ๋ ๋ณ์๋ฅผ ์ฌ์ฉํ๊ฒ ๋ค๊ณ ํด์ฃผ๊ณ ์จ์ผํจ.
๐ useRef
- state์ ๊ฐ์ด ์ด๋ ํ ๊ฐ์ ์ ์งํ๋ ๋ณ์๋ก์จ ์ฌ์ฉ๋จ.
- ๋ค๋ง, state์ ๋ค๋ฅธ ์ ์ ๋ ๋๋ง์ด ๋ฐ์ํ์ง ์๋๋ค๋ ์ฐจ์ด๊ฐ ์์.
- ์๋ฐ์คํฌ๋ฆฝํธ์ querySelector ์ ๊ฐ์ด Html DOM ์์์ ์ ๊ทผํ๊ณ ์ ํ ๋ ์ฌ์ฉ๋จ.
- ---------------------------------------------------------------------------------------------------
- ์ ์ธ
- const a = useRef(์ด๊ธฐ๊ฐ);
- ์ ์ฅ์ ๊ฐ์ฒด๋ก ์ ์ฅ๋
- {current : ์ด๊ธฐ๊ฐ}
- ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ ํํ๋ก ์ฌ์ฉ๋จ.
- a.current
- ์๋ useState ๋ฅผ ์ฌ์ฉํ ๋๋, --> ๋ ๋๋ง ๋๋ฉด ๊ฐ์ด ์ด๊ธฐํ๊ฐ ๋จ.
- useRef ๋
- ๊ฐ์ด ๋ณํด๋ ๋ ๋๋ง์ด ๋์ง ์๋๋ค๋ ์ .
- ์ผ๋ฐ ๋ณ์์์ ์ฐจ์ด๋ ์ lifecycle ๋์ ๊ฐ์ด ์ด์ ์๋ค๋ ์ ..
- --> ์ปดํฌ๋ํธ๊ฐ ์ด์์๋ ๋์์๋ ๊ฐ์ด ์ ์ง๊ฐ ๋จ.
๐ ๋ฐฉ๋ฒ 1 : useState ์ฌ์ฉํด๋ณด๋ฉด?
useEffect( () => {
setRenderValue(renderValue + 1);
console.log(renderValue); // ์ฌ๊ธฐ ๋ฌดํ๋ฃจํ ๋์
});
- ์ต์ด ๋ ๋๋ง ํ๋ฉด?
- useEffect ํ ์ด ๋์์ ํจ.
- ์์กด์ฑ ๋ฐฐ์ด์ ์๋ตํ๊ฒ ๋๋ฉด,
๋งจ ์ฒ์์ ๋๋๋ง ๋ ๋, state ๊ฐ์ด ๋ณํ๊ฒ ๋จ.
setRenderValue ๊ฐ ์๋ํด์ --> renderValue ๊ฐ์ด ๋ณํ๊ฒ ๋์ง.
๊ทธ๋ฌ๋ฉด ๋ค์ ๋ ๋๋ง์ด ์๋ํ๊ฒ ๋๋๋ฐ,
๊ทธ๋ ๊ฒ ๋๋ฉด์ ์นด์ดํธ๊ฐ ๋ฌดํ๋ฃจํ๋ฅผ ๋๊ฒ ๋๋ ๊ฒ์.
๐ ๋ฐฉ๋ฒ 2 : ์ผ๋ฐ ๋ณ์๋ก ์ฌ์ฉํด๋ณด๋ฉด?
let cnt = 0;
useEffect( () => {
cnt++;
console.log(cnt); // ๊ณ์ํด์ 1๋ง ๋์ด.
});
- ์ฌ๊ธฐ์๋ ๊ณ์ํด์ 1๋ง ์ฐํ ๊บผ์.
- ์ผ๋ฐ ๋ณ์๋ก ์ฒ๋ฆฌํ๋ฉด ๊ฐ์ด ์ ์ง๊ฐ ๋์ง ์์., useState Hook์ ์ฌ์ฉํด์ผ ํ๋๊น...
- ์ด ์ฝ๋์์๋
input์ ๊ฐ์ ๋ฃ์ ๋๋ง๋ค, ๋ ๋๋ง ๋๋ฉด์ --> ์ด๊ธฐํ ๋๊ณ --> cnt++ ๋๊ณ . --> ์ด๊ฑธ ๊ณ์ ๋ฐ๋ณตํจ.
๐๋ฐฉ๋ฒ 3 : useRef ์ฌ์ฉํด๋ณด๊ธฐ.
- ์ํฌํธ๋ ??
- import { useRef } from "react";
- ์ ์ธํ๋ ๋ฐฉ๋ฒ์ ??
- const count = useRef(0); // { current : 0 } // ๊ฐ์ฒด ํํ๋ก ๋ณด๊ด๋จ.
- ๊บผ๋ด์ ์ฐ๋ ค๋ฉด ??
- count.current = count.current +1;
- ๊ฐ์ ๊ฐ์ ์ฐ๋ ๊ฑด๋ฐ, ์ html์ ์ถ๋ ฅ๋๋ ๊ฐ๊ณผ ์ฝ์์ ๊ฐ์ด ๋ค๋ฅธ๊ฑฐ์ง???
- useRef๋ ๊ฐ์ด ๋ณํด๋ ๋ ๋๋ง ํ์ง ์์.
์ด ๋ง์ธ ์ฆ, ์ต์ด์ ์ด๋ฏธ ๋ ๋๋ง ๋์ ๋์ count์ ๊ฐ์ด +1 ๋์๊ฒ ์ง๋ง.
๊ทธ๋์, ์ฝ์์์๋ ์ฐํ์ง๋ง, html ์์์ ๋ฐ์์ด ๋์ง๋ ์์ ๊ฒ์.
- useRef๋ ๊ฐ์ด ๋ณํด๋ ๋ ๋๋ง ํ์ง ์์.
- ๊ฐ์ ๊ฐ์ ์ฐ๋ ๊ฑด๋ฐ, ์ html์ ์ถ๋ ฅ๋๋ ๊ฐ๊ณผ ์ฝ์์ ๊ฐ์ด ๋ค๋ฅธ๊ฑฐ์ง???
๐ ํ์ฝ๋
import { useState, useEffect, useRef } from "react";
import { createRoot } from "react-dom/client";
function App() {
const [inputValue, setInputValue] = useState("");
const [renderValue, setRenderValue] = useState(0);
let cnt = 0;
const count = useRef(0); // { current : 0 } // ํํ๋ก ๋ณด๊ด๋จ.
useEffect( () => {
// ๋ฐฉ๋ฒ 1 : useState ์ฌ์ฉํด๋ณธ๋ค๋ฉด?
// setRenderValue(renderValue + 1);
// console.log(renderValue); // ๋ฌดํ ๋ฃจํ ๋์.
/* ์์กด์ฑ ๋ฐฐ์ด์ ์๋ตํ๊ฒ ๋๋ฉด,
๋งจ ์ฒ์์ ๋๋๋ง ๋ ๋, state ๊ฐ์ด ๋ณํ๊ฒ ๋จ.
setRenderValue ๊ฐ ์๋ํด์ --> renderValue ๊ฐ์ด ๋ณํ๊ฒ ๋์ง.
๊ทธ๋ฌ๋ฉด ๋ค์ ๋ ๋๋ง์ด ์๋ํ๊ฒ ๋๋๋ฐ,
๊ทธ๋ ๊ฒ ๋๋ฉด์ ์นด์ดํธ๊ฐ ๋ฌดํ๋ฃจํ๋ฅผ ๋๊ฒ ๋๋ ๊ฒ์.
*/
// ๋ฐฉ๋ฒ 2 : ์ผ๋ฐ ๋ณ์๋ก ์ฌ์ฉํด๋ณธ๋ค๋ฉด?
// cnt++;
// console.log(cnt); // ๊ณ์ 1๋ง ๋์ด.
// ๋ฐฉ๋ฒ 3 : useRef ์ฌ์ฉํด๋ณธ๋ค๋ฉด?
count.current = count.current +1;
console.log( count.current );
/* useRef๋ ๊ฐ์ด ๋ณํด๋ ๋ ๋๋ง ํ์ง ์์.
์ด ๋ง์ธ ์ฆ, ์ต์ด์ ์ด๋ฏธ ๋ ๋๋ง ๋์ ๋์ count์ ๊ฐ์ด +1 ๋์๊ฒ ์ง๋ง.
๊ทธ๋์, ์ฝ์์์๋ ์ฐํ์ง๋ง, html ์์์ ๋ฐ์์ด ๋์ง๋ ์์ ๊ฒ์.
*/
});
return (
<>
<p>๊ฐ์ ์
๋ ฅํด๋ณด์์.</p>
<input type="text" value={inputValue}
onChange={(e) => setInputValue(e.target.value)}/>
<p>๋ ๋๋ง ํ์ : {count.current}</p>
</>
);
}
createRoot(document.getElementById('react4')).render(<App />);
๐useRef ์ ๋ค๋ฅธ ๊ธฐ๋ฅ!!
- ํน์ ํ๊ทธ๋ฅผ ์ฐพ์๋ด๋ ๊ธฐ๋ฅ๋ ํ ์ ์์.
- ์ง์ ๊ฐ ์ ์ฅํ๋ ๊ธฐ๋ฅ๋ ์๊ณ !!
- inputValue = ํ์ฌ state (์ด๋ฒ ๋ ๋ ๊ฐ)
- a.current = ์ง์ ๊ฐ (useEffect๊ฐ ๋ค์์ ์ ์ฅ)
import { useEffect, useRef, useState } from "react";
import { createRoot } from "react-dom/client";
function App() {
const [inputValue, setInputValue] = useState("");
const a = useRef();
useEffect( () => {
a.current = inputValue;
}, [inputValue]);
const focusInput = () => {
a.current.focus();
};
return (
<>
<input type="text" value={inputValue} ref={a} onChange={ (e) => setInputValue(e.target.value) } />
<h2>ํ์ฌ ๊ฐ : {inputValue}</h2>
<h2>์ง์ ๊ฐ : {a.current}</h2>
<button onClick={focusInput}>input ๋ฐ์ค์ ํฌ์ปค์ค ์ฃผ๊ธฐ</button>
</>
);
}
createRoot(document.getElementById('react4')).render(<App />);
์ถ์ฒ :
[์์ด๋ณด ํํ์ด์ง๋ง๋ค๊ธฐ ๋ฆฌ์กํธ ๊ธฐ์ด]
https://www.youtube.com/watch?v=-jutG7mmFK0&list=PLTb3qGCzYjS2AliTIbz9eAGjZSdEQa3m1&index=39
๊ฐ๋ฐ ๊ณต๋ถ๋ฅผ ์ํ ๋ธ๋ก๊ทธ ์ ๋๋ค.
์ค๋ฅ๊ฐ ์๋ค๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์!
๊ฐ์ฌํฉ๋๋ค.

728x90
'front > react' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [react] React Hook 4 (useCallback, useMemo) (0) | 2026.01.07 |
|---|---|
| [react] React Hook 3 (useReducer) (0) | 2026.01.07 |
| [react] React Hooks 1 (useState, useEffect) (0) | 2026.01.04 |
| [react] React Transition (useTransition) (0) | 2026.01.04 |
| [react] React Router (BrowserRouter, Routes, Route, Link, Outlet, useParams) (0) | 2026.01.04 |