front/react

[react] React Router (BrowserRouter, Routes, Route, Link, Outlet, useParams)

๋ฐฐ๊ณ ํŒŒ์š” 2026. 1. 4. 15:45
728x90

๐Ÿ“ react router ?? 

  • ๋ฆฌ์•กํŠธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • ๋‹จ์ผ ํŽ˜์ด์ง€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ฆ
  • URL ๋งค๊ฐœ ๋ณ€์ˆ˜ ๋ฐ Query String ์ฒ˜๋ฆฌ
  • ๋ธŒ๋ผ์šฐ์ € History ๋ฐ ํƒ์ƒ‰ ๊ด€๋ฆฌ
  • ์ค‘์ฒฉ๋œ ๊ฒฝ๋กœ ๋ ˆ์ด์•„์›ƒ ๋งŒ๋“ค๊ธฐ
  • ์ธ์ฆ์„ ์œ„ํ•œ ๋ณดํ˜ธ๋œ ๊ฒฝ๋กœ ๊ตฌํ˜„
  • ์„ค์น˜ ๋ฐฉ๋ฒ•?
    • npm install react-router-dom

 

 

๐Ÿ“ BrowserRouter, Routes, Route, Link, Outlet, useParams 

  • import { BrowserRouter, Routes, Route, Link, Outlet, useParams } from 'react-router-dom';
    • ์‚ฌ์šฉํ•  ๋•Œ import ํ•ด์ค˜์•ผํ•จ!
  • BrowerRouter
  • Routes , Route
  • Link
  • Outlet
    • <Outlet /> { /** ์ถ”๊ฐ€์ ์ธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋“ค์–ด๊ฐˆ ์œ„์น˜์—๋Š” Outlet ์„ ๋„ฃ์–ด์•ผํ•จ. */}
  • userParams 
    • <Routes>
             <Route path="/customer/:name" element={<Info />} /> { /** ์ž๋ฐ”์˜ pathvariable ๊ณผ ๋น„์Šทํ•œ ๋А๋‚Œ. */}
      </Routes>
    • ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ž๋™์œผ๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ ํ•จ.
      • const { name } = useParams();
import { createRoot } from 'react-dom/client';
import { BrowserRouter, Routes, Route, Link, Outlet, useParams, NavLink } from 'react-router-dom';
import './Navbar.css';

function Home(){
    return <h1>home Page</h1>
}

function About(){
    return (
        <div>
            <h1>about page</h1>
            <nav>
                <Link to="/about/ceo">Ceo</Link>
            </nav>
            <Outlet /> { /** ์ถ”๊ฐ€์ ์ธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋“ค์–ด๊ฐˆ ์œ„์น˜์—๋Š” Outlet ์„ ๋„ฃ์–ด์•ผํ•จ. */}
        </div>
    );
}

function Contact() {
    return <h1>contact Page</h1>
}


function AboutCeo() {
    return <h2>About Ceo</h2>
}

function Info() {
    const { name } = useParams();
    return <h1>์ €๋Š” {name} ์ž…๋‹ˆ๋‹ค.</h1>
}

function App2() {
    return (
        <BrowserRouter>
            <nav>
                <Link to="/customer/ํ™๊ธธ๋™">ํ™๊ธธ๋™</Link> | {(" ")}
                <Link to="/customer/๊น€์ฒ ์ˆ˜">๊น€์ฒ ์ˆ˜</Link> | {(" ")}
                <Link to="/customer/์ •์ˆ™">์ •์ˆ™</Link>
            </nav>
            <Routes>
                <Route path="/customer/:name" element={<Info />} /> { /** ์ž๋ฐ”์˜ pathvariable ๊ณผ ๋น„์Šทํ•œ ๋А๋‚Œ. */}
            </Routes>
        </BrowserRouter>
    );
}


const naveLinkStyles = ( {isActive} ) => ( 
    {
        color: isActive ? 'blue' : 'gray',
        textDecoration : isActive ? 'none' : 'underline',
        fontWeight : isActive ? 'bolder' : 'normal'
    }
);


