Dashboard에서 team
, analytics
페이지를 동시에 렌더링 할 수 있다.
→ 하나의 페이지에서 여러 경로를 동시에 렌더링해 더 유연한 네비게이션과 데이터 로딩 구현 가능
@folder
@analytics
, @team
// app/layout.tsx
export default function Layout({
children,
team,
analytics,
}: {
children: React.ReactNode
analytics: React.ReactNode
team: React.ReactNode
}) {
return (
<>
{children}
{team}
{analytics}
</>
)
}
/@analytics/views
의 실제 URL은 /viwes
가 된다. page
컴포넌트와 결합되어 최종 페이지를 구성한다. Good to know
children
prop은 암묵적인 slot이며 별도의 폴더 맵핑이 필요하지 않는다.
→app/page.js
는app/@children/page.js
와 동일하게 동작한다.
기본적으로 Next.js는 각 slot의 활성 state 또는 subpage를 추적한다.
그러나 slot내에ㅔ서 렌더링되는 컨텐츠는 네비게이션 유형에 따라 달라진다.
default.js
파일을 렌더링하며 default.js
가 없을 경우 404
페이지를 표시한다.Soft vs Hard Navigation 테이블 표로 비교
제목2 | 제목3 | |
---|---|---|
방식 | CSR | SSR |
데이터 요청 | 이미 로드된 데이터 재사용(캐싱활용) | 모든 데이터를 서버에서 다시 요청 |
라우팅 방식 | router.push / <Link> | 브라우저 새로고침 / URL 입력 |
슬롯(Parallel Routes) 상태 | URL과 다르더라도 기존 서브페이지 상태 유지 | 현재 URL과 일치하지 않는 슬롯은 default.js 렌더링 (없으면 404페이지) |
전체 페이지 새로고침 여부 | ❌ | ✅ |
속도 | 빠름(필요한 부분만 재 렌더링) | 느림(모든 리소스 다시 요청) |
Good to know
일치하지 않는 경로에 대해 404를 반환하는 이유:
- 잘못된 경로에서 의도하지 않은 병렬 라우트가 렌더링 되지 않도록 방지
default.js
→ /settings
경로로 이동하면 @team
slot은 /settings
페이지를 렌더링하면서 @analytics
slot의 현재 활성 페이지를 유지한다.
새로고침 시 Next.js는 @analytics
slot에 대해 default.js
를 렌더링한다. 만약
default.js
가 존재하지 않으면 404페이지가 렌더링 된다.
또한 children
은 암묵적인 slot이므로 Next.js가 부모 페이지의 활성 상태를 복구할 수 없을 때를 대비해 children
용 default.js
파일을 생성해야 한다.
useSelectedLayoutSegment(s)
useSelectedLayoutSegment
및 useSelectedLayoutSegments
는 parallelRoutesKey
매개변수를 사용할 수 있다.'use client'
import { useSelectedLayoutSegment } from 'next/navigation'
export default function Layout({ auth }: { auth: React.ReactNode }) {
const loginSegment = useSelectedLayoutSegment('auth')
// ...
}
→ 사용자가 app/@auth/login
경로로 이동하면 loginSegment = "login"
이 된다.