프론트엔드 개발자가 될거야./react

[react] react-router-dom Outlet으로 Tab메뉴 구현하기

정니정은니 2023. 2. 8. 13:45

이러한 메뉴를 Tab 메뉴라고 하는데

react-router-dom Outlet으로 구현하는 방법에 대해 포스팅하려고 한다.

 

예를들어 마이페이지를 탭메뉴로 구성한다면

1. Router.tsx

function Router() {
  return (
    <BrowserRouter>
      <Routes>
        <Route path="/mypage" element={<MyPage />}>
          <Route path="profile" element={<ProfilePage />} />
          <Route path="logout" element={<LogoutPage />} />
          <Route path="setting" element={<SettingPage />} />
        </Route>
      </Routes>
    </BrowserRouter>
  );
}

export default Router;

먼저 Router에서 MyPage 컴포넌트의 자식들로 메뉴들을 넣어준다.

 

2. MyPage.tsx

function MyPage() {
  const profilesMatch = useMatch("/mypage/profile");
  const logoutMatch = useMatch("/mypage/logout");
  const settingMatch = useMatch("/mypage/googleOTP");

  return (
    <MyPageContainer>
      <MyPageWrapper>
        <MyPageMenu>
          <Tap isActive={profilesMatch !== null}>
            <Link to="/mypage/profile">
              <div>프로필</div>
            </Link>
          </Tap>
          <Tap isActive={profilesMatch !== null}>
            <Link to="/mypage/profiles">
              <div>로그아웃</div>
            </Link>
          </Tap>
          <Tap isActive={settingMatch !== null}>
            <Link to="/mypage/setting">
              <div>설정</div>
            </Link>
          </Tap>
        </MyPageMenu>

        <Outlet />
      </MyPageWrapper>
    </MyPageContainer>
  );
}

export default MyPage;

Outlet을  이용하여 MyPage 컴포넌트에서 각 메뉴를 클릭하면 해당 컴포넌트가 나오도록 해준다.

 

또한 나는 styled-component로 css를 그리는데
sActive라는 props를 통해 클릭된 메뉴를 전달해주고 있다.

 

react-router-dom의 useMatch를 이용하면 내가 현재있는 url이 내가 원하는 url에 있는지 true/false 값으로 알 수 있다.

이 값을 이용해서 isActive에 전달해주면 된다.