6

我正在尝试使用 react-native-navigation,但我遇到了一个简单的问题。

该应用程序有一个没有标签的登录页面。(非常类似于 facebook 登录页面)(图片参考 - 图片只是为了给出一个想法。图片礼貌 - Google 用户登录后,我想转换为基于标签的应用程序,并且我希望两者都有不同的导航堆栈选项卡(就像在Quora这样的应用程序中发生的那样)(图片参考 -同样图片只是一个参考

我正在使用 mobx 进行状态管理。

我知道这是一个常见的用例,但我对我知道的两个选项感到困惑 -

  1. 提供对用户登录变量的反应,并从单屏应用程序更改为基于选项卡的应用程序。(唯一的问题是当对 isLoggedIn 的反应发生时缺少动画)例如 - App.js

    constructor() {
    reaction(() => auth.isLoggedIn, () => app.navigateToHome())
    reaction(() => app.root, () => this.startApp(app.root));
    app.appInitialized();
    

    }

    startApp(root){
        switch (root) {
          case 'user.login':
            Navigation.startTabBasedApp({
              tabs: [
                {
                  label: 'One',
                  screen: 'user.login',
                  icon: require('./assets/one.png'),
                  selectedIcon: require('./assets/one_selected.png'),
                  navigatorStyle: {},
                }
              ]
              screen: {
                screen: root,
                title: 'Login',
                navigatorStyle: {
                  screenBackgroundColor: colors.BACKGROUND,
                  statusBarColor: colors.BACKGROUND
                },
                navigatorButtons: {}
              }
            })
            return ;
          case 'user.home':
            Navigation.startTabBasedApp({
              tabs: [
                {
                  label: 'One',
                  screen: 'user.home',
                  icon: require('./assets/one.png'),
                  selectedIcon: require('./assets/one_selected.png'),
                  navigatorStyle: {},
                },
                {
                  label: 'Two',
                  screen: 'user.home',
                  icon: require('./assets/two.png'),
                  selectedIcon: require('./assets/two_selected.png'),
                  title: 'Screen Two',
                  navigatorStyle: {},
                }
              ],
              animationType: 'slide-down',
            });
          return;
          default:
              console.error('Unknown app root');
        }
      }
    
  2. 使用单屏应用程序,但在主屏幕中实现选项卡。使用这种方法,我必须自己为两个选项卡实现不同的导航堆栈。(react-native-navigation 已经实现了这个。所以,不用担心方法 1 中关于导航堆栈的问题)

例如 - App.js

Navigation.startSingleScreenApp({
          screen: {
            screen: root,
            title: 'Login',
            navigatorStyle: {
              screenBackgroundColor: colors.BACKGROUND,
              statusBarColor: colors.BACKGROUND
            },
            navigatorButtons: {}
          }
        })

主页.js

<Tabs>
        <Tab
          titleStyle={{fontWeight: 'bold', fontSize: 10}}
          selectedTitleStyle={{marginTop: -1, marginBottom: 6}}
          selected={true}
          renderIcon={() => <Icon containerStyle={{justifyContent: 'center', alignItems: 'center', marginTop: 12}} color={'#5e6977'} name='whatshot' size={33} />}
          renderSelectedIcon={() => <Icon color={'#6296f9'} name='whatshot' size={30} />}
          >
          <Feed />
        </Tab>
        <Tab
          titleStyle={{fontWeight: 'bold', fontSize: 10}}
          selectedTitleStyle={{marginTop: -1, marginBottom: 6}}
          selected={selectedTab === 'profile'}
          title={selectedTab === 'profile' ? 'PROFILE' : null}
          renderIcon={() => <Icon containerStyle={{justifyContent: 'center', alignItems: 'center', marginTop: 12}} color={'#5e6977'} name='person' size={33} />}
          renderSelectedIcon={() => <Icon color={'#6296f9'} name='person' size={30} />}
          onPress={() => this.changeTab('profile')}>
          <Profile />
        </Tab>
      </Tabs>

在 react-native 中管理选项卡的最佳实践是什么?在我的用例中,我应该使用哪种方法?

4

2 回答 2

0

推荐的方法是从开始Navigation.startSingleScreenApp()然后移动到Navigation.startTabBasedApp()(选项 1)。

您说您面临的唯一问题是选项 1 中没有动画,但实际上您有该选项:将过渡动画添加到新的导航器对象:

Navigation.startTabBasedApp({
  // ...
  animationType: 'slide' // optional, add transition animation to root change: 'none', 'slide-down', 'fade'
})

startSingleScreenAppstartTabBasedApp的文档中查找 animationType 属性。

于 2018-03-23T23:15:25.287 回答
0

要实现顶部选项卡,您需要启动一个单屏应用程序,然后定义顶部选项卡。你可以在下面做这样的事情。

    Navigation.startSingleScreenApp({
     screen: 'FirstScreen'
     title: 'FirstScreenTitle'
     topTabs: [
       {
         screen:'FirstTabScreen'
       },
       {
         screen:'SecondTabScreen'
       }
     ]

    });

首先将每个选项卡注册为单独的屏幕。

于 2017-07-27T19:59:05.363 回答