SPACE RUMI

Hi, I am rumi. Let's Splattack!

[STUDY] 스터디/NEXT.js Docs

[Routing] Next / Parallel Routes, 인터셉팅 라우트 - 병렬 라우트, 인터셉팅 라우트

백루미 2023. 4. 29. 02:16
반응형

병렬 Route

병렬 라우트를 사용하면 독립적으로 탐색할 수 있는 하나 이상의 페이지를 동일한 화면에서 동시에 렌더링할 수 있습니다. 소셜 사이트의 대시보드 및 피드와 같이 앱에서 매우 동적인 섹션의 경우 병렬 라우트를 사용하여 복잡한 라우팅 패턴을 구현할 수 있습니다.

규칙
병렬 라우트는 명명된 slots을 사용하여 생성됩니다. 슬롯은 @folder 규칙으로 정의됩니다.

예를 들어, 다음 파일 구조는 비디오 분석 대시보드에 대한 두 개의 명시적 슬롯, 즉 @audience와 @views를 정의합니다:

위의 폴더 구조는 이제 /dashboard/layout.js 컴포넌트에서 @audience 및 @views 슬롯을 prop으로 받아들이고 children prop과 함께 병렬로 렌더링할 수 있다는 의미입니다:

function AudienceNav() {
  return <nav>...</nav>;
}

function ViewsNav() {
  return <nav>...</nav>;
}

export default function Layout({
  children,
  audience,
  views,
}: {
  children: React.ReactNode;
  audience: React.ReactNode;
  views: React.ReactNode;
}) {
  return (
    <>
      <h1>Tab Bar Layout</h1>
      {children}

      <h2>Audience</h2>
      <AudienceNav />
      {audience}

      <h2>Views</h2>
      <ViewsNav />
      {views}
    </>
  );
}

알아두면 좋습니다:

children prop은 폴더에 매핑할 필요가 없는 암시적 slot입니다. 즉, dashboard/page.jsdashboard/@children/page.js 와 동일합니다.

 

동작

URL
슬롯은 URL 구조에 영향을 주지 않습니다. dashboard/@audience/subscribers 파일 경로는 /dashboard/subscribers 액세스할 수 있습니다.

Navigation
앞뒤로 탐색할 때(소프트 탐색 사용) URL이 업데이트되고 브라우저는 이전에 활성화된 슬롯을 복원합니다.

예를 들어, 사용자가 /dashboard/subscribers로 이동한 다음 /dashboard/impressions로 이동하는 경우, 다시 이동할 때 URL이 dashboard/subscribers로 업데이트됩니다.

 

default.js

새로 고침(또는 하드 탐색) 시 브라우저는 현재 URL과 일치하는 슬롯을 렌더링하지만 어떤 다른 병렬 슬롯이 활성화되었는지 알 수 없습니다.

브라우저가 이전 상태를 복원할 수 없을 때 대체로 렌더링할 default.js 파일을 정의할 수 있습니다.

 

조건부 라우트

병렬 라우트를 사용하여 조건부 라우팅을 구현할 수 있습니다. 예를 들어 현재 사용자 유형에 따라 @user@team 경로를 렌더링할 수 있습니다:

import { getCurrentUserType } from 'lib/user';

export default async function Layout({
  children,
  user,
  team,
}: {
  children: React.ReactNode;
  user: React.ReactNode;
  team: React.ReactNode;
}) {
  const userType: 'user' | 'team' = getCurrentUserType();

  return (
    <>
      {/* Render the user or team slot depending on the current user type */}
      {userType === 'user' ? user : team}
      {children}
    </>
  );
}

 

라우트 인터셉팅

라우트를 가로채면 브라우저 URL을 마스킹하면서 현재 레이아웃 내에서 새 경로를 로드할 수 있으므로 현재 페이지의 컨텍스트를 유지하는 것이 중요할 때 유용합니다. 예를 들어 하나의 작업을 편집하는 동안 모든 작업을 보거나 사이드 모달에서 카트를 열거나 피드에서 사진을 펼칠 수 있습니다.

규칙
상대 경로 ../와 유사하게 (..) 규칙을 사용하여 인터셉터 라우트를 정의할 수 있습니다. (...) 규칙을 사용하여 app 디렉터리를 기준으로 경로를 만들 수도 있습니다.

위의 예에서 사용자 피드에서 사진을 클릭하면 클라이언트 측 탐색을 사용하여 사진이 열립니다. 그러나 페이지를 새로 고치거나 공유하면 기본 레이아웃 및 페이지로 사진이 로드됩니다.

 

모달

인터셉팅 라우트를 병렬 라우트와 함께 사용하여 모달을 만들 수 있습니다.

모달을 만들 때 다음과 같은 몇 가지 일반적인 문제를 알고 있어야 하는 경우가 많습니다:

  • URL을 통해 모달에 액세스할 수 없음
  • 페이지가 새로고침될 때 모달이 닫힘
  • 뒤로 네비게이팅 할때 모달이 뜬 페이지의 라우트가 아닌(모달이 닫히는게아닌) 모달이 뜨기 이전 경로로 이동하는 뒤로 탐색.
  • 모달을 다시 열지 않는 앞으로 탐색. (모달은 라우팅에 포함이안됨)

라우트를 인터셉팅하면 URL을 통해 모달 콘텐츠를 공유할 수 있도록 하고, 페이지를 새로 고칠 때 컨텍스트가 손실되지 않도록 하며, 뒤로 및 앞으로 탐색을 통해 모달을 닫았다가 다시 여는 등 모달을 만들 때 발생할 수 있는 문제를 해결할 수 있습니다.

위의 예에서 product 페이지에서 cart 버튼을 클릭하면 카트가 모달로 열립니다. 그러나 카트는 결제 시와 같이 고유한 경로와 레이아웃에서도 액세스할 수 있습니다.

반응형