λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

study/100 days (100일 μ±Œλ¦°μ§€)

[μ›Ήκ°œλ°œ 100일] Day 2 - λ¦¬μ•‘νŠΈ λΌμš°ν„°, 둜그인 νŽ˜μ΄μ§€ λ§Œλ“€κΈ°

λ°˜μ‘ν˜•

 

 

 

 

 

 

πŸš€ μš”μ•½

μž‘μ—… μ‹œκ°„: 3μ‹œκ°„λ°˜? 4μ‹œκ°„?

βœ… ν”„λ‘œμ νŠΈ 폴더 ꡬ쑰 정리
βœ… React Router둜 νŽ˜μ΄μ§€ 이동 κ°€λŠ₯ν•˜κ²Œ λ§Œλ“€κΈ°
βœ… λ„€λΉ„κ²Œμ΄μ…˜ λ°”(Navbar) μ œμž‘
βœ… 둜그인 νŽ˜μ΄μ§€ UI ꡬ성

 

 

 

πŸš€ 폴더 ꡬ쑰

/src
 β”œβ”€β”€ /components    # μž¬μ‚¬μš© κ°€λŠ₯ν•œ UI μ»΄ν¬λ„ŒνŠΈ
 β”‚    β”œβ”€β”€ Navbar.tsx
 β”‚    β”œβ”€β”€ Button.tsx
 β”‚    β”œβ”€β”€ Card.tsx
 β”‚    └── Footer.tsx
 β”œβ”€β”€ /pages         # νŽ˜μ΄μ§€ λ‹¨μœ„ 파일
 β”‚    β”œβ”€β”€ Home.tsx
 β”‚    β”œβ”€β”€ Upload.tsx
 β”‚    β”œβ”€β”€ PostList.tsx
 β”‚    β”œβ”€β”€ Gallery.tsx
 β”‚    └── Login.tsx
 β”œβ”€β”€ App.tsx
 β”œβ”€β”€ main.tsx
 β”œβ”€β”€ index.css
 └── vite.config.ts

 

 

 

πŸš€ React Router 적용

react-router-dom μ„€μΉ˜

npm install react-router-dom

 

 

νƒ€μž… 지원 νŒ¨ν‚€μ§€ μ„€μΉ˜ 

(react-router-dom은 JavaScript 기반 라이브러리이기 λ•Œλ¬Έμ— TypeScriptκ°€ 자체적으둜 νƒ€μž…μ„ μ•Œμ§€ λͺ»ν•¨.
@types/react-router-dom을 μ„€μΉ˜ν•˜λ©΄ React Router의 νƒ€μž… 정보(예: Route, Link, useNavigate λ“±)λ₯Ό TypeScriptμ—μ„œ 인식)

npm install @types/react-router-dom --save-dev

 

 

μ΄λ ‡κ²Œ κ°„λ‹¨ν•œ νŽ˜μ΄μ§€ ꡬ뢄을 ν•΄μ£Όμ—ˆλ‹€.

function App() {
  return (
    <Router>
      <div className="flex flex-col min-h-screen min-w-screen">
        <Navbar />
        <div className="flex-grow">
          <Routes>
            <Route path="/" element={<Home />} />
            <Route path="/events" element={<EventList />} />
            <Route path="/login" element={<Login />} />
          </Routes>
        </div>
        <Footer />
      </div>
    </Router>
  );
}

 

 

 

πŸš€ λ„€λΉ„κ²Œμ΄μ…˜, 둜그인 UI ꡬ성

λ„€λΉ„κ²Œμ΄μ…˜ μ½”λ“œ

import { Link } from "react-router-dom";

const Navbar = () => {
  return (
    <nav className="w-full bg-blue-300 h-14 px-4 text-white flex justify-between items-center">
      <h1 className="text-xl font-bold">Resho</h1>
      <div className="flex space-x-4">
        <Link to="/" className="hover:underline text-white">
          Home
        </Link>
        <Link to="/events" className="hover:underline text-white">
          Events
        </Link>
        <Link to="/gallery" className="hover:underline text-white">
          Gallery
        </Link>
        <Link to="/upload" className="hover:underline text-white">
          Upload
        </Link>
        <Link to="/login" className="hover:underline text-white">
          Login
        </Link>
      </div>
    </nav>
  );
};

export default Navbar;

 

 

둜그인 νŽ˜μ΄μ§€

const Login = () => {
  return (
    <div className="p-6 text-center">
      <h2 className="text-3xl font-bold">Sign In</h2>
      <p className="text-gray-600 mt-2 pb-16">λ‘œκ·ΈμΈν•˜μ„Έμ—Ό</p>
      <div className="flex justify-between items-center pb-16 h-[100px] w-[360px]">
        <span className="flex flex-col gap-4 items-start h-[100px]">
          <label className="h-[42px] flex items-center" htmlFor="signin-id">
            ID
          </label>
          <label className="h-[42px] flex items-center" htmlFor="signin-pwd">
            PASSWORD
          </label>
        </span>
        <span className="flex flex-col gap-4 items-center h-[100px]">
          <input
            className="border p-2 w-[250px] rounded-md"
            type="text"
            id="signin-id"
            name="signin-id"
          />
          <input
            className="border p-2 w-[250px] rounded-md"
            type="password"
            id="signin-pwd"
            name="signin-pwd"
          />
        </span>
      </div>
      <button className="bg-blue-600 text-white py-2 px-4 rounded-md hover:bg-blue-700 w-[360px]">
        Sign In
      </button>
    </div>
  );
};

export default Login;

 

 

κ²°κ³Ό

일단은 κ΅¬ν˜„~배포뢀터 해놓고 λ””μžμΈ κ°œμ„ μ€ λ‚˜μ€‘μ— μ‹œκ°„ λ‚¨μœΌλ©΄ ν•˜λŠ” 걸둜!

 

 

 

λ°˜μ‘ν˜•