从另一个组件更改React Native App.js中的状态

时间:2019-03-04 21:36:39

标签: react-native authentication state react-navigation

我在应用程序中进行身份验证,有点卡住了。我有2种不同的导航。一个显示用户是否已登录,另一个显示用户是否未登录。基本上是登录屏幕。如果我一开始就手动更改该值,则效果很好。但是,例如,当用户登录时,我找不到改变状态的方法。即使auth模块中的值更改了,它也不会在App.js中更新。那么,例如,如何从“登录”屏幕更新App.js的状态?

import React, { Component } from 'react';
import { AppRegistry, Platform, StyleSheet, Text, View } from 'react-native';
import DrawerNavigator from './components/DrawerNavigator'
import SignedOutNavigator from './components/SignedOutNavigator'
import auth from './auth'

type Props = {};
export default class App extends Component<Props> {
  constructor(props) {
    super(props)
    this.state = {
      isLoggedIn: auth.isLoggedIn
    }
  }

  render() {
    return (
      (this.state.isLoggedIn) ? <DrawerNavigator /> : <SignedOutNavigator />
    );
  }
}

AppRegistry.registerComponent('App', () => App)

和我的auth模块,这非常简单     从'react-native'导入{AsyncStorage};     //尝试从本地文件读取     让api_key     让isLoggedIn = false

function save_user_settings(settings) {
    AsyncStorage.mergeItem('user', JSON.stringify(settings), () => {
        AsyncStorage.getItem('user', (err, result) => {
            isLoggedIn = result.isLoggedIn
            api_key = result.api_key
        });
        isLoggedIn = true
    });
}
module.exports.save_user_settings = save_user_settings
module.exports.api_key = api_key
module.exports.isLoggedIn = isLoggedIn

1 个答案:

答案 0 :(得分:1)

首先,有很多方法可以解决此问题。因此,我将尝试向您解释为什么您现在所拥有的不起作用。

发生这种情况的原因是,当您将auth.isLoggedIn分配给您的isLoggedIn状态时,您一次分配了,类似于副本。它不是存储的引用。

除此之外,请记住,React状态通常仅使用setState()更新,并且在这里永远不会调用它,因此您的状态不会更新。

在没有引入Redux之类的元素的情况下解决该问题的方法是,研究构建一个身份验证高级组件,该组件处理所有身份验证逻辑并包装您的整个应用程序,而Redux本身对这个问题而言是过大的。您可以从那里控制是渲染子项还是重定向。

身份验证组件

componentDidMount() {
 this._saveUserSettings(settings);
}

_saveUserSettings(settings) {
    AsyncStorage.mergeItem('user', JSON.stringify(settings), () => {
        AsyncStorage.getItem('user', (err, result) => {
            isLoggedIn = result.isLoggedIn
            api_key = result.api_key
        });
        this.setState({isLoggedIn: true});
    });
}

render() {
 const { isLoggedIn } = this.state;
 return isLoggedIn ? this.props.children : null;
}

App.js

render() {
   <AuthComponent>
      //the rest of authenticated app goes here
   </AuthComponent>
}

这是一个非常快速,不完整的示例。但是它应该向您展示如何进行身份验证。但是,您还需要考虑错误处理等。