初識react-navigation3.x

新建項目:react-native init demo
安裝react-navgation3.x

yarn add react-navigation
# or with npm
# npm install --save react-navigation

react-native-gesture-handler組件庫為react-navgation使用的第三方庫,只要作用于手勢左右滑動。

yarn add react-native-gesture-handler
# or with npm
# npm install --save react-native-gesture-handler
react-native link react-native-gesture-handler

在React Navigation中有以下導(dǎo)航器:
createStackNavigator: 類似于普通的Navigator,屏幕上方導(dǎo)航欄;;
createBottomTabNavigator:屏幕底部Tab;
createMaterialTopTabNavigator:屏幕頂部Tab;
createDrawerNavigator: 抽屜效果;
createSwitchNavigator:一次只顯示一個頁面,無法執(zhí)行回退操作。
新建AppNavigator.js文件,將index.js文件中的入口文件替換掉。

const InitNavigator=createStackNavigator({
    WelcomePage:{
        screen:WelcomePage,
        navigationOptions:{
            header:null,//可以通過header:null來禁用StackNavigator默認(rèn)的Navigation
        }
    }
});


const MainNavigator=createStackNavigator({
    HomePage:{
        screen:HomePage,
        navigationOptions:{
            header:null
        }
    },
    DetailPage:{
        screen:DetailPage,
        navigationOptions:{
            header:null
        }
    }
});

export default createAppContainer(createSwitchNavigator({
    Init:InitNavigator,
    Main:MainNavigator
},{
    navigationOptions:{
        header:null
    }
}))

此處為兩個導(dǎo)航器:InitNavigator和MainNavigator,用createSwitchNavigator控制其一次只顯示一個導(dǎo)航器。
為方便跳轉(zhuǎn)回退等操作,可以封裝NavigationUtil.js文件。

export default class NavigationUtil{
    /**
     * 跳轉(zhuǎn)到指定頁面
     * @param params 要傳遞的參數(shù)
     * @param page 要跳轉(zhuǎn)的頁面名
     **/
    static goPage(params, page) {
        const navigation = NavigationUtil.navigation;
        if (!navigation) {
            console.log('NavigationUtil.navigation can not be null')
            return;
        }
        navigation.navigate(
            page,
            {
                ...params
            }
        )
    }
    /**
     * 返回上一頁
     * @param navigation
     */
    static goBack(navigation) {
        navigation.goBack();
    }
    /**
     * 重置到首頁
     * @param navigation
     */
    static resetToHomePage(params) {
        const {navigation} = params;
        navigation.navigate("Main");
    }
}

因為涉及跨導(dǎo)航之間的跳轉(zhuǎn)操作,故用NavigationUtil.navigation來起到緩存navigation對象的作用,方便跳轉(zhuǎn)等操作。
在HomePage中使用BottomTabNavigator

type Props = {};
export default class HomePage extends Component<Props> {
    _tabNavigator() {
        return createAppContainer(createBottomTabNavigator({
            PopularPage: {
                screen: PopularPage,
                navigationOptions: {
                    tabBarLabel: '最熱',
                    tabBarIcon:({tintColor, focused}) => (
                        <MaterialIcons
                            name={'whatshot'}
                            size={26}
                            style={{color: tintColor}}
                        />
                    ),
                }
            },
            TrendingPage: {
                screen: TrendingPage,
                navigationOptions: {
                    tabBarLabel: '趨勢',
                    tabBarIcon: ({tintColor, focused}) => (
                        <Ionicons
                            name={'md-trending-up'}
                            size={26}
                            style={{color: tintColor}}
                        />
                    ),
                }
            },
            FavoritePage: {
                screen: FavoritePage,
                navigationOptions: {
                    tabBarLabel: '收藏',
                    tabBarIcon: ({tintColor, focused}) => (
                        <MaterialIcons
                            name={'favorite'}
                            size={26}
                            style={{color: tintColor}}
                        />
                    ),
                }
            },
            MyPage: {
                screen: MyPage,
                navigationOptions: {
                    tabBarLabel: '我的',
                    tabBarIcon: ({tintColor, focused}) => (
                        <Entypo
                            name={'user'}
                            size={26}
                            style={{color: tintColor}}
                        />
                    ),
                }
            }
        }))
    }

    render() {
        NavigationUtil.navigation=this.props.navigation
        const Tab = this._tabNavigator();
        return (
            <Tab/>
        );
    }
}

此處可配合react-native-vector-icons第三方圖標(biāo)庫使用。
在PopularPage.js文件中使用MaterialTopTabNavigator

type Props = {};
export default class PopularPage extends Component<Props> {
    render() {
        const TabNavigator = createAppContainer(createMaterialTopTabNavigator({
            PopularTab1: {
                screen: ()=><PopularTab tabLabel={'TAB1'}/>,
                navigationOptions: {
                    title: 'tab1'
                }
            },
            PopularTab2: {
                screen: PopularTab,
                navigationOptions: {
                    title: 'tab2'
                }
            }
        }));
        return (<View style={{flex:1,marginTop:30}}><TabNavigator/></View>);
    }
}

class PopularTab extends Component<Props> {
    render() {
        const {tabLabel} = this.props;
        return (
            <View style={styles.container}>
                <Text style={styles.welcome}>{tabLabel}</Text>
                <Text onPress={()=>{
                    NavigationUtil.goPage({},'DetailPage')
                }}>跳轉(zhuǎn)到詳情頁</Text>
            </View>
        );
    }
}

此頁面在HomePage的導(dǎo)航器中,所以直接用props的中navigation對象進(jìn)行跳轉(zhuǎn)的時候需要在HomePage中緩存navigation對象才可以進(jìn)行操作。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,257評論 4 61
  • 一、開源庫介紹 今年1月份,新開源的React-natvigation庫備受矚目。在短短不到3個月的時間,gith...
    德山_閱讀 2,361評論 0 19
  • 流程測試流程 1.根據(jù)需要測試的流程,先畫流程圖 2.根據(jù)流程圖,將每個流程的接口測試連接起來 HTTP Cook...
    蘭戎閱讀 232評論 0 0
  • 那是個炎熱的下午,我在車站偶遇到了她,之前只是跟同事在她店里買過幾次東西,聊過短短的幾次,雖然幾次談話都比較...
    汩月閱讀 333評論 0 0

友情鏈接更多精彩內(nèi)容