function App() {
    return (
        <BrowserRouter>
        { /* ๋„ค๋น„๊ฒŒ์ด์…˜*/ }
        <h1>๋ฐฉ๋ฒ• 1</h1>
        <nav>
            <NavLink to="/" style={naveLinkStyles}>ํ™ˆ</NavLink> | {" "}
            <NavLink to="/about" style={naveLinkStyles}>ํšŒ์‚ฌ์†Œ๊ฐœ</NavLink> | {" "}
            <NavLink to="/contact" style={naveLinkStyles}>๋ฌธ์˜ํ•˜๊ธฐ</NavLink>
        </nav>
        <h1>๋ฐฉ๋ฒ• 2</h1>
        <nav>
            <NavLink to="/">ํ™ˆ</NavLink> | {" "}
            <NavLink to="/about">ํšŒ์‚ฌ์†Œ๊ฐœ</NavLink> | {" "}
            <NavLink to="/contact">๋ฌธ์˜ํ•˜๊ธฐ</NavLink>
        </nav>
        <h1>๋ฐฉ๋ฒ• 3</h1>
        <nav>
            <NavLink to="/" className={ ({isActive}) => (isActive ? 'active-link' : 'inactive-link' ) } >ํ™ˆ</NavLink> | {" "}
            <NavLink to="/about" className={ ({isActive}) => (isActive ? 'active-link' : 'inactive-link' ) } >ํšŒ์‚ฌ์†Œ๊ฐœ</NavLink> | {" "}
            <NavLink to="/contact" className={ ({isActive}) => (isActive ? 'active-link' : 'inactive-link' ) } >๋ฌธ์˜ํ•˜๊ธฐ</NavLink>
        </nav>
        { /** routes */}
        <Routes>
            { /** Route์˜ path ๋กœ ๋“ค์–ด์™”์„ ๋•Œ, --> element ์˜ ๊ฒƒ์„ ํ˜ธ์ถœํ•˜๋ผ. */}
            <Route path="/" element={<Home />} /> 
            <Route path="/about" element={<About />}>
                <Route path="ceo" element={<AboutCeo />} />
            </Route>
            <Route path="/contact" element={<Contact />} />
        </Routes>
        </BrowserRouter>
    );
}

createRoot(document.getElementById('reactRouter')).render(
    <App />
);

์™ผ (:name (์ž๋ฐ”์˜ pathvariable๊ณผ ๋น„์Šท)) ์˜ค (NavLink ์˜ isActive ๊ฐ’์„ ์ด์šฉํ•ด์„œ ๋‹ค๋ฅธ style์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ)

 

๐Ÿ“ NavLink ๋ฅผ ์ด์šฉํ•ด์„œ active ํ• ๋•Œ๋งˆ๋‹ค ๋‹ค๋ฅธ css ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• ?

  • isActive ๊ฐ’์„ true, false ๋กœ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ์Œ.
    • isActive ๋Š” ์ด๋ฆ„์ด ๋ฌด์กฐ๊ฑด ๊ณ ์ •๋˜์–ด ์žˆ์Œ.
  • ๊ฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋น„๊ตํ•ด์„œ, link ๊ฐ€ ๋˜์–ด ์žˆ์œผ๋ฉด --> true ๊ฐ’์ด ๋‚˜์˜ด.
  • NavLink ๋Š” ํด๋ฆญ ํ• ๋•Œ๋งˆ๋‹ค ๋‹ค๋ฅธ style์„ ๋„ฃ์„ ๋•Œ --> ์ฃผ๋กœ ์‚ฌ์šฉ๋จ.
  • ๋ฐฉ๋ฒ• 1 
    • <NavLink to="/" style={naveLinkStyles}>ํ™ˆ</NavLink>
    • const naveLinkStyles = ( {isActive} ) => ( 
          {
              color: isActive ? 'blue' : 'gray',
              textDecoration : isActive ? 'none' : 'underline',
              fontWeight : isActive ? 'bolder' : 'normal'
          }
      );
  • ๋ฐฉ๋ฒ• 2
    • Link ํด๋ฆญ ๋˜๋ฉด --> ํ•ด๋‹น ๋งํฌ์— ์ž๋™์œผ๋กœ active ๋ผ๋Š” ํด๋ž˜์Šค ์ƒ๊น€.
    • nav > a.active { ~~ } ์ฒ˜๋ฆฌ ํ•ด์ค˜๋„ ๋จ.

 

  • ๋ฐฉ๋ฒ• 3
    • <NavLink to="/" className={ ({isActive}) => (isActive ? 'active-link' : 'inactive-link' ) } >ํ™ˆ </NavLink>
    •  

 

 

๐Ÿ“ ?

  • ใ…‡ใ…‡ 

 


์ถœ์ฒ˜ : 

[์™•์ดˆ๋ณด ํ™ˆํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ ๋ฆฌ์•กํŠธ ๊ธฐ์ดˆ]

https://www.youtube.com/watch?v=NxETFxGL8A4&list=PLTb3qGCzYjS2AliTIbz9eAGjZSdEQa3m1&index=34

 

 


๊ฐœ๋ฐœ ๊ณต๋ถ€๋ฅผ ์œ„ํ•œ ๋ธ”๋กœ๊ทธ ์ž…๋‹ˆ๋‹ค. 

์˜ค๋ฅ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์„ธ์š”! 

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

728x90