如何在带有React Navigation的createBottomTabNavigator中使用AsyncStorage?

斯蒂文·卡斯蒂略

我使用react-navigation v3,并且我想在createBottomTabNavigator中使用AsyncStorage来检查用户是否登录。

我将密钥保存到Stoage的LoginScreen中:

await AsyncStorage.setItem('@MyStorage:isLogged', isLogged);

我想在我的堆栈(TabStack)中使用AsyncStorage:

const TabStack = createBottomTabNavigator(
  {
    Home: { screen: HomeScreen, },
    // I need isLogged key from AsyncStorage here!
    ...(false ? {
      Account: { screen: AccountScreen, }
    } : {
      Login: { screen: LoginScreen, }
    }),
  },
  {
    initialRouteName: 'Home',
  }
);

我该怎么办?

我的环境:

  • 反应本机:0.58.5
  • 反应导航:3.3.2
斯蒂文·卡斯蒂略

解决方案是:创建一个新组件AppTabBar并在tabBarComponent属性中进行设置

const TabStack = createBottomTabNavigator({
    Home: { screen: HomeScreen, },
    Account: { screen: AccountScreen, }
},
{
  initialRouteName: 'Home',
  tabBarComponent: AppTabBar, // Here
});

和AppTabBar组件:

export default class AppTabBar extends Component {
  constructor(props) {
    super(props);

    this.state = {
      isLogged: '0',
    };
  }

  componentDidMount() {
    this._retrieveData();
  }

  _retrieveData = async () => {
    try {
      const value = await AsyncStorage.getItem('isLogged');
      if (value !== null) {
        this.setState({
          isLogged: value,
        });
      }
    } catch (error) {
      // Error retrieving data
    }
  };

  render() {
    const { navigation, appState } = this.props;
    const routes = navigation.state.routes;
    const { isLogged } = this.state;

    return (
      <View style={styles.container}>
        {routes.map((route, index) => {
          if (isLogged === '1' && route.routeName === 'Login') {
            return null;
          }

          if (isLogged === '0' && route.routeName === 'Account') {
            return null;
          }

          return (
            <View /> // here your tabbar component
          );
        })}
      </View>
    );
  }

  navigationHandler = name => {
    const { navigation } = this.props;
    navigation.navigate(name);
  };
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在带有Typescript的React中使用refs

如何在带有钩子的React Native中使用refs?

如何在React Native中使用AsyncStorage正确获取Item?

如何在React Native中使用AsyncStorage multiGet检索数据

如何在Redux中使用React Native AsyncStorage?

如何在 Android 上使用带有路径参数的 React Navigation 通用链接?

React-Navigation 3:使用createBottomTabNavigator和createStackNavigator打开模式

如何在另一个React组件中使用createBottomTabNavigator

如何在React中使用带有useState钩子的回调

如何在带有 React 和 Typescript 的样式组件中使用 @font-face?

如何在带有 TypeScript 的 React 应用程序中使用消费者?

如何在带有Typescript项目的React JS中使用.env文件?

如何在带有Typescript的React中使用和指定通用挂钩?

如何在React中使用带有箭头功能的嵌套组件定义为常量?

如何在TypeScript中使用带有React无状态功能组件的子级?

在 React Native 中,如何在 iOS 中使用带有模态的 KeyboardAvoidingView?

如何在 React 中使用带有 Ionic 5 应用程序的cordova sqlite 插件?

如何在带有nextjs的react-froala中使用许可证密钥

如何在带有 JSS 的打字稿 react-app 中使用谷歌字体?

如何在 React 中使用带有异步数据的 useReducer 钩子?

如何在 react-native 中使用带有 map 的两个组件

如何在 React 中使用这个 map 函数来调用带有图像名称的 url

我如何在带有 react-router 的路由中使用数组

如何在React JS中使用三元运算符在文本中使用带有字体的真棒图标?

如何在使用带有自定义拖动预览的 React DnD 放置时隐藏元素?

如何在带有Typescript的react-redux中正确使用'connect'

在这种情况下,如何在带有“精确参数”的嵌套页面中使用React Router?

如何在 React 中使用带有字符串数组的循环简单地请求 axios.all?

如何在本机反应中使用 AsyncStorage 存储对象数组