[React Native] Navigation (Tab)

2020. 12. 30. 19:44React/React Native

1. Navigation

React Native는 지속적으로 개발되어 가고 있기 때문에, 버전별 사용법이 다를 수 있다. 그렇기 때문에 공식 문서(reactnavigation.org/docs/getting-started)를 확인하여 제작하는 것을 권장한다.

 

설치된 목록은 package.json 파일에서 확인할 수 있다.

// Navigation 설치
npm install @react-navigation/native

// 의존성 설치
npm install react-native-reanimated react-native-gesture-handler react-native-screens react-native-safe-area-context @react-native-community/masked-view

npx pod-install

 

 

 

2. Tab Navigator

1) Tab Navigator 설치

npm install @react-navigation/bottom-tabs

2) Linking

Tab Navigator도 Stack Navigator와 마찬가지로 NavigationContainer로 감싸주어야 하며, Tab Navigator를 사용하기 위해 createBottomTabNavigator 메서드를 이용해야한다.

import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import TabHomeScreen from './src/home_tab';
import TabUserScreen from './src/user_tab';

const Tab = createBottomTabNavigator();

class App extends Component {
 
  render() {
    return (
      
      <NavigationContainer>
        <Tab.Navigator>
          <Tab.Screen
            name="Home" component={TabHomeScreen}
          />
          <Tab.Screen
            name="User" component={TabUserScreen}
          />
        </Tab.Navigator>
      </NavigationContainer>
...
import React, { Component } from 'react';
import { View, Text, Button } from 'react-native';

class TabHomeScreen extends Component {

  render() {
    return (
        <View style={{
            flex: 1,
            alignItems: 'center',
            justifyContent: 'center'
        }}>
            <Text>Home Screen</Text>
        </View>
    )
  }
}

export default TabHomeScreen;

3) Style

Tab Navigator의 경우에는 공통으로 사용되는 부분이기에 Tab.Navigator 내부에 정의가 된다.

import 'react-native-gesture-handler';
import React, { Component } from 'react';
import { View, Text, StyleSheet, Image, Button, Linking } from 'react-native';
import { NavigationContainer } from '@react-navigation/native';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import TabHomeScreen from './src/home_tab';
import TabUserScreen from './src/user_tab';
import TabMessageScreen from './src/message_tab';

const Stack = createStackNavigator();
const Drawer = createDrawerNavigator();
const Tab = createBottomTabNavigator();

const TabBarIcon = (focused, name) => {
  let iconImagePath;

  if(name == 'Home') {
    iconImagePath = require('./src/assets/pics/homeicon.png')
  } else if (name == 'User') {
    iconImagePath = require('./src/assets/pics/user.png')
  } else if (name == 'Message') {
    iconImagePath = require('./src/assets/pics/message.png')
  }

  return (
    <Image
      style={{width: focused ? 24 : 20, height: focused ? 24 : 20}}
      source={iconImagePath}
    />
  )
}

class App extends Component {
 
  render() {
    return (
      
      <NavigationContainer>
        <Tab.Navigator
          initialRouteName="Home"
          tabBarOptions={{
            activeBackgroundColor: 'skyblue',
            activeTintColor: 'blue',
            inactiveTintColor: '#fff',
            style: {
              backgroundColor: '#c6cbef'
            },
            labelPosition: 'beside-icon'
          }}
          screenOptions={({route}) => ({ //각 탭에 그림 삽입 및 선택 효과
            tabBarLabel: route.name,
            tabBarIcon: ({focused})=> (
              TabBarIcon(focused, route.name) // 함수 호출
            )
          })}
        >
          <Tab.Screen
            name="Home" component={TabHomeScreen}
          />
          <Tab.Screen
            name="User" component={TabUserScreen}
          />
          <Tab.Screen
            name="Message" component={TabMessageScreen}
          />
        </Tab.Navigator>
      </NavigationContainer>

...

 

 

728x90

'React > React Native' 카테고리의 다른 글

[React Native] Nesting Navigators  (0) 2020.12.31
[React Native] React Native Vector Icons  (0) 2020.12.31
[React Native] Navigation (Drawer)  (0) 2020.12.28
[React Native] Navigation (Stack)  (0) 2020.12.25