๐ public ํด๋ ์ฌ์ฉ
- ์๋ ๊ฒฝ๋ก๋ฅผ ์ด์ฉํด์ src ํด๋ ์ด์์ผ๋ก ๊ฐ์ ๋ค๋ฅธ ํด๋์ ์ ๊ทผํ์ฌ ๋ด๋ ค๊ฐ๋ ๋ฐฉ์, ์ ๋ ๊ฒฝ๋ก๋ฅผ ์ด์ฉํ๋ ๋ฐฉ์ ์ฌ์ฉ ๋ถ๊ฐ
- ๊ธฐ์กด ๋ฐฑ์๋์์๋ public ํด๋๋ฅผ static์ด๋ผ๋ express ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ํน์ ์ฃผ์ ๊ฐ์ ์์ฒญํ๋ฉด ์ฐ๊ฒฐ์ด ๋์์
- npx create-react-app์ ํตํด ๋ง๋ค์ด์ง ๋ฆฌ์กํธ ์ฑ์ ๊ฒฝ์ฐ๋ public ํด๋๊ฐ ์๋์ผ๋ก static ์ฒ๋ฆฌ๋จ
- ๋ฐ๋ผ์ ์ด๋ ์์น์์๊ฑด / ๋ฅผ ์จ์ ์ ๊ทผํ๋ฉด public ํด๋๋ฅผ ํธ์ถํ ์ ์์
๐ Composition(ํฉ์ฑ), Specialization, Containment
๐ React Router
- ๋ฆฌ์กํธ์์๋ ์ปดํฌ๋ํธ๋ณ ๋ผ์ฐํ ์ด ๊ฐ๋ฅ
- [ํฐ๋ฏธ๋] npm i react-router-dom
- index.js ์์ App ์ปดํฌ๋ํธ๋ฅผ <BrowserRouter>๋ก ๊ฐ์ธ๊ธฐ
// src/index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import { BrowserRouter } from 'react-router-dom';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<>
<BrowserRouter>
<App />
</BrowserRouter>
</>
);
reportWebVitals();
- Routes ์ปดํฌ๋ํธ ๋ด๋ถ์ Route ์ปดํฌ๋ํธ๋ฅผ ๋ฃ์ด์ฃผ๊ณ ๊ฐ๊ฐ์ ์ฃผ์ ๊ฐ์ path์, ํธ์ถํ ์ปดํฌ๋ํธ๋ element ์์ฑ์ผ๋ก ๋ถ๋ฌ์ฃผ๊ธฐ
- <a> ํ๊ทธ๋ ๋ธ๋ผ์ฐ์ ๋ ๋ฒจ์์ ํ์ด์ง๋ฅผ ์๋์ผ๋ก ์๋ก๊ณ ์นจ ํ๊ธฐ ๋๋ฌธ์ React์์๋ ์ด๋ฅผ ๋ง๊ณ ์ <Link to="">๋ผ๋ ์ปดํฌ๋ํธ ์ฌ์ฉ
// src/app.js
import { Routes, Route } from 'react-router-dom';
function App() {
return (
<div className="App">
<Routes>
<Route path="/" element={<Header />} />
<Route path="/profile" element={<Profile />} />
<Route path="/board" element={<Board />} />
<Route path="/board/:boardID" element={<BoardDetail />} />
</Routes>
</div>
);
}
export default App;
๐ฉ PageNotFound
- ์๋ชป ์ ๋ ฅ๋ ์ฃผ์์ ๋ํ ์์ธ ์ฒ๋ฆฌ
- * ๋ ๋ชจ๋ ์ฃผ์ ์ ๋ ฅ์ ์๋ฏธํจ
- React-router-dom๋ ์ฝ๋ ์ ์ธ ์์์ ๋ฐ๋ผ ์ฒ๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ๋ง์ง๋ง ๋ผ์ฐํฐ์์ *๋ฅผ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌํ๋ฉด ์ผ์นํ์ง ์์ ์ฃผ์๋ฅผ ํ๊บผ๋ฒ์ ์ฒ๋ฆฌํ ์ ์์
// src/app.js
import { Routes, Route } from 'react-router-dom';
function App() {
return (
<div className="App">
<Routes>
<Route path="/" element={<Header />} />
<Route path="/profile" element={<Profile />} />
<Route path="/board" element={<Board />} />
<Route path="/board/:boardID" element={<BoardDetail />} />
<Route path="*" element={<NotFound />} />
</Routes>
</div>
);
}
export default App;
๐ฉ ์ฃผ์ parameter ํ์ฉ
- parameter๋ useParams๋ก ์ ์ธํ ๊ฐ์ฒด ๋ณ์์ ๋ด๊ธฐ๊ฒ ๋จ
// src/components/Board.js
import { Link } from "react-router-dom"
import Header from "./Header"
export default function Board() {
return (
<>
<Header />
<h1>๊ฒ์ํ ํ์ด์ง์
๋๋ค.</h1>
<Link to="1"><h2>๊ฒ์๊ธ 1๋ฒ</h2></Link>
<Link to="2"><h2>๊ฒ์๊ธ 2๋ฒ</h2></Link>
</>
)
}
// src/components/BoardDetail.js
import { useLocation, useParams } from "react-router-dom"
import Header from "./Header"
export default function BoardDetail() {
const { boardID} = useParams();
return (
<>
<Header />
<h1>{boardID}๋ฒ ๊ฒ์๊ธ์
๋๋ค.</h1>
</>
)
}
๐ฉ ์ฃผ์ query ๋ฐ๊ธฐ
- ์๋ query๋ react-query ๋ชจ๋์ ์ฌ์ฉํจ
- ์ด๋ฒ์๋ ๊ฐ๋จํ๊ฒ ํ์ธ๋ง ํ ๊ฒ์ด๋ฏ๋ก react-router-dom์ ๊ธฐ๋ฅ ํ์ฉ
- search: ?๋ฅผ ํฌํจํ query string
- path: ํ์ฌ์ ์ฃผ์
- hash: ์ฃผ์์ ๋ค์ด์๋ # ๋ฌธ์์ด ๋ค์ ๊ฐ(ํด์ ์ฃผ์ ๊ฐ)
// src/components/BoardDetail.js
import { useLocation, useParams } from "react-router-dom"
import Header from "./Header"
export default function BoardDetail() {
const { boardID} = useParams();
const location = useLocation();
return (
<>
<Header />
<h1>{boardID}๋ฒ ๊ฒ์๊ธ์
๋๋ค.</h1>
<p>์ฟผ๋ฆฌ: {location.search}</p>
<p>์ฃผ์: {location.pathname}</p>
<p>ํด์ฌ: {location.hash}</p>
</>
)
}
'KDT > TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
10/12 TIL : React SPA ์ ์(Mbti-app) (0) | 2022.10.17 |
---|---|
10/7 TIL : Redux, ๊ฐ๋จํ Todo-list ๋ง๋ค๊ธฐ (0) | 2022.10.14 |
9/30 TIL : React Hooks(useEffect, useMemo) (0) | 2022.10.14 |
9/28 TIL : props, ์ปดํฌ๋ํธ ๊พธ๋ฏธ๊ธฐ(inline, sass, styled-components), useRef (0) | 2022.09.28 |
9/26 TIL : MVC ํจํด, React(Component, state) (0) | 2022.09.27 |