使用React Navigation在React Native应用程序之间共享状态

时间:2019-01-07 12:20:25

标签: reactjs react-native react-native-navigation

我正在设置一个使用react-native-navigation的应用程序。我想在导航中坚持一些价值观。当我手动触发导航时,可以将它们作为参数传递给navigate的调用。但是,当我使用插件提供的本机导航时,无法将其设置为参数。

在整个应用程序中共享API令牌而不需要将其存储在AsyncStorage中的最佳方法是什么?我是否缺少一些明显的解决方案?

我的App.js:

const AppStack = createBottomTabNavigator({
  Members: createStackNavigator({
    MemberList: MemberList,
    AddMember: NewMember,
  },{
    mode: 'card',
    initialRouteName: "MemberList"
  }),
  Scan: Scanner
});
const AuthStack = createStackNavigator({ Login: Login });

export default createAppContainer(
  createSwitchNavigator(
    {
      AuthLoading: AuthLoadingScreen,
      App: AppStack,
      Auth: AuthStack
    },
    {
      initialRouteName: "AuthLoading"
    }
  )
);

Auth堆栈负责身份验证,在获取API令牌后,我使用以下方法手动重新路由到App:

    this.props.navigation.navigate({
        routeName: 'App',
        params: { auth_token: data.auth_token },
        action:  this.props.navigation.navigate({
          routeName: 'MemberList',
          params: { auth_token: data.auth_token}
        })
      });

当我开始使用底部的Nav导航时,会出现问题,因为这是由插件处理的,似乎没有持久的参数。

3 个答案:

答案 0 :(得分:2)

所以,我知道Redux已被收购-但我要在这里给我2便士。

对于

在您的应用程序中,您想弄清楚状态将变得多么复杂。在帖子评论中,我看到您将Redux视为“过度杀伤力”-起初看起来像是这样,因为您只需要使用一次全局状态(现在)。

您需要问的问题是:我的申请会变成多大?如果您要构建一个仅调用API的应用程序-那么我想应该就是这样!但是,我的猜测是您的应用程序会更加复杂。

当您开始使用状态时,redux是一种很好地理解和控制该状态以及全局访问状态的好方法。因此,如果这可以节省您几个小时的时间(而不是将本地状态作为道具),那么我会去做。

文档:https://redux.js.org/introduction/getting-started

反对

很明显,如果您确实认为它过大,则可以使用异步存储之类的替代解决方案。请记住,尽管这并不安全,所以您不应该存储敏感数据。

Is React Native's Async Storage secure?

其他类型的存储空间

您可以为应用程序使用其他类型的存储,通常是其他类型的DB存储。

https://dev.to/purvak_pathak/the-database-selection-guide-for-react-native-3kfm

它们包括:

  1. 领域
  2. Firebase
  3. SQLite
  4. 核心数据
  5. PouchDB
  6. 异步存储(不是完整的数据库,但仍然很受欢迎)

答案 1 :(得分:1)

使用React-Redux,Redux在应用程序级别创建集中式存储。用户成功登录后,将令牌保存在存储区中,您就可以调用它,并在整个应用程序中使用该状态“值”在所需的任何组件中。 前往https://redux.js.org 也 访问https://medium.com/@aurelie.lebec/redux-and-react-native-simple-login-example-flow-c4874cf91dde

答案 2 :(得分:0)

If you only want to store a simple static data you can create a static variable available everywhere in the app.

export static var authToken = "your token"

Then you just have to import it when you need it.