프로젝트를 진행하던 와중에 가장 위쪽에 Tab을 두어야 할 일이 생겼다.
본래는 해당 UI를 직접 구현하려 하였지만, appStack으로 구현을 해버리면 페이지가 넘어갈 때 마다 이전 페이지 위에 덮어쓰는 식으로 stack이 쌓였다. 그렇기 때문에 라이브러리를 하나 찾아 주었다.
프로젝트를 진행하면서 사용한 Navigation은 아래와 같다. (많이도 썼다)
각각이 어떤 Navigation인지는 React Navigation에 가면 자세히 나와있다. 구조만 간략히 말하면 RootNavigator에서 Token이 있는지를 검사하고 Token이 있다면 appStack으로, Token이 없다면 AuthStack으로 넘긴다. appStack으로 넘어오면 가장 먼저 반기는 Page가 바로 ClientTabs이다. 이름을 저렇게 설정해 주었지만, 하단 네비게이션이다.
위처럼 세팅되어 있는 Navigation에 상단 탭을 추가하려 한다. 모든 페이지에서 사용할 것은 아니기 때문에 파일을 추가하여 정의해준 뒤, appStack에서 정의한 후 원하는 진입점에서 Routing 시키면 될 것이다.
좀 빨리 찾았더라면 고생을 덜 할 수 있었을 텐데.. 라는 아쉬움이 남지만 하나 알아간다는 생각에 아쉬움을 접어 두자
https://reactnavigation.org/docs/material-top-tab-navigator/
위 사이트에서 사용방법이 자세히 나와있다. 하지만 나는 특정 페이지에서만 Top Tab을 불러주어야 하기 때문에 Custom이 좀 필요했다.
const Tab = createMaterialTopTabNavigator();
export default function TopBarNavigation() {
return (
<><Header title={'스위트룸'} backScreen='Mystudy' />
<Tab.Navigator
initialRouteName="SuiteRoomDashboard"
screenOptions={{
tabBarActiveTintColor: '#050953',
tabBarLabelStyle: { fontSize: 14, color : '#050953' },
tabBarStyle: { backgroundColor: 'white' },
}}
>
<Tab.Screen
name="대시보드"
component={SuiteRoomDashboard}
options={{ tabBarLabel: '대시보드' }} />
<Tab.Screen
name="칸반보드"
component={SuiteRoomCanbanBoard}
options={{ tabBarLabel: '칸반보드' }} />
<Tab.Screen
name="내출석부"
component={SuiteRoomMyAttendance}
options={{ tabBarLabel: '내출석부' }} />
<Tab.Screen
name="스위트룸"
component={SuiteRoomDetailStart}
options={{ tabBarLabel: '스위트룸' }} />
</Tab.Navigator></>
);
}
우선 위와 같이 Top Tab을 작성해둔다.
<App.Screen
name="TabBarNavigation"
component={TabBarNavigation}
options={{
headerShown: false,
}}
/>
하던 대로 appStack에 TabBarNavigation을 추가해준다. 그 다음에서 좀 애를 먹었는데, Top Bar가 달린 페이지로 바로 이동시키는 것이 아니라, Top Bar를 설정한 TabBarNavigation으로 이동시켜주어야 한다.
onPress={() => {
navigation.navigate('TabBarNavigation');
}}>
위와 같이 말이다. 그럼 성공적으로 원하는 화면을 볼 수 있을 것이다.
이후 사용할 일이 좀 있을 것 같아서 Props들을 정리해둔다. 다 공식 메뉴얼에 있는 내용들이다.
다른 props들은 사용하면 될 것 같은데 ScreenOptions을 찾아서 사용하는게 좀 어려웠다. 사실 공식문서 해석했으면 5분도 안걸렸을것 같은데 괜히 혼자 박치기 하느라 오래 걸렸다.
프로젝트에는 누르지 않은 버튼은 회색으로 보이고, 눌렀을 경우에만 색깔을 입히고 싶었다.
screenOptions={{
tabBarActiveTintColor: '#050953',
tabBarInactiveTintColor : '#B8B8B8',
tabBarLabelStyle: { fontSize: 14, fontWeight : 'bold' },
tabBarStyle: { backgroundColor: 'white' },
}}
위와 같이 설정해주면 아래 사진과 같은 top tap navigation을 얻을 수 있다.