2021. 12. 19. 19:49ใWEB Dev/ToyProject
๐ท CloneTodo โ - Todomate Clone Project | Team CloneMate
CloneTodo : ๋ง์ ์ฌ๋๋ค์ด ์ฌ๋ํ๋ ํฌ๋๋ฉ์ดํธ๋ฅผ ํด๋ก ํ์ฌ ์น ์๋น์ค๋ฅผ ๋ฐฐํฌํด๋ณด๋ ํ๋ก์ ํธ
๊ทธ๋ผ ๊ณ์ ์งํํด๋ณด๊ธฐ!
์ค๋์ todo
โ ๊ฐ์ ํ๊ธฐ ์ปดํฌ๋ํธ
โก ๊ธฐ๋ณธ NavBar ์ปดํฌ๋ํธ
โก ๋ฉ์ธ NavBar ์ปดํฌ๋ํธ
โก ๋ฉ์ธ Feed ์ปดํฌ๋ํธ
โ ๊ฐ๋ฅํ๋ฉด ๊นํ ํธ์คํ ์ผ๋ก ๋ฐฐํฌ๊น์ง
2. ๊ธฐ๋ณธ NavBar ์ปดํฌ๋ํธ
NavBar๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์๋ก์ด MUI ์ปดํฌ๋ํธ๋ฅผ ์ฐพ์๋ณธ๋ค!
๊ธฐ๋ณธ NavBar๋ ๊ฐ ํ์ด์ง์ ์ ๋ชฉ์ด ํ์๋๊ณ , ๋ค๋ก๊ฐ๊ธฐ๊ฐ ์์ผ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ํน๋ณํ ๊ธฐ๋ฅ์ ํ์์์ง๋ง
๋ฉ์ธ NavBar์ ๊ฒฝ์ฐ ์ค๋ฅธ์ชฝ์ ํ์ ๋๋ ๋ฉ๋ด๊ฐ ๋ฑ์ฅํด์ผ ํ๋ค.
MUI์์ Bottom Navigation์ด๋ App Bar๊ฐ ์ ์ผ ๋น์ทํ๊ฑฐ ๊ฐ์๋ฐ
๊ธฐ๋ณธ NavBar ์ปดํฌ๋ํธ์๋ App Bar ๋ง, ๋ฉ์ธ NavBar์๋ App Bar์ Drawer์ ๊ฒฐํฉํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
App Bar ๋์์ธ ์ค์๋ Basic์ ๊ณจ๋๋๋ฐ ์๋์ ๊ฐ์ด ์๊ฒผ๋ค.
์ด ์ปดํฌ๋ํธ๋ ์์ฒญ๋๊ฒ ใ ใ ๋ง์ ํจํค์ง๋ฅผ import ํด์ผํ๋๋ฐ ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
import * as React from 'react';
import AppBar from '@mui/material/AppBar';
import Box from '@mui/material/Box';
import Toolbar from '@mui/material/Toolbar';
import Typography from '@mui/material/Typography';
import Button from '@mui/material/Button';
import IconButton from '@mui/material/IconButton';
import MenuIcon from '@mui/icons-material/Menu';
export default function ButtonAppBar() {
return (
<Box sx={{ flexGrow: 1 }}>
<AppBar position="static">
<Toolbar>
<IconButton
size="large"
edge="start"
color="inherit"
aria-label="menu"
sx={{ mr: 2 }}
>
<MenuIcon />
</IconButton>
<Typography variant="h6" component="div" sx={{ flexGrow: 1 }}>
News
</Typography>
<Button color="inherit">Login</Button>
</Toolbar>
</AppBar>
</Box>
);
}
์ด ์ฝ๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด BasicNavBar.js ๋ผ๋ ์ปดํฌ๋ํธ๋ฅผ ํ๋ ๋ง๋ค์ด ์์ ์ฝ๋๋ฅผ ๊ทธ๋๋ก ๋ณต์ฌ ๋ถ์ฌ๋ฃ๊ธฐ ํด์ค๋ค.
ButtonAppBar๋ผ๊ณ ์ง์ ๋ ํจ์๋ช ์ BasicNavBar๋ก ๋ฐ๊ฟ์ฃผ๊ณ ํ์ด์ง ์๋จ์ ๋ค์ด๊ฐ๊ฑฐ๊ธฐ ๋๋ฌธ์ BasicNavBar๋ฅผ App.js์ ์๋จ์ ๋ฃ์ด์ค๋ค.
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";
import Join from "./Join";
import BasicNavBar from "./BasicNavBar";
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}>
<BasicNavBar/>
<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"
color="btn"
variant="contained"
onClick={() => {
history.push("/join");
}}
>
๊ฐ์
ํ๊ธฐ
</Button>
<Button
className="signin_btn"
color="btn"
variant="contained"
onClick={() => {
history.push("/signin");
}}
>
๋ก๊ทธ์ธ
</Button>
</div>
</div>
</Route>
<Route exact path="/join">
<Join />
</Route>
<Route exact path="/signin">
<Signin />
</Route>
</Switch>
</ThemeProvider>
);
}
export default App;
์ด๋ ๊ฒ ํ๋ฉด import ๋ ๋์๋๋ฐ, BasicNavBar์ ๊ด๋ จ๋ ์๋ฌ ๋ฉ์์ง๊ฐ ๋ฌ๋ค.
์๋ฌ ๋ฉ์์ง๋ ./src/components/BasicNavBar.js Module not found: Can't resolve '@mui/icons-material/Menu' in ...
์ด๊ฑฐ๋ @mui/icons-material/Menu ์ ๊ฐ์ ์์ด์ฝ ํจํค์ง๋ค์ด npm ์ ํตํด ์ค์น๋์ง ์์์ ๊ทธ๋ด ์ ์๋ค.
npm i @material-ui/core
npm i @material-ui/icons
์์ ๊ฐ์ ๋ช ๋ น์ด๋ค์ ํตํด ํจํค์ง๋ฅผ ์ค์นํด์ค๋ค.
๊ทธ๋ฆฌ๊ณ ์ค์นํ์ผ๋ ์ฌ์ ํ ๋๊ฐ์ ์ํฉ์ธ ๊ฒฝ์ฐ, ํด๋น ์์ด์ฝ์ด ์ง๊ธ MUI์ ๋ฒ์ ๊ณผ ๋ง์ง ์์์ ๊ทธ๋ด ์ ์๋ค.
(MUI์ ๋ฒ์ ์ v4์ด๋ ์์ด์ฝ์ v5์ธ ๊ฒฝ์ฐ)
๊ทธ๋ผ ๊ทธ ์์ด์ฝ์ ์ด์ ๋ฒ์ ์์ ์ฐพ์์ ๋์ฒดํด์ผ ํ๋ค!
๋์ ๊ฒฝ์ฐ MenuIcon ์ปดํฌ๋ํธ๋ฅผ ์ญ์ ํ๋ ์ ์์ ์ผ๋ก ์๋ํ๋ค.
๊ทธ๋์ MenuIcon ๋์ ์๋์ DehazeIcon์ผ๋ก ๋ณ๊ฒฝํ๋ค.
import DehazeIcon from '@material-ui/icons/Dehaze';
โป MUI v4 ๋ฒ์ Meterial-ui icons
๊ทธ๋ฌ๋ฉด ์ด๋ ๊ฒ ์์ Navbar ์์ฑ๐
ํ์ํ ๊ฒ๋ค์ ๋จ๊ธฐ๊ณ ์ข์ธก์ < ์ ๊ฐ์ ๋ค๋ก๊ฐ๊ธฐ ์์ด์ฝ์ ๋ฃ๋ ๋ฑ ์์๊ณผ ๋ชจ์ ์ปค์คํ ์ ์งํํ๋ค.
import React from 'react';
import AppBar from '@mui/material/AppBar';
import Box from '@mui/material/Box';
import Toolbar from '@mui/material/Toolbar';
import Typography from '@mui/material/Typography';
import IconButton from '@mui/material/IconButton';
import NavigateBeforeIcon from '@material-ui/icons/NavigateBefore';
export default function BasicNavBar () {
return (
<Box sx={{ flexGrow: 1 }}>
<AppBar position="static" color="nav" sx={{ boxShadow:"none" }}>
<Toolbar>
<IconButton
size="large"
edge="start"
color="inherit"
aria-label="back"
sx={{ mr: 2 }}
>
<NavigateBeforeIcon />
</IconButton>
<Typography className="navbar_title" variant="h6" component="div" color="inherit" fontSize={16} fontWeight={600} sx={{ margin: "auto", transform: "translateX(-50%)" }}>
์ ๋ชฉ
</Typography>
</Toolbar>
</AppBar>
</Box>
);
}
BasicNavBar ์ปดํฌ๋ํธ์ CSS๋ props์ ๋ฃ์ด์ ๋ง๋ค์ด๋ดค๋ค. color๋ App.js ์ ThemeProvider์ palette์ nav ๋ผ๋ ์์๊ฐ์ ์คฌ๊ณ (์ฌ์ค ํฐ์์ด๋ฉด์), sx ๋ผ๋ props์์ ๋๋ถ๋ถ์ CSS๋ฅผ ์๋ณผ ์ ์์๋ค.
๊ธฐ์กด AppBar ์ปดํฌ๋ํธ์ ์๋ ๋ฐฐ๊ฒฝ์ ๊ฐ๊ณผ ๊ทธ๋ฆผ์, ํฐํธ ์ฌ์ด์ฆ ๋ฑ์ ์์ ํ๊ณ margin auto๋ฅผ ์ด์ฉํด ๊ธ์๊ฐ ๊ฐ์ด๋ฐ๋ก ์ค๋๋ก ํ ๋ค ์ฝ๊ฐ ์น์ฐ์น ๊ฒ์ transform์ผ๋ก ์์ ํ๋ ๊ณ ์ ์ ์ธ CSS ์์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
๊ฒฐ๊ณผ๋ฌผ์ ์๋์ ๊ฐ๋ค.
'WEB Dev > ToyProject' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ToyProject-Todomate] ํฌ๋๋ฉ์ดํธ ํด๋ก ํ๋ก์ ํธ 14 (0) | 2021.12.21 |
---|---|
[ToyProject-Todomate] ํฌ๋๋ฉ์ดํธ ํด๋ก ํ๋ก์ ํธ 13 (0) | 2021.12.19 |
[ToyProject-Todomate] ํฌ๋๋ฉ์ดํธ ํด๋ก ํ๋ก์ ํธ 11 (0) | 2021.12.19 |
[ToyProject-Todomate] ํฌ๋๋ฉ์ดํธ ํด๋ก ํ๋ก์ ํธ 10 (0) | 2021.12.15 |
[ToyProject-Todomate] ํฌ๋๋ฉ์ดํธ ํด๋ก ํ๋ก์ ํธ 09 (0) | 2021.12.14 |