본문 바로가기
STUDY/react.js

[React] 리액트 라우터 : navigate, nested routes, outlet

by 히컵 2024. 8. 7.

 

 

🌱 들어가기 전에

리액트 프로젝트 폴더 구조는 비슷한 .js 파일끼리 한 폴더에 묶어 놓는 것이 좋은 폴더 구조이다.

  • 📁 component : 컴포넌트 역할하는 js 파일
  • 📁 routes/pages: 페이지 역할하는 js 파일
  • 📁 utils : 자주 사용하는 함수가 들어가는 js 파일
  • 필요할 때마다 폴더 만들어 사용

 


 

 

리액트 라우터

페이지 이동 기능 : useNavigate() 

페이지 이동은 Link를 사용해도 되지만 useNavigate()를 사용해도 된다.

 

(App.js)

import { useNavigate } from 'react-router-dom';

function App() {
 let navigate = useNavigate();
  return (
    <div className="App">
      <button onClick={ () => { navigate('/detail') } }>이동버튼</button>
      <button onClick={ () => { navigate(-1) } }>뒤로가기</button>
      <button onClick={ () => { navigate(1) } }>앞으로가기</button>

      (Routes 생략)
    </div>
  );
}

export default App;

 

1. 상단에 useNavigate 컴포넌트를 import 한다.

2. useNavigate()를 변수 navigate 에 저장한다. (변수에 저장해서 쓰는 것이 일반적)

3. 원하는 곳에 navigate('경로') 작성한다.

 

 

useNavigate()를 사용하면 그 자리에 페이지를 이동 시켜주는 함수가 남는다.

navigate('/detail')이 실행되면 /detail 페이지로 이동이 가능하다.

navigate()에 숫자를 넣으면 앞으로 가기, 뒤로 가기 기능 개발도 가능하다

navigate(-1) : 뒤로 1번 가기 / navigate(2) : 앞으로 2번 가기

 

 

 

 

서브 경로 만들 수 있는 nested route 

/about 페이지 안에 /about/member, /about/location 페이지를 만든다고 가정해 보자.

 

(App.js)

import { useNavigate } from 'react-router-dom';

function App() {
 let navigate = useNavigate();
  return (
    <div className="App">
      <Routes>
        <Route path="/about" element={ <About />} />
        <Route path="/about/member" element={ <div>멤버</div>} />
        <Route path="/about/location" element={ <div>회사위치</div>} />
      </Routes>
    </div>
  )
}

export default App;

이렇게 만들 수도 있겠지만

 

(App.js)

import { useNavigate } from 'react-router-dom';

function App() {
 let navigate = useNavigate();
  return (
    <div className="App">
      <Routes>
        <Route path="/about" element={ <About />}>
          <Route path="member" element={ <div>멤버</div>} />
          <Route path="location" element={ <div>회사위치</div>} />
        </Route>
      </Routes>
    </div>
  )
}

function About(){
  return(
    <>
      <h4>회사정보</h4>
    </>
  )
}

export default App;

이렇게 만들어 된다.

<Route>안에 <Route>를 넣을 수 있는데 이것을 Nested routes라고 부른다.

코드를 보면 /about/member 접속시 <About>, <div>멤버</div> 보여 주고, /about/location 접속시 <About>,<div>회사위치</div>를 보여 준다.

 

하지만 이렇게 코드를 작성하고 실행해 보면 <div>가 보이지 않는데, /about/member로 접속시 <About> 컴포넌트 안에 <div>멤버</div>를 어디에다 보여줄지 표기해야 한다.

 

<Outlet></Outlet>

1. 상단에 Outlet 컴포넌트를 import 한다.

2. nested routes 안의 element들을 보여 줄 곳에 <Outlet></Outlet> 작성한다.

(App.js)

import { useNavigate, Outlet } from 'react-router-dom';

function App() {
 let navigate = useNavigate();
  return (
    <div className="App">
      <Routes>
        <Route path="/about" element={ <About />}>
          <Route path="member" element={ <div>멤버</div>} />
          <Route path="location" element={ <div>회사위치</div>} />
        </Route>
      </Routes>
    </div>
  )
}

function About(){
  return(
    <>
      <h4>회사정보</h4>
      <Outlet></Outlet>
    </>
  )
}

export default App;

 

 

 

 

 

 

* 이 포스팅은 코딩애플 강의를 토대로 작성하였습니다.