【问题标题】:React native : Is there any way to redirect the initial route to another pageReact native:有没有办法将初始路由重定向到另一个页面
【发布时间】:2017-03-31 16:13:37
【问题描述】:

我是 react native 的新手,目前正在开发一个需要登录的 react-native 应用程序。登录成功后,视图变为主页。 问题是在我关闭并重新打开应用程序后,它再次显示 LoginPage有没有办法将初始路由重定向到另一个页面强>

 class Main extends Component {

  _renderScene(route, navigator) {
      if (route.id === 1) {
        return <LoginPage navigator={navigator} />
      } else if (route.id === 2) {
        return <HomePage navigator={navigator} />
      } else if (route.id === 3) {
        return <DetailPage navigator={navigator} />
      }  else if (route.id === 4) {
        return <CreateBookingPage navigator={navigator} />
      }
  }

  _configureScene(route) {
    return Navigator.SceneConfigs.PushFromRight;
  }


  render() {
      return (
        <Navigator
        initialRoute={{id: 1, }}
        renderScene={this._renderScene}
        configureScene={ () => { return Navigator.SceneConfigs.PushFromRight; }} />
      );
  }
}

/////在进行了一些更改后,我进入了这个但仍然呈现登录是我做错了什么///////

   componentWillMount() {
    AsyncStorage.getItem('key').then( (value) => {
        if(value==="yes") {
            this.setState({ loader: false, logged: true})
        } else {
            this.setState({ loader: false })
        }
    })
}

render() {
    const routeId = this.state.logged ? 2 : 1;
    if(this.state.loader) {
        return (
            <View /> // loading screen
        );
    }
    return (
        <Navigator
            initialRoute={{id: routeId }}
            renderScene={this._renderScene}
            configureScene={ () => { return Navigator.SceneConfigs.PushFromRight; }} />
    );
}

【问题讨论】:

  • 根据用户登录状态动态设置initialRoute值。
  • 你知道如何动态设置初始路由吗......你可以在这里添加示例
  • 根据您的要求,您需要更新 id 值。像 initialRoute={{id: (condition ? 1: 2) }}
  • 你能添加示例吗?我真的不知道如何在我的代码中添加这个

标签: react-native


【解决方案1】:

成功登录后,您可以在设备的本地存储中设置令牌/值,并在注销时清除此值。 您可以检查此值以设置初始路线。 Asyncstorage 可用于设置和删除记录的状态。

编辑: loader的初始状态应该是true,logged应该是false

  componentWillMount() { 
   AsyncStorage.getItem('key').then( (value) => {
     if(value) {
       this.setState({ loader: false, logged: true})
     } else {
       this.setState({ loader: false })
    }
   })
 }

  render() {
    const { loader } = this.state;
    const routeId = logged ? 2 : 1;
    if(loader) { 
    return (
     <View /> // loading screen
   );
}
    return (
      <Navigator
      initialRoute={{id: routeId }}
      renderScene={this._renderScene}
      configureScene={ () => { return Navigator.SceneConfigs.PushFromRight; }} />
    );
 }

【讨论】:

  • 有什么方法可以直接使用该值,因为它需要时间并且渲染函数会立即执行.....
  • return in render可以有条件地完成,直到从AsyncStorage中获取到值,你才能返回一个加载画面。获得值后,您可以 setState 并返回带有所需初始路线的导航器
  • 请添加示例我真的不知道我能做到这一点
  • 此刻我真的很困惑,感觉很笨,我已经编辑了我的问题,请检查我是否做错了什么
  • 你需要两个状态,一是是否显示loader,二是用户是否已经登录
【解决方案2】:

用你的渲染函数替换并尝试一下。

  render() {
    var loggedStatus = true; // change here for login screen
    var routeId = loggedStatus ? 2 : 1;
    return (
      <Navigator
      initialRoute={{id: routeId }}
      renderScene={this._renderScene}
      configureScene={ () => { return Navigator.SceneConfigs.PushFromRight; }} />
    );
 }

【讨论】:

  • 但是我如何改变loggedStatus变量的状态,因为我的登录类文件在不同的文件中我的意思是在API调用之后我必须改变这个值
  • 成功登录后,您需要为登录状态设置一些cookie值并在此处获取。
  • 这个cookie值怎么生成我真的不知道
  • 阅读这篇文章。 medium.com/@ntoscano/…
  • 或者你可以使用 react-native-cookies 模块。 npmjs.com/package/react-native-cookies
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
  • 1970-01-01
  • 1970-01-01
  • 2020-05-26
  • 1970-01-01
  • 2019-12-25
相关资源
最近更新 更多