@media
공부한 후 복습 styled components로 선언한 컴포넌트 안에 태블릿 가로 사이즈(768x)이하의 화면에서는 nav-menu들이 column방향으로 정렬되도록 하고, 숨겨놨던 토글 버튼이 나타나도록 했다.
const StyledHeader = styled.header`
/* 생략 */
.menuToggleBtn {
display: none;
/* 생략 */
}
@media screen and (max-width: 768px) {
flex-direction: column;
align-items: flex-start;
.menuToggleBtn {
display: block;
}
}
`;
토글 버튼을 열고 닫고 하기 위해서 이 상태를 관리할 수 있는 isToggleOpen
state를 만들어주고, false로 초기화한다. 이 state를 NavMenu 컴포넌트(ul 태그)에 props로 내려준다. 그 다음 토글 버튼에 click이벤트가 발생하면 호출할 함수를 전달하고, 여기서 isToggleOpen
상태를 변화시키는 함수를 호출한다.
const Header = () => {
const [isToggleOpen, setIsToggleOpen] = useState(false);
const handleToggleOpen = () => {
setIsToggleOpen(!isToggleOpen);
};
return (
<>
<StyledHeader>
<div className="nav_logo">
<Link to={"/"} className="nav-logo-link">
Logo
</Link>
</div>
<NavManu isToggleOpen={isToggleOpen}>
{/* 생략 */}
</NavManu>
<FaBars className="menuToggleBtn" onClick={handleToggleOpen} />
</StyledHeader>
</>
);
};
export default Header;
NavMenu 컴포넌트가 props로 내려받은 isToggleOpen이 true일때는 메뉴를 display:block 으로, false일때는 display: none으로 적용한다.
const NavManu = styled.ul`
/*생략 */
@media screen and (max-width: 768px) {
display: ${(props) => (props.isToggleOpen ? "block" : "none")};
flex-direction: column;
align-items: center;
width: 100%;
}
`;
헤더(+네비게이션바)만 간단하게 만들어보려고 했는데 Router로 페이지 이동까지 넣으면 더 좋을 것 같아서 페이지를 여러개 만들었다.
라우터 컴포넌트들을 import 해주고, App.js에 page들도 모두 import 해준다. 라우터 역할을 하는 BrowserRouter
로 전체 div를 감싸주고 Route
컴포넌트로 경로와 element를 연결해준다.
BrowserRouter
router(라우터 역할)Routes
Route
route mathers(경로 매칭 역할)Link
route changers(경로 변경 역할)
import { BrowserRouter, Routes, Route } from "react-router-dom";
import "./styles.css";
import Header from "./components/Header";
import Home from "./pages/Home";
import About from "./pages/About";
import Projects from "./pages/Projects";
import Til from "./pages/Til";
import Diary from "./pages/Diary";
export default function App() {
return (
<BrowserRouter>
<div className="App">
<Header />
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
<Route path="/projects" element={<Projects />} />
<Route path="/Til" element={<Til />} />
<Route path="/diary" element={<Diary />} />
</Routes>
</div>
</BrowserRouter>
);
}
Header.js에서 Link 컴포넌트를 임포트 하고import { Link } from "react-router-dom";
NavMenu들이 각각 해당 경로로 이동할 수 있도록 연결해준다.
{/* 생략 */}
<NavManu isToggleOpen={isToggleOpen}>
<li>
<Link to={"/about"} className="nav-menu-list">
About
</Link>
</li>
<li>
<Link to={"/projects"} className="nav-menu-list">
Projects
</Link>
</li>
<li>
<Link to={"/til"} className="nav-menu-list">
TIL
</Link>
</li>
<li>
<Link to={"/diary"} className="nav-menu-list">
Diary
</Link>
</li>
</NavManu>
{/* 생략 */}
참고 많이 되었습니다 !!