2021. 12. 14. 00:13ใWEB Dev/ToyProject
๐ท CloneTodo โ - Todomate Clone Project | Team CloneMate
CloneTodo : ๋ง์ ์ฌ๋๋ค์ด ์ฌ๋ํ๋ ํฌ๋๋ฉ์ดํธ๋ฅผ ํด๋ก ํ์ฌ ์น ์๋น์ค๋ฅผ ๋ฐฐํฌํด๋ณด๋ ํ๋ก์ ํธ
์ด์ ์ ์ค๋ฅ๋ useHistory์ ๋ฒ์ ๋ฌธ์ ๋ผ๊ณ ํด์ npm uninstall --save ๋ฅผ ์ด์ฉํด ํจํค์ง๋ฅผ ์ญ์ ํ๊ณ ๋ค์ด๊ทธ๋ ์ด๋๋ฅผ ํ๋ ค๊ณ ํ๋ค.
npm uninstall --save history@5 react-router-dom@6
์์ ๋ช ๋ น์ด๋ก ์ค์นํ ๊ฒ์ ์ญ์ ํ๊ณ , ๋ค์ react-router-dom ์ ์ค์นํ๋ค.
npm install react-router-dom@5
๊ทธ๋ฆฌ๊ณ index.js ํ์ผ์ App ์ปดํฌ๋ํธ๋ฅผ <BrowserRouter> </BrowserRouter>๋ก ๊ฐ์ธ์ค๋ค.
(โ Strict๋ชจ๋ ์ปดํฌ๋ํธ๋ ์ญ์ ํ์ด์!)
ReactDOM.render(
<BrowserRouter>
<App />
</BrowserRouter>,
document.getElementById('root')
);
๊ทธ ๋ค์ App.js์ ์ฌ๋ฌ๊ฐ์ง ํจํค์ง๋ค์ import ํด์จ๋ค.
์ฐ์ ์ด๋ ๊ฒ ์ธ ๊ฐ์ง๋ฅผ import ํ๋ค.
import { Link, Route, Switch } from 'react-router-dom';
๊ทธ ๋ค์์ ํ์ด์ง๊ฐ ๋ฐ๋์ด์ผ ํ ๊ณณ์ Route ์ปดํฌ๋ํธ๋ฅผ ๋ฃ์ด์ค๋ค.
๋์ ๊ฒฝ์ฐ์๋ ํ๋ฉด์ ์ผ๋ถ๊ฐ ์๋ ์ ์ฒด๊ฐ ์๋ก์ด ํ๋ฉด์ผ๋ก ๊ต์ฒด๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ return ๋ค์ ThemeProvider ์ปดํฌ๋ํธ์ ๋ค์์ Route ์ปดํฌ๋ํธ๋ฅผ ๋ฃ์ด์คฌ๋ค.
Route ์ ์ฒซ๋ฒ์งธ๋ /๋ก App ์ปดํฌ๋ํธ๊ฐ ๋ค์ด๊ฐ ์ ์๋๋ก
<Route exact path="/">
<div className="App">
<div className="header">
<img className="main_img" src="images/todomate.jpg" />
<h1>todo mate</h1>
<h3>ํ ์ผ์ ์์ฑ, ๊ณํ, ๊ด๋ฆฌํ์ธ์.</h3>
</div>
<div className="start_btn">
<Button className="join_btn" variant="contained" color="btn">
๊ฐ์
ํ๊ธฐ
</Button>
<Button className="signin_btn" color="btn" variant="contained">
๋ก๊ทธ์ธ
</Button>
</div>
</div>
</Route>
์์ ๊ฐ์ด ์ฝ๋๋ฅผ ์ง ์ฃผ๊ณ ,
/signin path์๋ Signin ์ปดํฌ๋ํธ๋ฅผ ๋ฃ์ด์ค๋ค.
<Route exact path="/signin">
<Signin />
</Route>
์ด๋ ๊ฒ ํ๋ฉด ๋ก์ปฌ ์ฃผ์ /signin์ ํ์ ๋ ์ ๋ฒ์ Signin ์ปดํฌ๋ํธ์ ๋ฃ์ด๋ MUI FormControl ์ปดํฌ๋ํธ๊ฐ ๋ํ๋๋ค.
๊ทธ๋ผ ๋ก๊ทธ์ธ ๋ฒํผ์ ํด๋ฆญํ์ ๋ /signin์ผ๋ก ๋์ด๊ฐ๊ฒ ํ๋ ค๋ฉด?
์ด์ useHistory๋ฅผ ์จ๋ณด์!
App.js ํ์ผ์ useHistory๋ฅผ import ํ๋ค.
import { useHistory } from 'react-router-dom';
// ์ด๋ฏธ react-router-dom์ ์ด์ฉํด์ Route๋ฅผ import ํ๊ณ ์์ด์ ์๋์ ๊ฐ์ด ํ ์ ์๋ค.
// import { Route, useHistory } from "react-router-dom";
๊ทธ๋ฆฌ๊ณ App( ) ํจ์ ์์ let history = useHistory();๋ฅผ ๋ฃ์ด hook ์ฒ๋ผ useHistory()๋ฅผ ์ฌ์ฉํ๋ค.
Button ์ปดํฌ๋ํธ ์ค ๋ก๊ทธ์ธ ๋ฒํผ์ onClick์ ์ฌ์ฉํ๋๋ฐ, ๋ด๋ถ์ ์ฝ๋ฐฑํจ์๋ฅผ ์ ์ธํ๊ณ history ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ค.
<Button className="signin_btn" color="btn" variant="contained" onClick={()=>{ history.push('/signin') }}>
๋ผ์ฐํฐ ์์ฑ~!
์ธ์ค ์์์ง๋ง "/signin"์ผ๋ก ์ ์ํ๋ฉด "/" ํ์ด์ง ํ๋จ์ ํ์๋๊ณ ์๊ธฐ ๋๋ฌธ์ Switch ๋ฌธ๋ฒ์ ํตํด ํด๋น ํ๋ฉด๋ง ํ์๋๋๋ก ๋ง๋ค์ด ์ค๋ค.
Route ์ปดํฌ๋ํธ ๋ฐ์ <Switch></Switch> ๋ก ๊ฐ์ธ์ฃผ๋ฉด ๋๋ค.
์ต์ข ์ฝ๋๋ ์ด๋ ๋ค.
import React from "react";
import "../stylesheets/App.css";
import { Button } from "@mui/material";
import { ThemeProvider, createTheme } from "@mui/material/styles";
import { Switch, Route, useHistory } from "react-router-dom";
import Signin from "./Signin";
const theme = createTheme({
status: {
danger: "#e53e3e",
},
palette: {
primary: {
main: "#0971f1",
darker: "#053e85",
},
neutral: {
main: "#64748B",
contrastText: "#fff",
},
btn: {
main: "#f2f2f2",
contrastText: "#111",
},
},
});
function App() {
let history = useHistory();
return (
<ThemeProvider theme={theme}>
<Switch>
<Route exact path="/">
<div className="App">
<div className="header">
<img className="main_img" src="images/todomate.jpg" />
<h1>todo mate</h1>
<h3>ํ ์ผ์ ์์ฑ, ๊ณํ, ๊ด๋ฆฌํ์ธ์.</h3>
</div>
<div className="start_btn">
<Button className="join_btn" variant="contained" color="btn">
๊ฐ์
ํ๊ธฐ
</Button>
<Button
className="signin_btn"
color="btn"
variant="contained"
onClick={() => {
history.push("/signin");
}}
>
๋ก๊ทธ์ธ
</Button>
</div>
</div>
</Route>
<Route exact path="/signin">
<Signin />
</Route>
</Switch>
</ThemeProvider>
);
}
export default App;
'WEB Dev > ToyProject' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ToyProject-Todomate] ํฌ๋๋ฉ์ดํธ ํด๋ก ํ๋ก์ ํธ 11 (0) | 2021.12.19 |
---|---|
[ToyProject-Todomate] ํฌ๋๋ฉ์ดํธ ํด๋ก ํ๋ก์ ํธ 10 (0) | 2021.12.15 |
[ToyProject-Todomate] ํฌ๋๋ฉ์ดํธ ํด๋ก ํ๋ก์ ํธ 08 (0) | 2021.12.13 |
[ToyProject-Todomate] ํฌ๋๋ฉ์ดํธ ํด๋ก ํ๋ก์ ํธ 07 (0) | 2021.12.10 |
[ToyProject-Todomate] ํฌ๋๋ฉ์ดํธ ํด๋ก ํ๋ก์ ํธ 06 (1) | 2021.12.09 |