๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ’ปWEB FrontEnd/ํ”„๋ ˆ์ž„์›Œํฌ React

๋ผ์šฐํŒ… (์…‹ํŒ…, navigate, nested routes, outlet)

react-router-dom ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜

ํ„ฐ๋ฏธ๋„์— ๋‹ค์Œ ๋ช…๋ น์–ด ์ž…๋ ฅ

npm install react-router-dom@6

 

๊ทธ ๋‹ค์Œ index.js ํŒŒ์ผ๋กœ ๊ฐ€์„œ

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

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
      <BrowserRouter>
        <App />
      </BrowserRouter>
  </React.StrictMode>
); 

โ–ฒ import ์–ด์ฉŒ๊ตฌ ํ•ด์˜ค๊ณ  <BrowserRouter> ์ด๊ฑธ๋กœ <App/> ์ด๊ฑธ ๊ฐ์‹ธ๋ฉด ๋

 

 

๋ผ์šฐํŒ… ์‚ฌ์šฉ๋ฒ•

- App.js

import './App.css';
import {Routes, Route, Link} from 'react-router-dom';

function App() {
  let [shoes] = useState(data);
  return (
    <div className="App">
      <Routes>
        <Route path="/" element={<div>๋ฉ”์ธํŽ˜์ด์ง€</div>}/>
        <Route path="/detail" element={<div>์ƒ์„ธํŽ˜์ด์ง€</div>}/>
        <Route path="/cart" element={<div>์žฅ๋ฐ”๊ตฌ๋‹ˆ ํŽ˜์ด์ง€</div>}/>
      </Routes>
    </div>
  );
}

export default App;

 

 

๋ฒ„ํŠผ ๋ˆŒ๋ €์„ ๋•Œ ํŽ˜์ด์ง€ ์ด๋™ํ•˜๊ธฐ

<Link to='/detail'></Link>

import './App.css';
import {Routes, Route, Link} from 'react-router-dom';

function App() {
  let [shoes] = useState(data);
  return (
    <div className="App">
      <Routes>
        <Route path="/" element={<div>๋ฉ”์ธํŽ˜์ด์ง€</div>}/>
        <Route path="/detail" element={<div>์ƒ์„ธํŽ˜์ด์ง€</div>}/>
        <Route path="/cart" element={<div>์žฅ๋ฐ”๊ตฌ๋‹ˆ ํŽ˜์ด์ง€</div>}/>
      </Routes>
      
      <Link to="/">ํ™ˆ</Link>    //ํ™ˆ์œผ๋กœ ๊ฐ€๋Š” ๋ฒ„ํŠผ
      <Link to="/detail">์ƒ์„ธํŽ˜์ด์ง€</Link>    //์ƒ์„ธํŽ˜์ด์ง€๋กœ ๊ฐ€๋Š” ๋ฒ„ํŠผ
    </div>
  );
}

export default App;

 

useNavigate() ํ•จ์ˆ˜

useNavigate()ํ•จ์ˆ˜๋Š” <Link>ํƒœ๊ทธ์™€ ๊ฐ™์ด ํŽ˜์ด์ง€ ์ด๋™์„ ๋„์™€์ค€๋‹ค.

function App(){
  let navigate = useNavigate()
  
  return (
    (์ƒ๋žต)
    <button onClick={()=>{ navigate('/detail') }}>์ด๋™๋ฒ„ํŠผ</button>
    <button onClick={()=>{ navigate(-1) }}>๋’ค๋กœ 1๋ฒˆ ๊ฐ€๊ธฐ</button>
    <button onClick={()=>{ navigate(2) }}>์•ž์œผ๋กœ 2๋ฒˆ ๊ฐ€๊ธฐ</button>
  )
}

 

nested routes

<Route>์•ˆ์— <Route>๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๊ฑธ Nested routes ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

์—ฌ๋Ÿฌ ํŽ˜์ด์ง€๊ฐ€ ํ•„์š”ํ•˜๊ณ , ๊ทธ ํŽ˜์ด์ง€๋“ค ๊ฐ„์˜ ์ฐจ์ด์ ์ด ๋ณ„๋กœ ์—†์„ ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹๋‹ค. 

(์ผ๋ฐ˜์ ์ธ ๋ฐฉ์‹)
<Route path="/about" element={<About></About>}/>
<Route path="/about/member" element={<About></About>}/>

(nested routes ๋ฐฉ์‹)
<Route path="/about" element={<About></About>}>
  <Route path="member" element={<About></About>}/>
</Route>

์žฅ์  1) route ์ž‘์„ฑ์ด ๊ฐ„๋‹จํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

์žฅ์  2) nested route ์ ‘์†์‹œ์—” element 2๊ฐœ๊ฐ€ ๋ณด์ธ๋‹ค. => ๋ณด์—ฌ์งˆ ์œ„์น˜๋ฅผ ์ง€์ •ํ•ด์•ผ element 2๊ฐœ๊ฐ€ ๋‹ค ๋ณด์ธ๋‹ค.

import './App.css';
import {Routes, Route, Link, useNavigate, Outlet } from 'react-router-dom';

function App() {
  return (
    <div className="App">
      <Routes>
      	//nested routes
        <Route path="/about" element={<About></About>}>
          <Route path="member" element={<div>member์ •๋ณด</div>}/>
        </Route>
      </Routes>
    </div>
  );
}

function About() {
  return (
    <div>
      <h4>ํšŒ์‚ฌ์ •๋ณด</h4>
      <Outlet></Outlet>	 	//outletํƒœ๊ทธ๋กœ ๋ณด์—ฌ์งˆ ์œ„์น˜ ์ง€์ •
    </div>
  )
}

export default App;