일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- computerscience
- 자바스크립트
- 그리디
- DFS
- cpu
- 국비지원취업
- git
- 패스트캠퍼스
- 너비우선탐색
- 백준
- 알고리즘
- 야놀자
- 국비지원
- js
- 컴퓨터공학
- CSS
- 컴퓨터과학
- 부트캠프
- CS
- BFS
- LinkSnap
- 코테
- 코딩테스트
- 프론트엔드개발자
- nodejs
- Javascript
- github
- 호이스팅
- html/css/js
- KAKAO
- Today
- Total
My Boundary As Much As I Experienced
RN) React-Navigation에서 useRoute 개념 및 사용법 본문
1. 스크린 이동하며 데이터를 같이 보내고 싶다면?
리액트 네이티브 상에서 페이지 이동할 때 useNavigation을 이용해야 된다.
import React from 'react';
import { View, Text, Button } from 'react-native';
import { useNavigation } from '@react-navigation/native';
import { HomeScreenNavigationProp } from '../types';
function HomeScreen() {
const navigation = useNavigation<HomeScreenNavigationProp>();
return (
<View>
<Text>Home Screen</Text>
<Button
title="Go to Details"
onPress={() =>
navigation.navigate('Details') // navigation을 사용하여 이동
}
/>
</View>
);
}
export default HomeScreen;
이때 웹개발자라면 페이지 이동 시 패러미터나 쿼리스트링을 이용하여 데이터를 주입하고 싶을 때가 있을 것이다.
리액트를 이용해봤으면 useSearchParams같은 훅이 리액트네이티브에도 있기를 기대할 것이다.
리액트 네이티브의 React-Navigation에도 당연히 이를 구현할 수 있는 훅이 따로 있다. 바로 useRoute이다.
2. useRoute훅을 이용하여 파라미터 추출하기
기본적으로 이게 전부다. 페이지 컴포넌트 최상단에서 useRoute를 사용하고 param들을 꺼내면 된다.
리액트의 useSearchParams와 거의 유사하지 않은가? 그러나 차이점이 하나 있는데,
바로 미리 타입들을 엄밀히 짜도록 강제한다는 점이다.
const route = useRoute()
const { param1, param2 } = route
내가 이동할 스택의 모든 라우트의 타입에서 어떤 라우트의 parameter를 가져올 건지를 정의해야한다.
이를 설정하는 방법을 아래에서 알아보겠다.
1. 스택네비게이터의 모든 pathname과 parameter들을 정리한 타입을 생성
나는 아래처럼 모든 라우트와 그 패러미터들의 타입을 정리하였다. (스택 별로 정리가 필요하다.)
// navigator.ts
export interface MainStackParamList extends ParamListBase {
Login: {
redirectTo?: string;
replace?: boolean;
};
BottomTab: undefined;
Detail: ItemType;
SignUp: undefined;
FindPassword: undefined;
FindUsername: undefined;
Webview: {
url: string;
title: string;
};
}
2. 원하는 페이지 내에 routeProp 타입 생성
useRoute에 제공할 RouteProp을 생성해야한다. RouteProp은 두 개의 인자를 받게 되는데, (RouteProp<T, V>)
첫 번째 인자로 위에서 생성해놨던 해당페이지가 존재하는 스택네비게이터 타입을 제공하고,
두 번째 인자로 그 중 어떤 페이지의 key값을 가져올 건지를 설정하면 된다.
import { type MainStackParamList } from "types/navigator";
import { useRoute, RouteProp, useNavigation } from "@react-navigation/native";
type WebviewRouteProp = RouteProp<MainStackParamList, "Webview">;
그 후 useRoute를 실행하여 변수에 할당해주고
이곳에서 지정해놓은 param들을 꺼내쓰면 된다. 끝!
const route = useRoute<WebviewRouteProp>(); // useRoute 설정
const { url, title } = route.params;
전체 코드
import { type MainStackParamList } from "types/navigator";
import { useRoute, RouteProp, useNavigation } from "@react-navigation/native";
type WebviewRouteProp = RouteProp<MainStackParamList, "Webview">;
const WebViewContainer = () => {
const route = useRoute<WebviewRouteProp>(); // useRoute 설정
const { url, title } = route.params;
// ...
return (
<SafeAreaView style={styles.container}>
<WebView
onLoadStart={() => setLoading(true)}
onLoadEnd={() => setLoading(false)}
onLoadProgress={({ nativeEvent }) => {
console.log("Loading progress:", nativeEvent.progress);
}}
source={{ uri: url }}
style={{ flex: 1 }}
/>
// ...
)
}
'FrontEnd > Frontend etc.' 카테고리의 다른 글
develop 브랜치에서 main 브랜치로 머지할 때 테스트서버 config를 프로덕션 config로 변경하기 (w. github-action) (0) | 2024.09.28 |
---|---|
Zustand를 사용할 때 immer를 사용하면 편한 점은 무엇일까 (0) | 2024.09.23 |
프론트엔드 단에서 '유저 서명이 박힌 이미지' 다운로드 기능 구현하기 (feat. canvas 태그로 이미지 로드 후 text 넣기, a태그로 download 링크 구현) (0) | 2024.08.09 |
WebShare API로 모바일 공유 기능 구현하기 (feat. navigator객체) (0) | 2024.07.31 |
프론트엔드 환경에 WEB3 지갑 SDK 연결 (MetaMask, Wepin) (0) | 2024.07.30 |