๐Ÿš€SPA Webpage ๋งŒ๋“ค์–ด๋ณด๊ธฐ Part 1. Navbar

๐Ÿ‘ฉ๐Ÿปโ€๐ŸฆณGET, SET, Readyโ€ฆ GO!

React Hooks ์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•ด ๋ณด๋ฉด์„œ ๋ณต์Šต๊ฒธ ๋‚˜์˜ ์ปจํ…์ธ ๋ฅผ ํŒ” ์ˆ˜ ์žˆ๋Š”? SPA page ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๋ ค ํ•œ๋‹ค.

์œ ํŠœ๋ธŒ์— ๋‚˜์˜ค๋Š” ์™ธ๊ตญ ๋ถ„์˜ ๋ชฉ์†Œ๋ฆฌ๊ฐ€ ์ข‹์•„์„œ ์˜์ƒ์„ ๋ณด๋ฉด์„œ ์กฐ๊ธˆ์”ฉ ๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋ฉฐ ์ž…๋ง›์— ๋งž๊ฒŒ ๋ณ€ํ˜•์‹œํ‚ค๊ณ  ์ง„ํ™” ์‹œํ‚ฌ ๊ฑฐ๋‹ค.

๊ทธ ์ค‘ ์˜ค๋Š˜์€ ํ›…์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ํ•ด๋ณด๊ณ ์ž react ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•ด ๋ณด์•˜๋‹ค.

๊ทผ๋ฐ ๋จผ์ € ๋ฌธ์„œ๋ฅผ ๋ณธ ๊ฒƒ์€ ์•„๋‹ˆ๊ณ .. ์ผ๋‹จ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด์„œ ๋”ฐ๋ผ ํ•ด ๋ณธ ํ›„์—,

๊ทธ ๋‹ค์Œ์— ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ๋ณด๋‹ˆ๊นŒ (๋ฌด์กฐ๊ฑด๋ด์•ผ๋จ)

https://ko.reactjs.org/docs/hooks-state.html

์•„์•„์ฃผ ๋Š๋‚Œ์ด ๊ตฟ๊ตฟ์ด๋‹ค. ์ด๋Ÿฐ ๋‚ฉ๋“ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑฐ ๋„ˆ๋ฌด ์ข‹๋‹ค.

์˜ค๋Š˜์€ ํŽ˜์ด์ง€์˜ navigation bar ๋ถ€๋ถ„์„ ๋งŒ๋“ค์–ด ๋ณด์•˜๋‹ค.

๊ฐ€์ฆˆ์•„!!

๐Ÿฅณ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™” ๋ฐ ๊ตฌ์กฐ ์„ค์ •ํ•˜๊ธฐ

1. npx create-react-app self-intro-spa

2. npm start ๋กœ ์„œ๋ฒ„๊ฐ€ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ ํ™•์ธ.

3. ํŒŒ์ผ ์ œ๊ฑฐ ๋ฐ component ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑํ•˜๊ธฐ

src/ ๋‚ด์— ํ”„๋กœ์ ํŠธ ํŒŒ์ผ๋“ค์ด ์œ„์น˜ํ•˜๊ณ  ์žˆ๋‹ค.

src / App.js
src / App.css
src / App.test.js
src / logo.svg

๋ช‡๊ฐœ ๋” ์žˆ๊ธด ํ–ˆ๋Š”๋ฐ ์•„๋ฌดํŠผ ํ•„์š”์—†๋Š” ๊ฑฐ ์‹ธ๊ทธ๋ฆฌ ์‹น ์ง€์šด๋‹ค.

App.css ๋‚ด ์ฝ”๋“œ๋„ ์‹น ๋‹ค ์ง€์šด๋‹ค.

๊ทธ๋ฆฌ๊ณ  src/components ์ปดํฌ๋„ŒํŠธ๋“ค์ด ์œ„์น˜ํ•˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ (components) ๋ฅผ ๋งŒ๋“ค์–ด ์ค€๋‹ค.

4. component ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์— Navbar.js, Navbar.css ํŒŒ์ผ ์ƒ์„ฑํ•˜๊ธฐ

์˜ค๋Š˜์˜ ๋ฏธ์…˜์€ ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฑฐ๋‹ˆ๊นŒ ํŒŒ์ผ๋“ค์„ ์ƒ์„ฑํ•ด ์ค€๋‹ค.

