유미의 기록들

[React Native -11] Drawer Navigation 본문

MDLAB 기록/차량부품거래애플리케이션

[React Native -11] Drawer Navigation

지유미 2022. 11. 23. 10:34
728x90
반응형

Stack과 Tab을 함께 사용하는 것을 구현해보았다 여기서 Drawer Navigation을 추가할 것이다

Drawer 내비게이션

Drawer 내비게이션 라이브러리 설치

npm install @react-navigation/drawer

추가 라이브러리 설치

npm install react-native-gesture-handler react-native-reanimated

❔ React Native 개발을 하다가 reanimated 에러가 발생하는 경우가  있다. 다른 라이브러리와 충돌하면서 생기는 것인데

Reanimated가 왜 필요할까 

 

React Native에서 JS Thread가 처리해야할 작업의 양이 많아서 UI에 비해  JS Thread의 작업이 빈번하게 지연되는 문제가 발생한다 Reanimated는 이런 문제를 해결하기 위해 개발된 라이브러리이다 

 

❗ 우리 프로젝트에서 Vision Camera의 라이브러리와 react-native-reanimated 라이브러리가 충돌을 해서 error가 발생하였는데 reanimated  버전을  "react-native-reanimated": "^2.10.0" 으로 맞춤으로써 해결하였다

 

Drawer 내비게이션 적용하기

stack과 비슷하게 적용할 수 있는 것을 볼 수있다

 

App.js

import React,{Component} from 'react';
import { createDrawerNavigator } from '@react-navigation/drawer';
import { NavigationContainer } from '@react-navigation/native';

import Home from "./src/screens/Home";
import About from "./src/screens/About";
const Drawer = createDrawerNavigator();

class App extends Component{
  render(){
    return (
      <NavigationContainer>
        <Drawer.Navigator useLegacyImplementation initialRouteName="Home">
          <Drawer.Screen name="Home" component={Home} />
          <Drawer.Screen name="About" component={About} />
        </Drawer.Navigator>
      </NavigationContainer>
    );
  }
}
export default App;

 

 

 

 

프로젝트에 적용해보기

지금까지 프로젝트에는 Stack과 Bottom Tab을 사용하였는데 Drawer를 추가해보겠다 

일단 홈화면에만 메뉴 아이콘을 추가해서 Drawer Navigation이 나오도록 하기 위해  Tab 안에 Drawer를 넣기로 구상하였다

 

Tab.js

 <Tab.Screen name="Drawers" component={Drawers}
    options={{title:"홈", headerShown:false , unmountOnBlur:Platform.OS ==='android' ?true:false,
    tabBarIcon:({focused, color, size})=>{
     return <Icon name={"home"} color={color} size={size} ></Icon>
  }
 }}/>

Drawer.js

import React,{Component} from 'react';
import { createDrawerNavigator } from "@react-navigation/drawer";

import About from "../goods/side/components/about";
import Detail from "../goods/side/components/detail";
import Home from "../goods/list/components/home";

const Drawer=createDrawerNavigator();

class Drawers extends Component{
  render(){
    return (
      <Drawer.Navigator screenOptions={{drawerPosition:'right'}}>
          <Drawer.Screen name="Home" component={Home} options={{headerShown:false}}/>
          <Drawer.Screen name="About" component={About} />
          <Drawer.Screen name="Detail" component={Detail} />
    </Drawer.Navigator>
    );
  }
}
export default Drawers;

Drawer Options

- drawerPosition : 드로어 위치 설정 (디폴트는 왼쪽)

- drawerBackgroundColor: 드로어의 배경색상

- contentComponent : 드로어에 대한 props를 받을 수 있음

 

 

Home.js  -> 아이콘을 눌렀을 때 메뉴바가 나오도록

<TouchableOpacity onPress={()=> this.props.navigation.openDrawer()}>
    <IconMenu name="menu" size={25} color="white" />
</TouchableOpacity>

 

실행화면

ScreenA Page로 가는 Stack도 추가 해보았다

 

728x90
반응형
Comments