TIL :: [React] React Router, Sass
ํ์ต๋ชฉํ
- SPA๊ฐ ๋ฌด์์ธ์ง ์ค๋ช ํ ์ ์๋ค.
- react-router-dom๋ฅผ ์ด์ฉํด Router Component๋ฅผ ๊ตฌํํ ์ ์๋ค.
- react-router-dom์์ Routing์ ํ๋ ๋ฐฉ๋ฒ 2๊ฐ์ง์ ์ฐจ์ด์ ์ ๋ํด ์ค๋ช ํ ์ ์๋ค.
- <Link> Component ์ <a> tag ์ ์ฐจ์ด์ ์ ๋ํด ์ค๋ช ํ ์ ์๋ค.
- css ์ ์ฒ๋ฆฌ๊ธฐ์ ์ญํ ์ ๋ํด ์ค๋ช ํ ์ ์๋ค.
- sass์์ ์ ๊ณตํ๋ ๋ฌธ๋ฒ์ ์ด์ฉํ์ฌ cssํ์ผ์ scssํ์ผ๋ก ๋ณํํ ์ ์๋ค.
1. SPA๊ฐ ๋ฌด์์ธ์ง ์ค๋ช ํ ์ ์๋ค.
* spa๋?(์ฑ๊ธ ํ์ด์ง ์ดํ๋ฆฌ์ผ์ด์ )
: ๋ฉํฐํ ํ์ด์ง๊ฐ ์๋ ์ฑ๊ธ ํ์ด์ง์ด๋ค.
2. react-router-dom๋ฅผ ์ด์ฉํด Router Component๋ฅผ ๊ตฌํํ ์ ์๋ค.
* react-router ๋?
: ๋ฆฌ์กํธ์ ๋ผ์ฐํ ๊ธฐ๋ฅ์ ์ํด ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
* Routing(๋ผ์ฐํ ) ์ด๋?
: ๋ค๋ฅธ ๊ฒฝ๋ก(url ์ฃผ์)์ ๋ฐ๋ผ ๋ค๋ฅธ View(ํ๋ฉด)๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ.
ํ์ด์ง ์ด๋์ ์์ด์, ํ๋ฉด์ ์ ํํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๊ฒ ํด์ฃผ๋ ๋๊ตฌ๊ฐ react router ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ฃผ์(url)๋ก ์ด๋์ ํ๊ธฐ ์ํด ํ์ํ ๋๊ตฌ ์ด๋ค.
๋ผ์ฐํฐ๋ฅผ ์ด์ฉํด์ ์ฃผ์์ ์ฃผ์๋ฅผ ๋งตํ์ํค๋ ๊ฒ์ ์๋ ค์ค๋ค.
react-router๋ฅผ ํตํด SPA(์ฑ๊ธํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ )๊ฐ ํ๋ฉด์ด๋์ ํ๋๊ฒ ์ฒ๋ผ ํ ์ ์๋ค.
router๋ฅผ ์ด์ฉํด ๋ก๊ทธ์ธํ์ด์ง์ ๋ฉ์ธํ์ด์ง๋ฅผ ์๋ค๊ฐ๋คํ๊ฒ ๋ง๋ค ์ ์๋ค.
*react-router ์ค์น :
npm install react-router-dom --save
Router Component ๋ฅผ ๊ตฌํํ ์ ์๋ค
์ ์๋ฏธ๋ Router Component(=ํด๋)๋ฅผ ๋ง๋ค์ด๋ผ! Router.js
์ฃผ์์ ์ฐ๊ฒฐ๋์ด์๋ ์ปจํฌ๋ํธ๊ฐ ์์ด์ผํ๋ค. ๊ทธ๋์ผ๋ง ํด๋น ์ฃผ์๋ก ๋ค์ด๊ฐ์๋ , ์ปดํฌ๋ํธ์์ ์ ์ํ ํ๋ฉด์ด ๋ณด์ด๊ฒ ๋ง๋ค์ด์ค๋ค.
Router ์ปดํฌ๋ํธ ๊ตฌํ๋ฐฉ๋ฒ ์์
import React from "react"; //ํด๋น ํ์ผ์ด react๋ฅผ ์ฌ์ฉํ๋ค ๋ผ๋ ์๋ฏธ
import { BrowserRouter, Routes, Route } from "react-router-dom";
import Nav from "./components/Nav/Nav"; // ""์์ .์ผ๋ก ์์ํ๋ ๊ฒ์ ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ์๋ฏธํ๋ค.
import Footer from "./components/Footer/Footer";
import Login from "./pages/Login/Login";
import Signup from "./pages/Signup/Signup";
import Main from "./pages/Main/Main";
function Router() {
return (
<BrowserRouter>
<Nav />
<Routes>
<Route path="/" element={<Login />} />
<Route path="/signup" element={<Signup />} />
<Route path="/main" element={<Main />} />
//์์ ๋ด์ฉ์ Route๊ฐ ๋ฆฌํด์ด๋์ด ๋ธ๋ผ์ฐ์ ์์ ๋ณด์ด๊ฒ ๋๋ ๊ฒ์ ์๋ฏธํ๋ค.
</Routes>
<Footer />
</BrowserRouter>
);
}
export default Router;
3. react-router-dom์์ Routing์ ํ๋ ๋ฐฉ๋ฒ 2๊ฐ์ง์ ์ฐจ์ด์ ์ ๋ํด ์ค๋ช ํ ์ ์๋ค.
** <a> ํ๊ทธ ๋์ ์จ์ผํ ๊ฒ๋ค
- <Link> ์ปดํฌ๋ํธ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
- useNavigate ๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ
1. <Link> ์ปดํฌ๋ํธ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
import React from "react";
import { Link } from "react-router-dom";
function Login() {
return (
<div>
<Link to="/signup">ํ์๊ฐ์
</Link>
</div>
);
}
export default Login;
- <a> - ์ธ๋ถ ์ฌ์ดํธ๋ก ์ด๋ํ๋ ๊ฒฝ์ฐ
- <Link /> - ํ๋ก์ ํธ ๋ด์์ ํ์ด์ง ์ ํํ๋ ๊ฒฝ์ฐ
- ํด๋ฆญ ์ ๋ฐ๋ก ์ด๋ํ๋ ๋ก์ง ๊ตฌํ ์์ ์ฌ์ฉํฉ๋๋ค.
- ex. Nav Bar, Aside Menu, ์์ดํ ๋ฆฌ์คํธ ํ์ด์ง์์ ์์ดํ ํด๋ฆญ ์ > ์์ธ ํ์ด์ง๋ก ์ด๋
2. useNavigate ๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ
useNavigate๋ ํด๋น ์ปดํฌ๋ํธ์์ ๋ค๋น๊ฒ์ด์ (=๋ผ์ฐํ )์ ๋์์ฃผ๋ ํ๋์ ํ๋ก๊ทธ๋๋ฐ์ ์ธ ์ฅ์น์ด๋ค.
<button> ์์ onclick ์ ๋งตํ ์ํค๊ณ , onclick ์์ goToMain์ด๋ผ๋ ํจ์๊ฐ ์๊ณ ,
<button className="loginBtn" onClick={goToMain}>
goToMain์ด๋ผ๋ ํจ์ ์์ ์์ ์๋ navigate ํจ์๋ฅผ ์จ์ navigate("/main")์ผ๋ก ๋ผ์ฐํ ์ ์ํค๊ณ ์๋ค.
function Login() {
const navigate = useNavigate();
const goToMain = () => {
navigate("/main");
};
import React from "react";
import { useNavigate } from "react-router-dom";
function Login() {
const navigate = useNavigate();
const goToMain = () => {
navigate("/main");
};
// ์ค์ ํ์ฉ ์์
// const goToMain = () => {
// if(response.message === "valid user"){
// navigate('/main');
// } else {
// alert("๊ฐ์
๋ ํ์์ด ์๋๋๋ค. ํ์๊ฐ์
์ ๋จผ์ ํด์ฃผ์ธ์.")
// navigate('/signup');
// }
// }
return (
<div>
<button className="loginBtn" onClick={goToMain}>
๋ก๊ทธ์ธ
</button>
</div>
);
}
export default Login;
- ํ์ด์ง ์ ํ ์ ์ถ๊ฐ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ ๋ก์ง์ด ์๋ ๊ฒฝ์ฐ useNavigate ํ ์ ํ์ฉํ์ฌ ๊ตฌํํฉ๋๋ค.
- ex. ๋ก๊ทธ์ธ ๋ฒํผ ํด๋ฆญ ์
- Backend API๋ก ๋ฐ์ดํฐ(User Info) ์ ์ก
- User Data ์ธ์ฆ / ์ธ๊ฐ
- response message
- Case 1 : ํ์ ๊ฐ์ ๋์ด ์๋ ์ฌ์ฉ์ > Main ํ์ด์ง๋ก ์ด๋
- Case 2 : ํ์ ๊ฐ์ ์ด ๋์ด ์์ง ์์ ์ฌ์ฉ์ > Signup ํ์ด์ง๋ก ์ด๋
* ์ฐจ์ด์
<Link>๋ ํด๋ฆญํ๋ฉด ์ด๋ํ๋๊ฒ๋ง ๊ฐ๋ฅ.
useNavigate ์ navigate์ ํจ์ navigate("/main") ๋ ์ด๋์๋ ์ฐ์ผ ์ ์๋ค. (ํฌ๊ด์ ์ธ ํ๊ทธ์ ์ด๋ฒคํธ๋ฅผ ๊ฑธ ์ ์๋ค.)
ํจ์์ ์ผ๋ก, ํ๋ก๊ทธ๋๋ฐ ์ ์ผ๋ก ์ด๋์ ํ๋ ค๋ฉด useNavigate๋ฅผ ์ฐ๊ณ
๊ตฌ์กฐ์ ์ผ๋ก ํด๋ฆญํ์๋ ๋จ์ํ ์ด๋์ ์ํ๋ค๋ฉด Link ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
4. <Link> Component ์ <a> tag ์ ์ฐจ์ด์ ์ ๋ํด ์ค๋ช ํ ์ ์๋ค.
- <a> tag : ๋ฌธ์์ ๋ฌธ์๋ฅผ ์ฐ๊ฒฐํ ๋ ์ฌ์ฉ
ํ์ง๋ง, SPA๋ ๋ฌธ์์ ๋ฌธ์๋ฅผ ์ฐ๊ฒฐํ ํ์๊ฐ ์๋ค. SPA๋ ํ๋์ ํ์ด์ง ์์์ ๋ค๋ณด์ฌ์ฃผ๊ธฐ ๋๋ฌธ์!
๊ฒฐ๋ก ! SPA์ ๋ด๋ถํ์ด์ง์์๋ <a> tag๋ฅผ ์ฌ์ฉํ๋ฉด ์๋๋ค.
5. css ์ ์ฒ๋ฆฌ๊ธฐ์ ์ญํ ์ ๋ํด ์ค๋ช ํ ์ ์๋ค.
์ ์ฒ๋ฆฌ(Preprocessor) ??
: ๋ง๊ทธ๋๋ก ์ ์ ์ฒ๋ฆฌํด์ค๋ค๋ ๋ป!
์ต์ข ์ ์ผ๋ก css๊ฐ ๋์ค๊ฒ ํ๊ธฐ ์ํด, ๊ทธ ์ ์ ์ฒ๋ฆฌํ ์ ์๋๊ฒ ๋ค์ ์ ์ํด ๋๋ ๊ฒ!
6. sass์์ ์ ๊ณตํ๋ ๋ฌธ๋ฒ์ ์ด์ฉํ์ฌ cssํ์ผ์ scssํ์ผ๋ก ๋ณํํ ์ ์๋ค.
*sass ์ค์น :
npm install sass --save
- css ํ์ผ๋ช ์ .scss๋ก ๋ฐ๊พธ๊ธฐ!
- Nesting ๊ธฐ๋ฅ ์ ์ฉํ๊ธฐ
- ๋ณ์ ํ์ฉ, & ์ฐ์ฐ์, mixin ๋ฑ ๊ธฐ๋ณธ ๊ธฐ๋ฅ ์ ์ฉํ๊ธฐ