์๋ ํ์ธ์ Foma ์ ๋๋ค!
์ด๋ฒ์ ์ ๋ฒ Navigation์ ์ด์ฉํ์ฌ ์คํฌ๋ฆฐ ์ด๋ํ๊ธฐ ๊ธ์ ์ด์ด์ Bottom-tab์ ๋ง๋ค์ด ํ๋ฉด์ ์ด๋ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
(ํด๋น ์ฝ๋ ๊ธฐ๋ฐ์ผ๋ก ์งํ๋๊ธฐ ๋๋ฌธ์ ํน์ ์๋ณด์ ๋ถ๋ค์ ๋ณด๊ณ ์์ฃผ์ธ์!)
๋ฐ๋ก ์์ํ ๊ฒ์~
์ธ์ด๋ TypeScript, ํ๊ฒฝ์ Expo๋ก ์งํ ํ๊ฒ ์ต๋๋ค!
Install
Bottom-tabs
npm install @react-navigation/bottom-tabs
Vector-icons
npm install @expo/vector-icons
index.tsx
import
๋ฐํ ํญ์ ๋ง๋๋๋ฐ ํ์ํ ๋ชจ๋์ import ํด์ค๋๋ค.
import { createNativeStackNavigator } from "@react-navigation/native-stack";
import { createBottomTabNavigator } from "@react-navigation/bottom-tabs";
import { NavigationContainer } from "@react-navigation/native";
import { FontAwesome, Entypo } from "@expo/vector-icons";
import ScreenA from "../screens/ScreenA";
import ScreenB from "../screens/ScreenB";
Navigation Container
Navigation Container ์์ ์์์ด ๋ ๋ค์ด๊ฒ์ดํฐ์ธ Root Navigator๋ฅผ ๋ฃ์ด ์ค๋๋ค.
export default function Navigation() {
return (
<NavigationContainer>
<RootNavigator />
</NavigationContainer>
);
}
Root Navigator
Stack Navigator๋ฅผ ์์ฑํด ์ค ๋ค Stack ์์ Root๊ฐ ๋ ํ๋ฉด์ธ BottomTabNavigator๋ฅผ ๋ฃ์ด ์ค๋๋ค.
const Stack = createNativeStackNavigator();
function RootNavigator() {
return (
<Stack.Navigator>
<Stack.Screen name="Root" component={BottomTabNavigator} />
</Stack.Navigator>
);
}
Bottom Tab Navigator
Bottom Tab Navigator๋ฅผ ์์ฑํด ์ฃผ๊ณ ์ด๊ธฐ ํ๋ฉด(initialRouteName)์ Screen A๋ก ์ง์ ํด ์ค๋๋ค.
๊ทธ๋ฆฌ๊ณ ํด๋น ๋ฐํ ํญ์ Screen A, Screen B ํ๋ฉด์ ๋ฃ์ด์ค๋๋ค.
const BottomTab = createBottomTabNavigator();
function BottomTabNavigator() {
return (
<BottomTab.Navigator initialRouteName="ScreenA">
<BottomTab.Screen name="ScreenA" component={ScreenA} />
<BottomTab.Screen name="ScreenB" component={ScreenB} />
</BottomTab.Navigator>
);
}
Test
์๊น์ง ์งํํ ๋ค ํ๋ฉด์ ํ์ธํ๋ฉด ๋ฐํ ํญ์ ์๋ Screen A, Screen B ๋ฒํผ์ ๋๋ฅด๋ฉด ๊ฐ ํ๋ฉด์ผ๋ก ์ด๋๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
Hide Root Header
ํ๋ฉด์ ๋ณด๋ฉด Root ํค๋์, ๊ฐ ํ๋ฉด์ ํค๋๊ฐ ๊ฒน์น๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
Root ํค๋๋ฅผ ์จ๊ธฐ๋ ์ฝ๋๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
index.tsx์์ RootNavigator์์ Root ํ๋ฉด์ options์ headerShown์ false๋ก ํด์ค๋๋ค.
function RootNavigator() {
return (
<Stack.Navigator>
<Stack.Screen
name="Root"
component={BottomTabNavigator}
options={{ headerShown: false }}
/>
</Stack.Navigator>
);
}
์๋์ ๊ฐ์ด ํด๋น ์คํฌ๋ฆฐ์ ํค๋๋ง ๋ณด์ด๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
Icon
์ ํ๋ฉด์์ ๋ณด๋ฉด ํด๋น ๋ฐํ ํญ ๋ค๋น๊ฒ์ดํฐ์ ์์ด์ฝ์ด ์ด์ํ ๊ฑธ ๋ณผ ์ ์์ต๋๋ค.
์์์ ๋ฏธ๋ฆฌ vector-icon ๋ชจ๋์ ์ค์น ํ๋๋ฐ์.
ํด๋น FontAwesome์ ์ด์ฉํ์ฌ BottomTab์ Screen์ options์ tabBarIcon์ ์ด๋ฆ, ์ฌ์ด์ฆ, ์ปฌ๋ฌ ๋ฑ์ ์ง์ ํด ์ค๋๋ค.
function BottomTabNavigator() {
return (
<BottomTab.Navigator initialRouteName="ScreenA">
<BottomTab.Screen
name="ScreenA"
component={ScreenA}
options={{
tabBarIcon: () => (
<FontAwesome name="home" size={24} color={"black"} />
),
}}
/>
<BottomTab.Screen
name="ScreenB"
component={ScreenB}
options={{
tabBarIcon: () => (
<Entypo name="add-to-list" size={24} color={"black"} />
),
}}
/>
</BottomTab.Navigator>
);
์๋์ ๊ฐ์ด ์ง์ ํด ์ค ์ฌ์ด์ฆ ์ปฌ๋ฌ ์ด๋ฆ๋๋ก ์์ด์ฝ์ด ๋ณด์ด๊ฒ ๋ฉ๋๋ค.
์ง์ ์ง์ ํด ์ค ์๋ ์์ง๋ง ๋ง์ฝ ๊ธฐ๋ณธ ๊ฐ์ผ๋ก ์ธํ ํ๊ณ ์ถ๋ค๋ฉด tabBarIcon์ ํ๋ผ๋ฏธํฐ๋ก ๊ธฐ๋ณธ์ผ๋ก ์ง์ ํ ํ๋กํผํฐ๋ฅผ ์ ๋ ฅํด ์ค๋๋ค.
<BottomTab.Navigator initialRouteName="ScreenA">
<BottomTab.Screen
name="ScreenA"
component={ScreenA}
options={{
tabBarIcon: ({ color, size }) => (
<FontAwesome name="home" size={size} color={color} />
),
}}
/>
<BottomTab.Screen
name="ScreenB"
component={ScreenB}
options={{
tabBarIcon: ({ color, size }) => (
<Entypo name="add-to-list" size={size} color={color} />
),
}}
/>
์๋์ ๊ฐ์ด ๊ธฐ๋ณธ์ผ๋ก ์ธํ ๋ ์,์ฌ์ด์ฆ๊ฐ ์ง์ ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
๋๊ธ