React

중첩 라우팅

sdafdq 2023. 11. 30. 16:01

라우트 안에 라우트

 

<Route path="/articles" element={<Articles />}>
  <Route path=":id" element={<Article/>}></Route>
</Route>

이렇게 하면

/articles/:id임.

마치 스프링 컨트롤러에서 class레벨에 Mapping 지정해주고, 컨트롤러 메소드마다 추가로 지정해주는 거랑 똑같네.

 

저기 안에 들어가 보면,

 

import React from "react";
import { Outlet } from "react-router-dom";
import "../scss/Articles.scss";

const Articles = () => {

  return (
    <div>
      <ul>
        <ArticleItem id={1}/>
        <ArticleItem id={2}/>
        <ArticleItem id={3}/>
      </ul>
      <Outlet></Outlet>
    </div>
  );
};

 

저 Outlet이, 내부 라우터에 준 컴포넌트가 들어갈 수 있는 공간임.

즉, 위 같은 경우 /articles 해서 들어가면 저 Outlet 부분 안나오지만(지정을 안했으니까),

/articles/1 해서 들어가면, 저 Outlet부분, 즉 /articles/:id로 할당한 컴포넌트 Article이 저 ul 아래 부분에 나타남.

 

애초에 Route해서 지정하는 곳 들은 해당 url시 거기에 element해서 준 컴포넌트를 나타나게 하겠다는 건데,

그게 저 Outlet이라는 이름으로 대신한다고 생각하면 됨

 

 

 

 

 

 

 

 

<Route element={<Layout/>}>
  <Route path="/" element={<Home />} />
  <Route path="/about" element={<About />} />
  <Route path="/profile/:username" element={<Profile />} />
</Route>

 

import React from 'react'
import { Outlet, useNavigate } from 'react-router'

const Layout = () => {
  const navigate = useNavigate();
  const goBack = ()=>{
    navigate(-1);
  }

  const goArticles = ()=>{
    navigate('/articles', {replace:true});
  }

  return (
    <div>
      <header style={{backgroundColor:'lightgray', padding:16, fontSize:24}}>
		...헤더입니다
      </header>

      <main>
        <Outlet/>
      </main>
    </div>
  )
}

export default Layout

뭐 그냥 저렇게 했는데, 나는 솔직히 이게 더 복잡해 보이고,

그냥 header , main을 애초에 나눈 뒤 그걸 App에 기본으로 잡고 main부분에 Route 들을 넣을 듯.

 

여튼 이것도 해당되는 url이 들어오면 저 main 안의 Outlet에 나타나니까.

 

 

'React' 카테고리의 다른 글

NavLink, Link  (0) 2023.11.30
useNavigate, Navigate  (0) 2023.11.30
라우터 경로변수  (0) 2023.11.30
리액트 최적화  (0) 2023.11.28
리액트 프로파일러  (0) 2023.11.28