React Router
React์์ SPA ๋ฐฉ์์ผ๋ก ๋ผ์ฐํ ํ ์ ์๊ฒ ํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
* ๋ผ์ฐํ : ์์ฒญ ์ฃผ์์ ๋ง๋ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋ ๊ฒ
์ฌ์ฉ ๋ฐฉ๋ฒ
์ค์น
์ด๋ฏธ ์์ฑ๋ react ํ๋ก์ ํธ์ ์ค์นํด์ฃผ๋ฉด ๋๋ค.
npm i react-router-dom
์ฃผ์ ์ปดํฌ๋ํธ
<BrowserRouter>
React Router๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ๊ณณ์ ํด๋น ์ปดํฌ๋ํธ๋ก ๊ฐ์ผ๋ค.
์ด ๋ ์๋์ฒ๋ผ App ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ธ๊ฒ ๋๋ฉด ๋ผ์ฐํ ๊ธฐ๋ฅ์ ์ฑ ์ ์ฒด์ ์ ์ฉ์์ผ์ฃผ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๋ฐฉ์์ด ๋ง์ด ์ฌ์ฉ๋๋ค.
* StrictMode๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ด ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์์๋ด๊ธฐ ์ํ ๋๊ตฌ๋ก, UI๋ ๋ ๋๋งํ์ง ์์ผ๋ฉฐ ์์๋ค์ ๋ํ ๋ถ๊ฐ์ ์ธ ๊ฒ์ฌ์ ๊ฒฝ๊ณ ๋ฅผ ํ์ฑํํ๋ค.
createRoot(document.getElementById('root')).render(
<StrictMode>
<BrowserRouter>
<App />
</BrowserRouter>
</StrictMode>,
);
<Link>
ํ์ด์ง์ ์๋ก ๊ณ ์นจ ์์ด ์ด๋ํ๋๋ก ๋์์ฃผ๋ ์ปดํฌ๋ํธ๋ก, to ์์ฑ์ ์ด์ฉํด ์ด๋ํ๊ณ ์ถ์ ์ฃผ์๋ก ์ด๋ํ ์ ์๋ค.
์ด ๋ Link ์ปดํฌ๋ํธ๋ ๋ธ๋ผ์ฐ์ ์์ <a>์์๋ก ํ์๋๋๋ฐ, a์์์ ๋ฌ๋ฆฌ ์๋ก๊ณ ์นจ์ด ๋ฐ์ํ์ง ์๊ณ ์ฃผ์๋ง ๋ณ๊ฒฝ๋๋ค.
์ค์ต ์ ์๋ ์ฝ๋์์ ๋ฉ์ธ์ ๋๋ ์ ๋, ์ฃผ์๊ฐ http://localhost:5173/main์ผ๋ก ์ด๋๋ ๊ฒ์ด๋ค.
function App() {
return (
<nav>
<Link to="/main">๋ฉ์ธ</Link>
<Link to="/mypage">๋ง์ดํ์ด์ง</Link>
<Link to="/test">ํ
์คํธ</Link>
</nav>
);
}
<Routes>
<Route> ์ปดํฌ๋ํธ๋ค์ ๋ฌถ์ด์ฃผ๋ ์ญํ
<Route>
์ฃผ์์ ๋ง๋ ์ปดํฌ๋ํธ๋ฅผ ํ๋ฉด์ ํ์
function App() {
return (
<>
<nav>
<Link to="/main">๋ฉ์ธ</Link>
<Link to="/mypage">๋ง์ดํ์ด์ง</Link>
<Link to="/test">ํ
์คํธ</Link>
</nav>
<Routes>
<Route path="/main" element={<Main />} />
<Route path="/mypage" element={<Mypage />} />
<Route path="/test" element={<Test />} />
</Routes>
</>
);
}
function Main() {
return <div>mainPage</div>;
}
function Mypage() {
return <div>myPage</div>;
}
function Test() {
return <div>test</div>;
}
์ฃผ์ ํจ์
useNavigate()
ํน์ ์ฃผ์๋ก ์ด๋ํ ์ ์๊ฒ ํด์ฃผ๋ ํจ์ ์์ฑ
์ด ๋ ์ธ์๊ฐ์ผ๋ก ์ซ์๋ฅผ 1, -1์ด์๋๋ผ 2, -2๋กํ๋ฉด ๋๋ฒ ์์ผ๋ก ๊ฐ๊ฑฐ๋ ๋ค๋ก๊ฐ๊ฒ ๋๋ค.
const navi = useNavigate()
navi('/main') // main์ผ๋ก ์ด๋
navi(1) // ์์ผ๋ก ๊ฐ๊ธฐ
navi(-1) // ๋ค๋ก ๊ฐ๊ธฐ
Link์ปดํฌ๋ํธ ๋์ useNavigate๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค.
const navi = useNavigate();
return (
<>
<nav>
<button onClick={() => navi('/main')}>๋ฉ์ธ</button>
<button onClick={() => navi('/mypage')}>๋ง์ดํ์ด์ง</button>
<button onClick={() => navi('/test')}>ํ
์คํธ</button>
</nav>
<Routes>
<Route path="/main" element={<Main />} />
<Route path="/mypage" element={<Mypage />} />
<Route path="/test" element={<Test />} />
</Routes>
</>
);
useLocation()
ํ์ฌ ํ์ด์ง์ ์์น ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ๊ฐ์ฒด ์์ฑ
const location = useLocation()
location.pathname // ํ์ฌ ๊ฒฝ๋ก๋ช
location.search // ์ฟผ๋ฆฌ ๋ฌธ์์ด
์ฝ์์ฐฝ์ผ๋ก ํ์ธํด๋ณด๋ฉด ์๋์ฒ๋ผ ์ถ๋ ฅ๋๋ค.
const location = useLocation();
console.log(location);
console.log(location.pathname);
console.log(location.search);
์ด๋ ์ฟผ๋ฆฌ์คํธ๋ง๊ฐ์ธ search๊ฐ ์์ ''์ธ๊ฑธ ๋ณผ ์ ์๋ค. ์์ง ์ฟผ๋ฆฌ ์คํธ๋ง ๊ฐ์ ๋ฑํ ๊ฐ์ ธ์ค์ง ์์์ ๊ทธ๋ฐ ๊ฒ์ธ๋ฐ, ์ฃผ์์ ์์๋ก ์ฟผ๋ฆฌ ์คํธ๋ง ๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด ์ด๋ ๊ฒ ์ถ๋ ฅ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ฟผ๋ฆฌ ์คํธ๋ง โฌ๏ธ
์ฟผ๋ฆฌ ์คํธ๋ง(์ฟผ๋ฆฌ ๋ฌธ์์ด, ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ)์ด๋ ๋ฐ์ดํฐ ์ ๋ฌ ๋ฐฉ์์ผ๋ก ๋ณดํต get ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ๋ ์ฌ์ฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ?๋ก ์์ํ๋ฉฐ ํค=๊ฐ์ ํํ๋ก ๋ํ๋ด๊ณ , ์ฌ๋ฌ ์์ผ ๊ฒฝ์ฐ &๋ก ๊ตฌ๋ถํ๋ค.
๋๋ฌด์ํค๊ฐ์ ํ์ด์ง์์๋ ๋ฆฌ๋ค์ด๋ ํธ๋ฅผ ํตํด ์ด๋ ๊ฒ์์ด๋ก๋ถํฐ ์๋๋ ํํ์ผ๋ก from์ด๋ผ๋ ํค์ ์ฟผ๋ฆฌ ๋ฌธ์์ด ๊ฐ์ ์ฌ์ฉํ๋ค.
์๋ฅผ ๋ค์ด ๋ด๊ฐ ๋๋ฌด์ํค ๊ฒ์์ฐฝ์ '์๋ฏน์ค'๋ฅผ ๊ฒ์ํ์ ๋, ์๋ฏน์ค์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ๋ฌธ์๋ NMIXX์ด๊ธฐ ๋๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด ํํ๋๋ค.
https://namu.wiki/w/NMIXX?from=์๋ฏน์ค
useParams()
์ฃผ์์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ๊ฐ์ ๋ด์ ๊ฐ์ฒด ์์ฑ.
url ํจํด์ ๋ง๊ฒ ๋ณ์๋ฅผ ๋์ ์ผ๋ก ์ฝ์ด๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ ์ปดํฌ๋ํธ๋ง๋ค ๋ค๋ฅธ url ๊ฐ์ ์ ๋ฌ๋ฐ์ ์ ์๋ค.
const params = useParams()
params.param1 // param1์ด๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ค์ด์จ ๊ฐ
params.name // name์ด๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ค์ด์จ ๊ฐ
๋ผ์ฐํธ ๊ฒฝ๋ก์์ name์ด๋ผ๋ ๋ณ์๋ฅผ ์ง์ ํด์คฌ์ ๋ ๊ฒฝ๋ก ๋ณ์๋ช ์ธ name์ด key๊ฐ ๋๊ณ , name์ ๊ฐ์ด ๋ฌธ์์ด๋ก ๋ค์ด์จ๋ค.
<Routes>
<Route path="/main/:name" element={<Main />} />
<Route path="/mypage" element={<Mypage />} />
<Route path="/test" element={<Test />} />
</Routes>
</>
);
}
function Main() {
const params = useParams();
console.log(params.name);
return <div>mainPage</div>;
}
์ด ๋ ์ด ์ฝ๋์์ ์์ง name์ ๊ฐ์ ์ง์ ํด์ฃผ์ง ์์๊ธฐ ๋๋ฌธ์ ์์๋ก ์ฃผ์์ ๊ฐ์ ์
๋ ฅํด์ฃผ๋ฉด
useSearchParams()
์ฃผ์์ ์ฟผ๋ฆฌ ์คํธ๋ง ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์๋ ๊ฐ์ฒด์ ์ฟผ๋ฆฌ ์คํธ๋ง์ ์์ ํ ์ ์๋ ํจ์ ์์ฑ
const[searchParams, setSearchParams] = useSearchParams()
searchParams.get('name') // name์ผ๋ก ๋ค์ด์จ ์ฟผ๋ฆฌ ์คํธ๋ง
setSearchParams({name:'ํ์ฐ'}) // name ์ฟผ๋ฆฌ ์คํธ๋ง ์์
๋ณดํต ์์ ์ ์ํ๊ณ ๊ฐ์ ๊ฐ์ ธ์ฌ ๋ ๋ง์ด ์ฌ์ฉ๋๋ค๊ณ ํ๋ค...
<Routes>
<Route path="/main" element={<Main />} />
<Route path="/mypage" element={<Mypage />} />
<Route path="/test" element={<Test />} />
</Routes>
</>
);
}
function Main() {
const [searchParams, setSearchparams] = useSearchParams();
console.log(searchParams.get('name'));
console.log(searchParams.get('school'));
return <div>mainPage</div>;
}
์ด๋ฒ์๋ ์์ง ์ฟผ๋ฆฌ ์คํธ๋ง ๊ฐ์ด ๋ฑํ ์๊ธฐ ๋๋ฌธ์ ์คํ์ํจ ์ํ์์ ์ด๋ฒ์ ์ฟผ๋ฆฌ์คํธ๋ง ๊ฐ์ ์ฌ๋ฌ๊ฐ ๋ฃ์ด์คฌ๋ค
๊ฐ๊ฐ name์ ๊ฐ๊ณผ school์ ๊ฐ์ ๊ฐ์ ธ์ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
'react' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React / ์๋ช ์ฃผ๊ธฐ (1) | 2025.04.10 |
---|---|
React / Router ์ค์ต - ๋๋ฌผ ์ ๋ณด ์ฌ์ดํธ ๋ง๋ค๊ธฐ (0) | 2025.04.09 |
React / ์กฐ๊ฑด๋ถ ๋ ๋๋ง (0) | 2025.04.09 |
React / state, props๋ฅผ ์ด์ฉํด CRUD ๊ธฐ๋ฅ์ ๊ฐ์ง Todo-List ๋ง๋ค๊ธฐ (0) | 2025.04.07 |
React / props, state ๋์ด์ฌ๋ฆฌ๊ธฐ (0) | 2025.04.06 |