React-Navigation 入门到高阶使用

React-Navigation 入门到高阶使用

对于新手入坑React-Native,可能搭建项目没有好用的脚手架会浪费很多的时间在查找,尝试和验证,例如react-navigation,必备但是又不需要精研的组件,那么接下来你想要的都会有:

React-Navigation 官网直通车,对于新手使用,我只说关键的地方

话不多说,在你的项目里install package

npm install react-navigation

npm install react-native-reanimated react-native-gesture-handler react-native-screens react-native-safe-area-context @react-native-community/masked-view

在强调一次,React-Native版本>= 0.60 会自动linking,
否则需要你手动去linking,官网都有说明:

React-Native >= 0.60
cd ios

pod install

React-Native < 0.60, 还需要:

react-native link react-native-reanimated
react-native link react-native-gesture-handler
react-native link react-native-screens
react-native link react-native-safe-area-context

下面的图你会看到auto-lingk...

pod.png

当然针对你的项目andoridx,你还需要jetifier

npm install --save-dev jetifier
在package.json中

"scripts": {
  "postinstall": "jetifier -r"
}

默认你的React-Native已经升级0.60及以上,运行脚本

npm run postinstall

在MainActivity.java中

package com.reactnavigation.example;

import com.facebook.react.ReactActivity;
+ import com.facebook.react.ReactActivityDelegate;
+ import com.facebook.react.ReactRootView;
+ import com.swmansion.gesturehandler.react.RNGestureHandlerEnabledRootView;
public class MainActivity extends ReactActivity {

  @Override
  protected String getMainComponentName() {
    return "Example";
  }
+  @Override
+  protected ReactActivityDelegate createReactActivityDelegate() {
+    return new ReactActivityDelegate(this, getMainComponentName()) {
+      @Override
+      protected ReactRootView createRootView() {
+        return new RNGestureHandlerEnabledRootView(MainActivity.this);
+      }
+    };
+  }
}

在使用的地方(app.js或index.js)引入头文件即可

import 'react-native-gesture-handler';

那现在准备工作已经OK了,其实准备工作和官网无差别,接下来是如何无衔接的使用stackNavigator和BottomTabNavigator。

Navigation.png

官网中说createBottomTabNavigator有routes和config,

  • routes是设置单一界面,里面的navigationOptions设置的是tabBar的所有属性:如title,tabBarIcon,tabBarIcon,tabBarOnPress...等等。
    tabBarIcon中自有:
{ focused: boolean, horizontal: boolean, tintColor: string }

focused: 是否被选择
horizontal:是否旋转手机
tintColor:选择的颜色

tabBarOnPress当tabBar选择要继承defaultHandler,否则会无效:

({navigation, defaultHandler}) => {
             defaultHandler()       
                },
  • config是tabBar的统一设置,如initialRouteName,初始加载route,tabBarOptions设置的一些属性,官网都有说明,简单说几个常用的:activeTintColor,被点击的颜色;labelStyle,名称设置;style:tabBar约束设置。

具体使用如下:

const tabNavigator = createBottomTabNavigator(
    {
        Home: {
            screen: TTHomeScreen,
            navigationOptions: {
                tabBarIcon: ({focused, tintColor}) => (
                    <Image source={focused ? require('../image/home.png') : require('../image/unHome.png')}
                           style={{width: 25, height: 25}}/>
                ),
                tabBarOnPress: ({navigation, defaultHandler}) => {
                    defaultHandler()
                    console.log(navigation.state.routeName)
                },
            }
        },
        Car: {
            screen: TTCarScreen,
            navigationOptions: {
                tabBarIcon: ({focused, tintColor}) => (
                    <Image source={focused ? require('../image/car.png') : require('../image/unCar.png')}
                           style={{width: 25, height: 25}}/>
                ),
                tabBarOnPress: ({navigation, defaultHandler}) => {
                    defaultHandler()
                    console.log(navigation.state.routeName)
                }
            }
        },
        Mine: {
            screen: TTMineScreen,
            navigationOptions: {
                tabBarIcon: ({focused, tintColor}) => (
                    <Image source={focused ? require('../image/mine.png') : require('../image/unMine.png')}
                           style={{width: 25, height: 25}}/>
                ),
                tabBarOnPress: ({navigation, defaultHandler}) => {
                    defaultHandler()
                    console.log(navigation.state.routeName)
                }
            }
        },
        Settings: {
            screen: TTSettingScreen,
            navigationOptions: {
                tabBarIcon: ({focused, tintColor}) => (
                    <Image source={focused ? require('../image/set.png') : require('../image/unSet.png')}
                           style={{width: 25, height: 25}}/>
                ),
                tabBarOnPress: ({navigation, defaultHandler}) => {
                    defaultHandler()
                    console.log(navigation.state.routeName)
                },
            }
        }
    },
    {
        /* Other configuration remains unchanged */
        tabBarOptions: {
            activeTintColor: '#e91e63',
            labelStyle: {
                fontSize: 14,
            },
            style: {
                backgroundColor: 'white',
            },

        },
    }
);

设置完这些你会发现,缺少设置stackNavitor,也没有跳转路由,
先来设置路由类

创建一个新的类TTStackRouter

const NavigatorScreen = {
    TTHomeDetailScreen: {
        screen: TTHomeDetailScreen,
        navigationOptions:{
            title: '详情'
        }
    },
    <!--可以添加更多的跳转类,如TTHomeDetailScreen-->
}

export default NavigatorScreen;

把刚刚的tabNavigator添加进来,
属性设置在项目中自行参考是否需要

<!--navigator设置后面都有具体描述可以参考-->

NavigatorScreen.mainScreen = {
    screen: tabNavigator,
    navigationOptions: {
        // headerShown: false,       // 隐藏header
        headerStyle: {
            elevation: 0,         // 移除 Android Header 阴影
            shadowOpacity: 0,     // 移除 iOS Header 阴影
        },
        headerTitleAlign: 'center',              // Android 标题居中
        headerBackTitleVisible: false,           // 隐藏 iOS 返回按钮标题
        headerPressColorAndroid: 'transparent',  // 移除 Android 点击返回按钮效果
        cardStyleInterpolator: CardStyleInterpolators.forHorizontalIOS,   // 切换路由时水平动画
        headerStyleInterpolator: HeaderStyleInterpolators.forUIKit, // 切换路时 Header 动画
    },
};

路由配置好了,使用的时候会发现,navigator的routerName都是mainScreen,现在去为每个模块配置routerName


// 给tabNavigator添加headerTitle
tabNavigator.navigationOptions = ({ navigation }) => {
    const { routeName } = navigation.state.routes[navigation.state.index];
    // You can do whatever you like here to pick the title based on the route name
    const headerTitle = routeName;

    return {
        headerTitle,
    };
};

最后配置stackNavigator,并输出creatAppContainer,到现在完成了react-navigation的简单项目配置

const mainScreenStack = createStackNavigator(NavigatorScreen, {
    initialRouteName: 'mainScreen',
    defaultNavigationOptions: {
        headerBackTitleVisible: false,           // 隐藏 iOS 返回按钮标题
    }
});

const AppContainer = createAppContainer(mainScreenStack);


export default AppContainer;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345