일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- TS
- Jest
- 리터럴 타입
- dfs
- 결정 알고리즘
- CI/CD
- autosize
- 투포인터
- SSR
- 태그된 유니온
- 인터섹션
- recoil
- CORS
- useAppDispatch
- 반공변성
- RTK Query
- React
- Cypress
- 이분 검색
- 무한 스크롤
- app router
- map
- ESlint
- 타입 좁히기
- tailwind
- async/await
- 호이스팅
- 공변성
- webpack
- Promise
Archives
- Today
- Total
짧은코딩
패러렐 라우트와 인터셉터 라우트 본문
반응형
만들려는 기능
- 모달을 띄웠는데, 이전 페이지가 유지되고 주소가 바뀐다.
- 로그인 버튼을 누르면 "/login"으로 갔다가 "/i/flow/login"으로 리다이렉팅 된다.
- 패러렐 라우트와 인터셉터 라우트를 이용해서 구현한다.
패러렐 라우트
- Parellel은 병렬이라는 의미를 가지고 있다.
- 즉, Parallel Route는 병렬 라우트로 해석할 수 있고, 병렬 라우팅을 사용하면 동일한 레이아웃에서 하나 이상의 페이지를 동시에 또는 조건부로 렌더링 할 수 있다.
- 패러렐 라우트는 뒤에 화면이 남아있으면서 모달을 띄우고 주소를 변경할 수 있는 기능이다.
폴더 구조
app/(beforeLogin)/layout.tsx
import {ReactNode} from "react";
import styles from '@/app/(beforeLogin)/_component/main.module.css';
type Props = { children: ReactNode, modal: ReactNode };
export default function Layout({ children, modal }: Props) {
return (
<div className={styles.container}>
{children}
{modal}
</div>
)
}
- 같은 폴더의 layout.tsx에 modal을 props로 받아온다.
- 패러렐 라우트를 사용하려면 page.tsx와 layout.tsx가 있어야 한다.
- page.tsx는 children에 렌더링
- @modal은 modal에 렌더링
- 렌더링 분석
- 주소가 localhost:3000 때는, children -> page.tsx, modal -> @modal/default.tsx
- 주소가 localhost:3000/i/flow/login 때는, children-> i/flow/login/page.tsx, modal -> @modal/i/flow/login/page.tsx
- default.tsx
- default.tsx는 패러렐 라우트에 대한 기본값이며, 패러렐 라우트가 필요 없는 부분에서 사용
export default function Default() {
return null;
}
굳이 보여줄 게 없어서 null을 return
- 만약 모달을 여러 개 사용하고 싶으면?
- @modal2 같은 폴더를 하나 더 추가하고
- layout.tsx에 modal2를 등록하면 된다.
인터셉터 라우트
- 인터셉터 라우트를 사용하면 서로 주소가 다른데 같이 화면에 띄울 수 있다.
- ()을 사용하여 구현할 수 있다.
- (.)이면 상위 폴더, (..)이면 (.)의 상위 폴더이다.
- 즉, import 할 때 사용하는 주소와 같다고 보면 된다.
- ()는 주소창에 관여하지 않음
- 기능에 대입하여 설명
- 로그인 버튼을 누르면 "/login"으로 가고
- "/login"에서 "/i/flow/login/page.tsx"로 가야 하는데, (.)로 인터셉팅해서 "/(.) i/flow/login/page.tsx"로 간다.
- 그렇지만 "/(.)i/flow/login/page.tsx"는 패러렐 라우트이자 인터셉터 라우터라서 children에 그려지는 게 아니라 modal에 그려져서 뒷 배경에 페이지를 두고 모달이 띄워지면서 url이 바뀐다.
- 그리고 상단 영상처럼 구현하려면 “/”에서 로그인 버튼 누르면, “/” ⇒ “/login” ⇒ “/i/flow/login”으로 가서 “/”이랑 “/login”이 같아야 함
- 그러면 인터셉팅 되는데 그냥 "/i/flow/login/page.tsx"는 필요 없는 거 아니야?
- 새로고침하면 (.)/i/flow/login/page.tsx 대신 i/flow/login/page.tsx로 가기 때문에 필요하다.
- 정리
- "i/flow"는 브라우저로 직접 접근하거나 새로고침을 눌렀을 때 사용
- "(.)i/flow"는 다른 페이지에서 링크를 통해서 접근하면 사용
- 결국 이 프로젝트에서는 "i/flow"와 "(.)i/flow"의 파일 내용이 완벽하게 같다.
- private 폴더
- 위에서 "i/flow"와 "(.)i/flow"의 파일 내용이 완벽하게 같으니까 컴포넌트화 할 필요가 있다.
- _를 앞에 붙여서 만들면 private 폴더를 생성할 수 있고, 주소창에 관여하지 않는다.
주소창에 관여하지 않는 폴더 구조
- () 그룹 폴더(주로 레이아웃 구분 시 사용)
- @를 사용하는 패러렐 라우트
- _를 붙이는 private 폴더(폴더 정리용)
출처
https://www.inflearn.com/course/next-react-query-sns%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard
Next + React Query로 SNS 서비스 만들기 강의 - 인프런
리액트18 & 넥스트14 & 리액트쿼리5 & Next Auth5 & MSW2 & socket.io4 & zustand 스택으로 트위터(X.com)와 유사한 SNS 서비스를 만들어봅니다. 끝으로 검색엔진 최적화를 위한 SSR까지!,...
www.inflearn.com
반응형
'인프런, 유데미 > z 클론 코딩' 카테고리의 다른 글
Next의 loading.tsx와 error.tsx with Suspense (0) | 2024.03.29 |
---|---|
useFormState와 useFormStatus (0) | 2024.03.27 |
useSelectedLayoutSegment, classnames 라이브러리 (0) | 2024.03.16 |
app router의 폴더 구조 및 세팅 (0) | 2024.03.13 |
Comments