Javascript 如何使用react native中的其他组件更新app.js的状态?

Javascript 如何使用react native中的其他组件更新app.js的状态?,javascript,reactjs,react-native,Javascript,Reactjs,React Native,我正在使用本机CLI构建react本机应用程序。一切正常,但当我通过API登录到用户时,我会收到令牌和其他值。我将它们设置在AsyncStorage中,它应该跳转到买家仪表板屏幕,但它不能,但当我刷新应用程序时,它会跳转到买家仪表板。基本上,它不会在按下登录按钮后刷新app.js,它还应该刷新app.js 登录按钮代码 const login = async () => { if (name != '' && password != '') {

我正在使用本机CLI构建react本机应用程序。一切正常,但当我通过API登录到用户时,我会收到令牌和其他值。我将它们设置在AsyncStorage中,它应该跳转到买家仪表板屏幕,但它不能,但当我刷新应用程序时,它会跳转到买家仪表板。基本上,它不会在按下登录按钮后刷新app.js,它还应该刷新app.js

登录按钮代码

const login = async () => {
        if (name != '' && password != '') {
            const login_Credentials = new FormData();
            login_Credentials.append('username', name);
            login_Credentials.append('password', password);
            setPress(true)
            await axios({
                method: 'POST',
                url: api + 'login/',
                data: login_Credentials,
                headers: { 'Content-Type': 'multipart/form-data' }
            }).then(async function (response) {
                if (response.data.Success == true) {
                    const token = response.data.token.toString();
                    const super_user_status = response.data.super_user_status.toString();
                    const isLoggedIn = "1"
                    console.log('Logged In and set Storgae')
                    await AsyncStorage.multiSet([['isLoggedIn',isLoggedIn],['token', token], ['super_user_status', super_user_status]])
                    setName('')
                    setPassword('')
                    setPress(false)
                } else if (response.data.Success == false) {
                    setPress(false)
                    setErrorMsg(response.data.Error)
                    setName('')
                    setPassword('')
                    
                }
            }).catch(function (response) {
                console.log(response, "error");
            })
        } else {
            setErrorMsg('Please Enter Username/Password.')
        }
    }
app.js

const App = () => {
  const [user, setUser] = useState(false)
  const [role, setRole] = useState('seller')

  useEffect(()=>{ 
    getKeysData(dataKeys)
  },[]) 

  const dataKeys = ['token', 'super_user_status', 'isLoggedIn'];    
  const getKeysData = async (keys) => {
    const stores = await AsyncStorage.multiGet(keys);
    const aData = stores.map(([key, value]) => ({ [key]: value }))
    const token = aData[0]['token']
    const super_user_status = aData[1]['super_user_status']
    const isLoggedIn = aData[2]['isLoggedIn']
    console.log('token',token)
    console.log('SuperUser', super_user_status)
    console.log('Log',isLoggedIn)
    if(isLoggedIn == '1'){
      setUser(true)
    }else{
      setUser(false)
    }
    }
  //AsyncStorage.clear()
  return (
    <NavigationContainer>
      { user == false ?
        <AuthStackScreen />
        :
        <BuyerDashboardStackScreens />
      }

    </NavigationContainer>
  );
};

const-App=()=>{
const[user,setUser]=useState(false)
const[role,setRole]=useState('seller')
useffect(()=>{
getKeysData(数据键)
},[]) 
const dataKeys=['token','super_user_status','isLoggedIn'];
const getKeysData=async(键)=>{
const stores=wait AsyncStorage.multiGet(键);
const aData=stores.map(([key,value])=>({[key]:value}))
const token=aData[0]['token']
const super_user_status=aData[1]['super_user_status']
常量isLoggedIn=aData[2]['isLoggedIn']
console.log('token',token)
console.log('SuperUser',super\u user\u status)
console.log('log',isLoggedIn)
如果(isLoggedIn=='1'){
setUser(真)
}否则{
setUser(false)
}
}
//AsyncStorage.clear()
返回(
{user==false?
:
}
);
};

我使用AsyncStorage更新app.js中的状态。

正如您所知,
AsyncStorage
是异步的,用户在开始时为false,并且状态未加载到该状态。您应该设置一个加载状态,直到该状态未从
AsyncStorage
加载,您才会显示一个启动屏幕。登录时,根据响应设置用户状态

const [user, setUser] = useState(false)
const [role, setRole] = useState('seller')
const [isLoading, setIsLoading] = useState(true)
...
const getKeysData =() => {
  // wait for storage data
  // setUser
  setIsLoading(false)
}
...
if(isLoading) return <Loader />
return <Navigation.../>
const[user,setUser]=useState(false)
const[role,setRole]=useState('seller')
常量[isLoading,setIsLoading]=useState(真)
...
常量getKeysData=()=>{
//等待存储数据
//设置用户
setIsLoading(错误)
}
...
如果(卸载)返回
返回

根据您的说法,我知道我需要使用splashscreen来设置加载状态。我的意思是,在成功响应后的登录功能中,您尚未设置用户状态。这是错误的。但是用户状态在app.js中,登录函数在单独的登录组件文件中。好的,您通常需要一个UserContext来存储用户状态并传递给app和登录组件。你知道上下文吗?我不知道上下文。