在函数 React-Native 中使用异步渲染子项

Render child using async in function React-Native

我看到了很多这样的答案,但到目前为止没有一个对我有用。 如果有登录数据,我想从 AsyncStorage 获取数据并呈现一个页面,但如果没有登录数据,我想呈现另一个页面。

但是我在开发这个时遇到了问题...

我试过这个:

export default class Routes extends React.Component {
  RetrieveData = async () => {
    try {
      const value = await AsyncStorage.getItem('login');
      if (value !== null) {
        // We have data!!
        return (
            <View>Test</View>
        );
      }
    } catch (error) {
      // Error retrieving data
    }
  };

  render() {
    return (
      {RetrieveData}
    )
  }
}

我也尝试过使用 componentDidMount 技术...但没有成功...

我当前的代码仍然无效:

export default function Routes() { 
  function CheckLogged(){
    var login;

    async function checkLogin(){
      await AsyncStorage.getItem('login', (err, result) => {
        login = JSON.parse(result);
      });
    }
  
    checkLogin();


    if (login != null){
      return(
        <Stack.Navigator>
          <Stack.Screen name="Login" component={Login} />
        </Stack.Navigator>
      )
    }
      
    else{
      return(
        <Stack.Navigator>
          <Stack.Screen name="Home" component={Home} />
        </Stack.Navigator>
      )
    }
  }


  return(
    <NavigationContainer>
      <CheckLogged/>
    </NavigationContainer>
  )
}

您正在使用 React 并设置不会导致渲染的变量,最好的方法是使用状态并使用 useEffect 挂钩从异步存储中检索数据。

这里使用了两个状态变量,一个用于显示加载指示器直到读取完成,另一个用于保存登录数据(如果可用)。组件挂载后使用效果会运行。堆栈中的屏幕是有条件地呈现的。

function Routes() {
  const [isLoggedIn, setIsLoggedIn] = React.useState(false);
  const [isLoaded, setIsLoaded] = React.useState(true);

  useEffect(() => {
    AsyncStorage.getItem('login').then((result) => {
      setIsLoaded(JSON.parse(result));
    });
  }, []);

  if (isLoaded) return <ActivityIndicator />;

  return (
    <NavigationContainer>
      <Stack.Navigator>
        {isLoggedIn ? (
          <Stack.Screen name="Home" component={Home} />
        ) : (
          <Stack.Screen name="Login" component={Login} />
        )}
      </Stack.Navigator>
    </NavigationContainer>
  );
}

推荐使用react-native-easy-app,通过它可以同步访问AsyncStorage,也可以存储和检索对象、字符串或布尔数据

  import { XStorage } from 'react-native-easy-app';
  import { AsyncStorage } from 'react-native';
  // or import AsyncStorage from '@react-native-community/async-storage';

   export const RNStorage = {
       token: undefined, 
       isShow: undefined, 
       userInfo: undefined
   };
   
  const initCallback = () => {

       // From now on, you can write or read the variables in RNStorage synchronously
       
       // equal to [console.log(await AsyncStorage.getItem('isShow'))]
       console.log(RNStorage.isShow); 
       
       // equal to [ await AsyncStorage.setItem('token',TOKEN1343DN23IDD3PJ2DBF3==') ]
       RNStorage.token = 'TOKEN1343DN23IDD3PJ2DBF3=='; 
       
       // equal to [ await AsyncStorage.setItem('userInfo',JSON.stringify({ name:'rufeng', age:30})) ]
       RNStorage.userInfo = {name: 'rufeng', age: 30}; 
  };
  
  XStorage.initStorage(RNStorage, AsyncStorage, initCallback);