GitHub Popular App Navigator使用总结

2019-07-21  本文已影响0人  Yue_Q

目录

createSwitchNavigator

SwitchNavigator 的用途是一次只显示一个页面。 默认情况下,它不处理返回操作,并在你切换时将路由重置为默认状态。
API

createSwitchNavigator(RouteConfigs, SwitchNavigatorConfig):

项目中使用
创建一个createSwitchNavigator类型的导航器

// 欢迎页
const InitNavigator = createStackNavigator({
    WelcomePage: {
        screen: WelcomePage,
        navigationOptions: {
            header: null,// 可以通过将header设为null 来禁用StackNavigator的Navigation Bar
        }
    }
});
// 其他页面
const MainNavigator = createStackNavigator({...}, {
    defaultNavigationOptions: {
        header: null,// 可以通过将header设为null 来禁用StackNavigator的Navigation Bar
    }
});
// 根Navigator
export const RootNavigator = createAppContainer(createSwitchNavigator({
    Init: InitNavigator,// 欢迎页
    Main: MainNavigator,// 其他页面
}, {
    navigationOptions: {
        header: null,// 可以通过将header设为null 来禁用StackNavigator的Navigation Bar
    }
}));

界面跳转工具类

export default class NavigationUtil {
    /**
     * 跳转到指定页面
     * @param params 要传递的参数
     * @param page 要跳转的页面名
     **/
    static goPage(params, page) {
        const navigation = NavigationUtil.navigation;
        if (!navigation) {
            console.log('NavigationUtil.navigation can not be null')
            return;
        }
        navigation.navigate(
            page,
            {
                ...params
            }
        )
    }

    /**
     * 返回上一页
     */
    static goBack(navigation) {
        navigation.goBack();
    }
    /**
     * 重置到首页
     */
    static resetToHomPage(params) {
        const {navigation} = params;
        navigation.navigate("Main");
    }
}

createBottomTabNavigator

相当于iOS里面的TabBarController,屏幕下方的标签栏。

image.png
API

createBottomTabNavigator(RouteConfigs, BottomTabNavigatorConfig):

  • RouteConfigs(必选):路由配置对象是从路由名称到路由配置的映射,告诉导航器该路由呈现什么。
  • BottomTabNavigatorConfig(可选):配置导航器的路由(如:默认首屏,navigationOptions,paths等)样式(如,转场模式mode、头部模式等)。

项目中使用

  _tabNavigator() {
        if (this.Tabs) {
            return this.Tabs;
        }
        const {PopularPage, TrendingPage, FavoritePage, MyPage} = TABS;// Tab列表
        const tabs = {PopularPage, TrendingPage, FavoritePage, MyPage};//根据需要定制显示的tab
        PopularPage.navigationOptions.tabBarLabel = '最热';//动态配置Tab属性
        return this.Tabs = createAppContainer(createBottomTabNavigator(tabs, {
                tabBarComponent: props => {
                    return <TabBarComponent theme={this.props.theme} {...props}/>
                }
            }
        ))
    }

createMaterialTopTabNavigator

image.png
API

createMaterialTopTabNavigator(RouteConfigs, TabNavigatorConfig):

  • RouteConfigs(必选):路由配置对象是从路由名称到路由配置的映射,告诉导航器该路由呈现什么。
  • TabNavigatorConfig(可选):配置导航器的路由(如:默认首屏,navigationOptions,paths等)样式(如,转场模式mode、头部模式等

从createMaterialTopTabNavigator API上可以看出createMaterialTopTabNavigator 支持通过RouteConfigs和 TabNavigatorConfig 两个参数来创建createMaterialTopTabNavigator导航器。
项目中使用

const TabNavigator = keys.length ? createAppContainer(createMaterialTopTabNavigator(
            this._genTabs(), {
                tabBarOptions: {
                    tabStyle: styles.tabStyle,
                    upperCaseLabel: false,//是否使标签大写,默认为true
                    scrollEnabled: true,//是否支持 选项卡滚动,默认false
                    style: {
                        backgroundColor: theme.themeColor,//TabBar 的背景颜色
                        height: 30//fix 开启scrollEnabled后再Android上初次加载时闪烁问题
                    },
                    indicatorStyle: styles.indicatorStyle,//标签指示器的样式
                    labelStyle: styles.labelStyle,//文字的样式
                },
                lazy: true
            }
        )) : null;

 _genTabs() {
        const tabs = {};
        const {keys, theme} = this.props;
        keys.forEach((item, index) => {
            if (item.checked) {
                tabs[`tab${index}`] = {
                    screen: props => <PopularTabPage {...props} tabLabel={item.name} theme={theme}/>,
                    navigationOptions: {
                        title: item.name
                    }
                }
            }
        });
        return tabs;
    }

const {navigation} = this.props;

navigation.navigate('Page2');
navigation.navigate('Page3',{ name: 'Devio' });

  1. Tab的信息是AsyncStorage存储。已key-value键值对存储
  2. 在Search页面添加Tab页,调用AsyncStorage存储新的key。
  3. 在退出Search页面发出新的Action更新标签。

createStackNavigator

createStackNavigator 提供APP屏幕之间切换的能力,它是以栈的形式还管理屏幕之间的切换,新切换到的屏幕会放在栈的顶部。
转场风格:默认情况下,createStackNavigator提供了转场过渡效果,在Android和iOS上过渡效果是不同的,这也是React Native重平台性的一个体现,在Android上从屏幕底部淡入,在iOS上是从屏幕的右侧划入,当然你也可以通过配置让StackNavigator支持屏幕从底部滑入的效果。
API

createStackNavigator(RouteConfigs, StackNavigatorConfig):

项目中使用
向DetailPage中传入参数,动态设置Detail页面的内容。Detail通过Params改变内容

onSelect={(callback) => {
               NavigationUtil.goPage({
                   theme,
                   projectModel: item,
                   flag: FLAG_STORAGE.flag_popular,
                   callback,
               }, 'DetailPage')
           }}

参考

『React Navigation 3x系列教程』createBottomTabNavigator开发指南
『React Navigation 3x系列教程』createMaterialTopTabNavigator开发指南
『React Navigation 3x系列教程』之createStackNavigator开发指南

上一篇下一篇

猜你喜欢

热点阅读