5. react-router-dom ์„ค์น˜ํ•˜๊ธฐ

๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ๋ฅผ ์„ค์น˜ํ•œ๋‹ค.

์—”๋“œํฌ์ธํŠธ์˜ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฑด๊ฐ€ ๋ณด๋‹ค.

npm install react-router-dom

๊ทธ๋ ‡๊ฒŒ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ์ค€๋น„๋ฅผ ๋งˆ์ณค๋‹ค!

directory tree

๐ŸŒˆindex.js ํŒŒ์ผ์˜ ์—ญํ• 

import React from 'react'
import ReactDOM from 'react-dom'
import App from './App'

ReactDOM.render(<App />, document.getElementById('root'))

๋ธŒ๋ผ์šฐ ์ €์— App component ๋ฅผ ๋ Œ๋” ํ•˜๋Š” ์—ญํ• ์„ ๋งก๊ณ  ์žˆ์œผ๋ฉฐ ๋ฐ”๋กœ ์ด index.js ๊ฐ€ npm start ๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ ์ฝ์–ด๋“ค์ด๋Š” ํŒŒ์ผ์ด๋‹ค.

๐ŸŒˆApp.js ํŒŒ์ผ์˜ ์—ญํ•  ๋ฐ ์ฝ”๋“œ ์ž‘์„ฑ

index.js ๊ฐ€ ์‹คํ–‰์„ ๋‹ด๋‹นํ•œ๋‹ค ๋ผ๋ฉด App.js ๋Š” ์ „์ฒด ์•ฑ์˜ ์‹ฌ์žฅ๋ถ€ ์—ญํ• ์„ ํ•˜๋Š” ๋Š๋‚Œ์ด๋ผ ํ•ด์•ผ ๋ ๊นŒ?

import React from 'react'
import Navbar from './components/Navbar'
import './App.css'

function App() {
  return (
    <>
      <Navbar />
    </>
  )
}

export default App

๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์‹ธ๊ทธ๋ฆฌ ๊ฐˆ์•„ ์—Ž๊ณ , ๋ฏธ๋ฆฌ ์„ ๋นต(?) ์œผ๋กœ Navbar ๋ฅผ import ํ•ด์˜จ๋‹ค.

๋งŒ๋“ค๋ฉด ๋˜์ง€ ๋จธ!

return (
  <>
    <Navbar />
  </>
)

๋ฉ๊ทธ๋Ÿฌ๋‹ˆ Navbar ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•˜๋‚˜ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๊ผญ ๊ตณ์ด div ๋กœ ๊ฐ์‹ธ์ง€ ์•Š๊ณ  <> ๋กœ ๊ฐ์Œ€ ์ˆ˜๋„ ์žˆ๋‹จ ๊ฑฐ๋ฅผ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

๐Ÿงšโ€โ™€๏ธNavbar.js ๋งŒ๋“ค๊ธฐ

rafc ํ‚ค์›Œ๋“œ ์™€ ์ด๊ฑฐ ๋ฌผ๊ฑด์ด๋‹ค. rafc ์น˜๊ณ  ์—”ํ„ฐ ์น˜๋‹ˆ๊นŒ ์ž๋™์œผ๋กœ..

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ์ฝ”๋“œ๊ฐ€ ๋˜ฌ์•… ๋งŒ๋“ค์–ด ์ ธ ๋ฒ„๋ฆฐ๋“œ์•„..

๐Ÿฆน๐Ÿผโ€โ™‚๏ธNav ๋ฐ”์— ๋„ฃ์„ ์•„์ด์ฝ˜? FontAwesome ์ด ์žˆ์ง€!

์˜ˆ์ „์— ๊ฐ€์ž…ํ•œ ๊ฑฐ ๊ฐ™์€๋ฐ ์•ˆ๋˜์–ด ์žˆ๊ธธ๋ž˜ ๊ฐ€์„œ ๊ฐ€์ž…ํ•˜๊ณ  ์ œ๊ณตํ•ด ์ฃผ๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค.

Add Your Kit's Code to a Project
<script src="https://kit.fontawesome.com/12345678.js" crossorigin="anonymous"></script>

