November 26, 2020
ํํ์ ์์ง ๋น๋๊ธฐ ์์ด์ฝ์ ๋ฃ์ด์ฃผ์์ผ๋ ๊ทธ ๋ค์์ ํ๋ฒ๊ฑฐ ์์ด์ฝ์ ๋ฃ์๋ค.
์ ๊ทธ๋ฐ๊ฑฐ ์์ง ์๋. ๋๋ฅด๋ฉด ๋ฉ๋ดํ ๋ง๋ฅ ์ดค๋ฝ~ ํผ์ณ์ง๋ ๊ฑฐ
์ ํ๋ฒ๊ฑฐ ๋จน๊ณ ์ถ๋ค..
์ฌํผ Navbar 1ํธ์ ์ด์ด์..
https://dev-seolleung2.netlify.app/development/Self-intro-app-1/
๋ด ๋ฉ๋ดํ์ ๋ณด์ฌ์ค ํ๋ฒ๊ฑฐ๋ฅผ ์ผํญ ์ฐ์ฐ์๋ฅผ ํตํด ๋ฃ์๋ค.
<div className="menu-icon">
<i className={click ? 'fas fa-times' : 'fas fa-bars'} />
</div>
click ์ด true ์ด๋ฉด, โfas fa-timesโ ์ฆ X ์์ด์ฝ์ ๋ณด์ฌ์ฃผ๊ณ ,
์๋๋ฉด (ํด๋ฆญ ์ํ์ ๋) ํ๋ฒ๊ฑฐ ์์ด์ฝ์ ๋ณด์ฌ์ฃผ๊ฒ ๋จ ๊ฑฐ๋ค.
๊ทธ๋ฌ๋ฉด ํด๋ฆญ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํด์ผ ํ๋๋ฐ ํด์ ์ฌ๊ธฐ์ onClick ์ด๋ฒคํธ๋ฅผ ๊ฑธ์ด์ฃผ๋ ๊ฑฐ๋ค.
<div className="menu-icon" onClick={handleClick}>
<i className={click ? 'fas fa-times' : 'fas fa-bars'} />
</div>
๊ทธ๋ฆฌ๊ณ handleClick ์ ์ ์ธํด ์ค๋ค,.
const handleClick = () => setClick(!click)
handleClick ์ ํตํด์ click ์ state ๋ฅผ ๋ฐ๊ฟ ์ค ์ ์๋ setClick ํจ์๊ฐ ๋ฐ๋ํ๋ค.
click ์ default state ๋ false ๋ก ์ค์ ํ์์ผ๋๊น !click ์ ํตํด ์ด์ click ์ ์ํ๋ฅผ true ๋ก ๋ฐ๊พธ๊ฒ ๋จ ๊ฑฐ๋ค!
์ฆ ํด๋ฆญ์ ํ์ด? ๊ทธ๋ผ ๋ X ํ ๋ณด์ฌ์ค๊บผ์.
ํฌ.. ์ด์ ํ๋ฒ๊ทธ ์์ด์ฝ๋ ๋ง๋ค๊ณ , onClick ์ด๋ฒคํธ๋ก ์์ด์ฝ์ด ๋ฐ๋์ด์ง๊ฒ๋ ํด์คฌ๋ค!
์ผ๋จ ์ ์ฒด ์ฝ๋๋ฅผ ๋ฃ์ด ๋ณด์.
import React, { useState } from 'react'
import { Link } from 'react-router-dom'
function Navbar() {
const [click, setClick] = useState(false)
const handleClick = () => setClick(!click)
const closeMobileMenu = () => setClick(false)
return (
<>
<nav className="navbar">
<div className="navbar-container">
<Link to="/" className="navbar-logo">
Dev.SL2 <i className="fas fa-dove" />
</Link>
<div className="menu-icon" onClick={handleClick}>
<i className={click ? 'fas fa-times' : 'fas fa-bars'} />
</div>
<ul className={click ? 'nav-menu active' : 'nav-menu'}>
<li className="nav-item">
<Link to="/" className="nav-links" onClick={closeMobileMenu}>
Home
</Link>
</li>
</ul>
</div>
</nav>
</>
)
}
๊ธฐ์กด ์ฝ๋์์ ์ถ๊ฐ ๋ ๊ฒ์ ๋ฐ๋ก ul ํ๊ทธ ์ด๋ค.
ul ์๋ click ์ state ๊ฐ true ์ผ ๋ โnav-menu activeโ ๋ก className ์ด ๋ฐ๋๊ฒ ํด ์ฃผ์๋ค.
์ด๊ฑด ๋์ค์ css ์ฒ๋ฆฌ๋ฅผ ํด์ค ๊ฒ์ด๋ค.
<ul className={click ? 'nav-menu active' : 'nav-menu'}>
<li className="nav-item">
<Link to="/" className="nav-links" onClick={closeMobileMenu}>
Home
</Link>
</li>
</ul>
li ํ๊ทธ ๋ด์ Link ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฌ์ค๊ณ onClick ์ด๋ฒคํธ๋ก closeMobileMenu ํจ์๋ฅผ ๊ฑธ์ด ์ฃผ์๋ค.
๋ณ์๋ช ์ ๋ช ๊ธฐ ํ ๋ ์๋ฏธ๊ฐ ์ถฉ๋ถํ ์ ๋ฌ๋๋ ์ด๋ฆ์ ์ง์ด์ผ ํ๋ค๋ ๊ฑธ ๊นจ๋ซ๊ณ ์๋ค.
์ด์ closeMobileMenu ํจ์๋ฅผ ๋ง๋ค์ด์ผ์ง!
const closeMobileMenu = () => setClick(false)
closeMobileMenu ํจ์๋ click ์ status ๋ฅผ false ๋ก ๋ง๋ ๋ค.
click ์ status ๊ฐ false ๋ก ๋ฐ๋๋ฉด, ul ์ ๊ฑธ์ ์ผํญ ์ฐ์ฐ์์ ์ํด์ className ์ด โnav-menuโ ์ธ ์ํ๋ฅผ ๋ณด์ฌ์ค ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ํ๊ณ ํ๋ฉด์ ๋ณด๋ฉด ์ค๋ฅ ๋ฉ์์ง๋ฅผ ํ์ธํ ์ ์๋ค.
์ด ๋ถ๋ถ์ ๋ด์ผ ์์ ์ ์ฐพ์๋ด์ผ ํ๋ ๋ถ๋ถ์ด๋ค.
import React from 'react'
import Navbar from './components/Navbar'
import { BrowserRouter as Router, Switch, Route } from 'react-router-dom'
import './App.css'
function App() {
return (
<>
<Router>
<Navbar />
<Switch>
<Route path="/" exact />
</Switch>
</Router>
</>
)
}
export default App
๋ญ๊ฐ ํต๋ฐ ๋๋ ค ๋ง์ถ๊ธฐ(?) ๋ก ์๊ฐํด ๋ณด๋ฉด,
์ ๊ฒ๋ค์ ๋ถ๋ฌ ์์ผ route ๊ฒฝ๋ก๋ฅผ โreact-router-domโ ์์ ๋ถ๋ฌ์จ ์ปดํฌ๋ํธ์ ํฉ์? ์ด๋ฃจ๋ ๊ฑฐ ๊ฐ๋ค.
์ผ๋จ ๋ฐ์๋ค์ด์.
์ด์ li ๋ชฉ๋ก์ ๋ ๋ฃ์ด ์ฃผ์๋ค. ์ด 4๊ฐ!
import React, { useState } from 'react'
import { Link } from 'react-router-dom'
function Navbar() {
const [click, setClick] = useState(false)
const handleClick = () => setClick(!click)
const closeMobileMenu = () => setClick(false)
return (
<>
<nav className="navbar">
<div className="navbar-container">
<Link to="/" className="navbar-logo">
Dev.SL2 <i className="fas fa-dove" />
</Link>
<div className="menu-icon" onClick={handleClick}>
<i className={click ? 'fas fa-times' : 'fas fa-bars'} />
</div>
<ul className={click ? 'nav-menu active' : 'nav-menu'}>
<li className="nav-item">
<Link to="/" className="nav-links" onClick={closeMobileMenu}>
Home
</Link>
</li>
<li className="nav-item">
<Link
to="/services"
className="nav-links"
onClick={closeMobileMenu}
>
Introduction
</Link>
</li>
<li className="nav-item">
<Link
to="/products"
className="nav-links"
onClick={closeMobileMenu}
>
Skills
</Link>
</li>
<li className="nav-item">
<Link
to="/sign-up"
className="nav-links-mobile"
onClick={closeMobileMenu}
>
Sign-up
</Link>
</li>
</ul>
</div>
</nav>
</>
)
}
export default Navbar