화면 이동
Granite 앱에서는 화면 전환, 히스토리 관리, 파라미터 전달 같은 라우팅을 간편하게 처리할 수 있어요. 내부적으로는 React Navigation을 기반으로 동작하므로, 익숙한 API로 바로 활용할 수 있습니다.
라우팅 예제 구조
라우팅 예제는 총 3개의 페이지(page-a, page-b, page-c)로 구성되어 있어요.
root
├─── pages
│ ├─── page-a.tsx
│ ├─── page-b.tsx
│ └─── page-c.tsx
└─── src
└─── ...페이지 A: 화면 이동하기
useNavigation은 화면 간 이동을 처리할 때 사용해요. navigate 메서드로 이동할 화면의 경로와 필요한 데이터를 함께 전달할 수 있어요.
주요 포인트
useNavigation훅을 사용해navigation객체를 가져와요.navigation.navigate('/page-b')를 호출하면 'B' 페이지로 이동해요.
페이지 B: 이전 화면으로 돌아가기
주요 포인트
canGoBack()으로 이전 화면이 있는지 확인하고, 있으면goBack()을 호출해요.navigate('/page-c', { message: '안녕!', date: new Date().getTime() })로 데이터를 전달하면서 'C' 페이지로 이동해요.
페이지 C: 전달받은 데이터 사용하기
Route.useParams 훅은 다른 화면에서 전달된 데이터를 가져올 때 사용해요.
이때, createRoute.validateParams 옵션을 설정하면 전달된 데이터를 타입 검증(Type-Safe)하면서 접근할 수 있어요. 이를 통해 잘못된 데이터 형식으로 인한 에러를 방지할 수 있어요.
주요 포인트
Route.useParams훅을 사용하면 URL에서 전달된 데이터(매개변수)에 접근할 수 있어요.createRoute.validateParams옵션을 설정하면 데이터 타입을 검증하면서(Type-Safe) 안전하게 사용할 수 있어요.
화면 파라미터 타입 정의하기
페이지마다 아래와 같은 Route 컴포넌트를 정의해요. 여기서 validateParams 옵션은 해당 화면에서 받을 파라미터의 타입을 정의해요.
위 코드에서 validateParams는 message와 date라는 두 필드를 포함한 매개변수를 타입으로 정의해요.
이를 통해 다른 코드에서 useNavigate나 useParams를 사용할 때, 타입 검사를 통해 필요한 경로와 전달해야 할 데이터를 명확히 알 수 있어요. 이렇게 하면 코드의 안전성과 가독성이 높아져요.
자동 타입 정의 생성
개발 모드에서는 pages/ 디렉토리에 파일이 추가되면 자동으로 타입 정의가 생성되므로 별도의 명령어를 실행하지 않아도 돼요.
생성된 파일 예시
자동으로 생성된 파일은 다음과 같아요. 이 파일은 자동 생성되므로 수동으로 수정할 필요가 없어요.
주요 포인트
각 화면에서 받을 파라미터의 타입을
createRoute.validateParams옵션으로 정의해두면,navigate와params사용 시 타입 검사를 받을 수 있어 더 안전하게 코드를 작성할 수 있어요.개발 모드에서는
pages/디렉토리에 파일이 추가되면 타입 정의가 자동으로 생성되기 때문에 별도의 명령어 실행이 필요하지 않아요.
이렇게 React Navigation을 사용하면 화면 간 이동을 쉽게 처리할 수 있고, 데이터를 전달하거나 기록을 조작하는 기능을 통해 다양한 UX를 구현할 수 있어요. 또한 타입스크립트와 함께 사용하면 안전하고 견고한 코드를 작성할 수 있답니다.
라우팅 상태 초기화하기
페이지 A → 페이지 B → 페이지 C 순서로 이동한 직후의 상태는 아래와 그림과 같이 같이 나타낼 수 있어요.
페이지 A, 페이지 B, 페이지 C가 순서대로 routes 기록에 남아 있고, index 값은 마지막으로 이동한 페이지 C의 위치인 2를 가리켜요.
reset을 사용하면 화면 이동 기록을 초기화할 수 있어요. 예를 들어, '페이지 A → B → C'로 이동한 후에 '페이지 A'로 돌아가면서 B와 C 기록을 삭제하고 싶다면, CommonActions.reset을 사용해요.
주요 포인트
CommonActions.reset으로 특정 화면만 기록에 남기고 나머지 화면 기록을 삭제할 수 있어요.
레퍼런스
마지막 업데이트
도움이 되었나요?