์ด๊ฑฐ๋ฅผ public/index.html ์˜ head ๋‚ด์— ์‚ฝ์ž…ํ•ด ์ฃผ๋ฉด ์ด์ œ ํฐํŠธ ์–ด์ธ ์„ ์“ธ ์ˆ˜๊ฐ€ ์žˆ๋‹ค!

์ด์ œ ๋กœ๊ณ ๋ฅผ ๋„ฃ์œผ๋Ÿฌ ๊ฐ€์ž.

hook ์ด ๋ญ์—ฌ.. ํ•˜๋ฉด์„œ ์–ด๋ฆฌ๋‘ฅ์ ˆ ํ–ˆ์—ˆ๋Š”๋ฐ ์•„.. ์ด๊ฒƒ๋„ ๋˜ํ•œ ๋ฌผ๊ฑด์ด๋‹ค..

import React, { useState } from 'react'
// useState Hook์„ React์—์„œ ๊ฐ€์ ธ์˜จ๋‹ค.
import { Link } from 'react-router-dom'
// react-router-dom ์—์„œ Link ๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.
// <a></a> ํƒœ๊ทธ ๊ฐ™์€ ์—ญํ• ์„ ํ•˜๋ฉด์„œ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•ด ์ฃผ๋Š” ์—ญํ•  ๊ฐ™๋‹ค!

function Navbar() {
  const [click, setClick] = useState(false)
  // Destructing Assignment (๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น์„ ์‚ฌ์šฉํ•œ๋‹ค)
  // ์ฒซ๋ฒˆ์งธ click ์€ state ๋ณ€์ˆ˜์ด๋‹ค.
  // ๋‘๋ฒˆ์งธ setClick ์€ ํ•ด๋‹น click ์ƒํƒœ๋ฅผ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ด๋‹ค.
  // useState ์˜ ์ธ์ž๋กœ false ๋ฅผ ๋„˜๊ฒจ์ค€ ๊ฑด click ๋ณ€์ˆ˜์˜ ๊ฐ’์„ false ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๊ฑฐ๋‹ค.
  return (
    <>
      <nav className="navbar">
        <div className="navbar-container">
          <Link to="/" className="navbar-logo">
            Dev.SL2 <i className="fas fa-dove" />
          </Link>
        </div>
      </nav>
    </>
  )
}

export default Navbar

Link ์ปดํฌ๋„ŒํŠธ๋Š” react-router-dom ์—์„œ ๋ถˆ๋Ÿฌ์™”๋Š”๋ฐ ์—ญํ• ์€ a ํƒœ๊ทธ ๊ฐ™์€ ๊ฑฐ๋ผ ๋ณด๋ฉด ๋œ๋‹ค.

to ๋ผ๋Š” props ๋ฅผ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ ๋‚ด dove ์•„์ด์ฝ˜์„ ๋ˆŒ๋ €์„ ๋•Œ ๋ฃจํŠธ ๊ฒฝ๋กœ๋กœ ๋ผ์šฐํŒ… ๋˜๋Š” ๊ฑฐ๋‹ค.

๊ธฐ๊ฐ€ ๋งฅํžˆ๋‹ค.

https://ko.reactjs.org/docs/hooks-state.html

์ฃผ์ปค๋ฒ„๊ทธ ๋ฝ€๋ฝ€ํ•ด์ฃผ๊ณ  ์‹ถ๋‹ค. ์™€ ์‹ฌ์ง€์–ด ํ•œ๊ธ€์ด๋‹ค..

ํ—คํ—ค ๋‚œ ์ด์ œ ๋น„๋‘˜๊ธฐ์จฉ์„ ๋กœ๊ณ ๋กœ ์“ธ๊ฑฐ์•ผ~๐Ÿ•Š

mylogo

์™€์•„ ๋ฒŒ์จ ๋‹คํ•œ ๊ธฐ๋ถ„์ด์•ผ!๐Ÿฅฐ๐Ÿฅฐ

์ผ๋‹จ ์ค‘๊ฐ„ ์ €์žฅ์“ฐ.. ์ผ์ผ์ปค๋ฐ‹..


Written by@[DotoriMook]
ํ”„๋ก ํŠธ์—”๋“œ ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž ๋„ํ† ๋ฆฌ๋ฌต์˜ ๊ธฐ์ˆ ๊ฐœ๋ฐœ ๋ธ”๋กœ๊ทธ ์ž…๋‹ˆ๋‹ค.

GitHubMediumTwitterFacebook