React Native ~ RNN - rohit120582sharma/Documentation GitHub Wiki
React Native Navigation provides 100% native platform navigation on both iOS and Android for React Native apps and has an easy to use Javascript API. React Native Navigation comes with optional redux support out of the box.
Install react-native-navigation
package
npm install --save react-native-navigation@latest
React Native Navigation changes a bit of how React Native works. The biggest difference is how we register the application. We no longer use AppRegistry.registerComponent
so we’ll swap out the index.ios.js
and index.android.js
with the following:
// index.ios.js
import Nav from './src/Nav';
// scr/Nav.js
import { Navigation } from 'react-native-navigation';
import { registerScreens } from './screens';
registerScreens(); // this is where you register all of your app's screens
// start single-screen based app
Navigation.startSingleScreenApp({
screen: {
title: 'Screen One',
screen: 'example.WelcomeScreen'
}
});
// or start tab based app
Navigation.startTabBasedApp({
tabs: [
{
label: 'One',
screen: 'example.FirstTabScreen', // this is a registered name for a screen
icon: require('../img/one.png'),
selectedIcon: require('../img/one_selected.png'), // iOS only
title: 'Screen One'
},
{
label: 'Two',
screen: 'example.SecondTabScreen',
icon: require('../img/two.png'),
selectedIcon: require('../img/two_selected.png'), // iOS only
title: 'Screen Two'
}
]
});
Every screen that you want to be able to place in a tab, push to the navigation stack or present modally needs to be registered. We recommend doing this in a central place, like screens/index.js
.
Since your screens will potentially be bundled with other packages, every screen component in your app must be registered with a unique name! Follow a namespacing convention like packageName.ScreenName
.
import { Navigation } from 'react-native-navigation';
import { Provider } from 'react-redux';
import { store } from '../services';
import WelcomeScreen from './WelcomeScreen';
import FirstTabScreen from './FirstTabScreen';
import SecondTabScreen from './SecondTabScreen';
import PushedScreen from './PushedScreen';
// register all screens of the app (including internal ones)
// using redux, pass your store and the Provider object from react-redux
export function registerScreens() {
Navigation.registerComponent('example.WelcomeScreen', () => WelcomeScreen);
Navigation.registerComponent('example.FirstTabScreen', () => FirstTabScreen, store, Provider);
Navigation.registerComponent('example.SecondTabScreen', () => SecondTabScreen, store, Provider);
Navigation.registerComponent('example.PushedScreen', () => PushedScreen, store, Provider);
}
If you want to do a navigation action like push a new screen over an existing one, take a look at the Screen API
.
In screens that were registered with Navigation you have access to this.props.navigation
on which you simply want to “push” a new screen to it.
It would look something like this:
// this would go inside the Component implementation of one of your screens, like FirstTabScreen.js
this.props.navigator.push({
screen: 'example.PushedScreen',
title: 'Pushed Screen'
});
It acts as side-drawer in screens/SideDrawer/SideDrawer.js
import React, { Component } from 'react';
import { View, Text, Dimensions, StyleSheet } from 'react-native';
class SideDrawer extends Component {
render(){
return (
<View style={styles.container}>
<Text>Side drawer</Text>
</View>
);
}
}
export default SideDrawer;
const styles = StyleSheet.create({
container: {
flex: 1,
paddingTop: 25,
backgroundColor: 'white',
width: Dimensions.get('window').width * 0.8
}
});
import SideDrawer from './SideDrawer/SideDrawer';
Navigation.registerComponent('example.SideDrawer', () => SideDrawer);
It is a simple JavaScript object. Add this if you want a side menu drawer in your app. It needs to be defined per-screen as following:
Navigation.startTabBasedApp({
tabs: [
{
label: 'One',
screen: 'example.FirstTabScreen', // this is a registered name for a screen
icon: require('../img/one.png'),
selectedIcon: require('../img/one_selected.png'), // iOS only
title: 'Screen One',
drawer: {
left: {
screen: 'example.SideDrawer'
}
}
},
{
label: 'Two',
screen: 'example.SecondTabScreen',
icon: require('../img/two.png'),
selectedIcon: require('../img/two_selected.png'), // iOS only
title: 'Screen Two',
drawer: {
left: {
screen: 'example.SideDrawer'
}
}
}
]
});
Nav bar buttons can be defined per-screen by adding static navigatorButtons = {...};
on the screen component definition. This object can also be passed when the screen is originally created; and can be overridden when a screen is pushed.
Navigation.startTabBasedApp({
tabs: [
{
label: 'One',
screen: 'example.FirstTabScreen', // this is a registered name for a screen
icon: require('../img/one.png'),
selectedIcon: require('../img/one_selected.png'), // iOS only
title: 'Screen One',
drawer: {
left: {
screen: 'example.SideDrawer'
}
},
navigatorButtons: {
leftButtons: [
{
icon: require('../../img/navicon_menu.png'),
title: 'Menu',
id: 'SideDrawerToggle'
}
]
}
}
]
});
Handle onPress
events for the buttons by setting your handler with navigator.setOnNavigatorEvent(callback)
in each screen-component where you want to handle the event.
class FirstTabScreen extends Component {
constructor(props){
super(props);
this.props.navigator.setOnNavigatorEvent(this.onNavigatorEvent);
}
onNavigatorEvent = (event) => {
switch(event.type){
case 'ScreenChangedEvent':
switch(event.id){
case 'willAppear':
break;
case 'didAppear':
break;
default:
break;
}
break;
case 'NavBarButtonPress':
if(event.id === 'SideDrawerToggle'){
this.props.navigator.toggleDrawer({
side: 'left',
});
}
break;
default:
break;
}
}
}
Opening a modal is as easy as pushing a new screen onto the stack.