์ถ์ฒ : ํจ์คํธ์บ ํผ์ค ํ ๋ฒ์ ๋๋ด๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ ์ด๊ฒฉ์ฐจ ํจํค์ง
react-router-dom v6 ์ ๋ฐ์ดํธ ํ ๋ฌ๋ผ์ง ์ : https://kyung-a.tistory.com/36 ์ฐธ๊ณ
react project์์ ๋ผ์ฐํ ํจํค์ง ์ค์น(๊ธฐ๋ณธ ๋ด์ฅ๋ ํจํค์ง ์๋)
npm i react-router-dom
App.js
import { BrowserRouter, Route, Routes } from "react-router-dom";
import Home from "./pages/Home";
import Profile from "./pages/Profile";
import About from "./pages/About";
// react-router-dom version6์ด์๋ถํฐ <Route>๋ฅผ <Routes>์์ ๊ฐ์ธ์ค์ผํจ
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/profile" element={<Profile />} />
<Route path="/about" element={<About />} />
</Routes>
</BrowserRouter>
);
}
export default App;
Home.jsx
export default function Home() {
return <div>Home Page</div>;
}
- ์ง์ ๋ ๊ฒฝ๋ก ํ๋ผ๋ฏธํฐ๊ฐ์ ์ ๋ฌํ์ฌ ์ถ๋ ฅ (id, typeof)
- App.js์์ ๊ฒฝ๋ก๊ฐ ์ค์ : /:ํ๋ผ๋ฏธํฐ๊ฐ/*
import { useParams } from "react-router-dom";
export default function Profile() {
const { id } = useParams();
console.log(id, typeof id);
return (
<div>
<h2>Profile Page</h2>
{id && <p>id is {id}. </p>}
</div>
);
}
- ์ฟผ๋ฆฌ์คํธ๋ง๊ฐ์ผ๋ก ํ๋ผ๋ฏธํฐ๊ฐ ์ ๋ฌํ์ฌ ์ถ๋ ฅ (name=mark)
- const searchParam = useLocation()์์ searchParam์ search๊ฐ์ด ?name=markํ์ธ
import { useLocation } from "react-router-dom";
import queryString from "query-string";
export default function About() {
const searchParam = useLocation().search;
console.log(searchParam); //?name=mark
const query = queryString.parse(searchParam);
console.log(query); //{name: "mark"}
return (
<div>
<h2>About Page</h2>
{query.name && <p>name์ {query.name} ์
๋๋ค.</p>}
</div>
);
}
export default function NotFound() {
return <div>ํ์ด์ง๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.</div>;
}
Link Component
- ์๋ฒ๋ก๋ถํฐ ์๋ก์ด ํ์ผ์ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ์๋๋ผ ์ด๋ฏธ ๊ฐ์ง๊ณ ์๋ react view์ค์์ ์๋ง๋ view๋ฅผ ๋ณด์ฌ์ค
- ๋ก๋ฉ ์์ด ๋น ๋ฅด๊ฒ view ์ ํ ๊ฐ๋ฅ
- Link์ปดํฌ๋ํธ์ to์์ฑ ์ด์ฉ
import { Link } from "react-router-dom";
export default function Links() {
return (
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/profile">Profile</Link>
</li>
<li>
<Link to="/profile/1">Profile/1</Link>
</li>
<li>
<Link to="/about">About</Link>
</li>
<li>
<Link to="/about?name=woom">About?name=woom</Link>
</li>
</ul>
);
}
NavLink Component
- activeClassName, activeSyle ์ฒ๋ผ active ์ํ์ ๋ํ ์คํ์ผ ์ง์ ๊ฐ๋ฅ
- Route์ path์ฒ๋ผ ๋์ํ๊ธฐ ๋๋ฌธ์ end(๊ตฌ: exact)๊ฐ ์์
- v6 ๋ณ๊ฒฝ์ฌํญ (์ฐธ๊ณ : https://seungahhong.github.io/blog/2022/03/2022-03-12-react-router-v6/)
import { NavLink, useLocation } from "react-router-dom";
export default function NavLinks() {
const activeStyle = { color: "red" };
const location = useLocation();
return (
<ul>
<li>
<NavLink to="/" style={({ isActive }) => (isActive ? activeStyle : {})}>
Home
</NavLink>
</li>
<li>
<NavLink
to="/profile"
end
style={({ isActive }) => (isActive ? activeStyle : {})}>
Profile
</NavLink>
</li>
<li>
<NavLink
to="/profile/1"
style={({ isActive }) => (isActive ? activeStyle : {})}>
Profile/1
</NavLink>
</li>
<li>
<NavLink
to="/about"
style={location.pathname === "/about" ? activeStyle : {}}>
About
</NavLink>
</li>
<li>
<NavLink
to="/about?name=woom"
style={location.search === "?name=woom" ? activeStyle : {}}>
About?name=woom
</NavLink>
</li>
</ul>
);
}
import LoginButton from "../components/LoginButton";
export default function Login(props) {
return (
<div>
<h2>Login Page</h2>
<LoginButton />
</div>
);
}
import { useNavigate } from "react-router-dom";
export default function LoginButton(props) {
console.log(props);
const navigate = useNavigate();
function login() {
setTimeout(() => {
navigate("/");
}, 1000);
}
return <button onClick={login}>Log in</button>;
}