反应本机AsyncStorage问题

时间:2020-06-23 19:49:27

标签: reactjs react-native

我想做的事情看起来很简单,但是我遇到了一些主要问题。我有一个要保存并从AsyncStorage检索的登录后JSON对象。我知道您无法将JSON对象保存到存储中,并且必须对其进行字符串化处理……这样做了,当我尝试将其取出时,它似乎并没有重新调整预期的方式。

代码

Login.js

await AsyncStorage.setItem("loginData", JSON.stringify(result.data));
await AsyncStorage.setItem("token", result.data.token);
props.navigation.navigate('Home');

Home.js

export default function Home (props) {
    
    let resData = {};
    let token = await AsyncStorage.getItem("token");
    let announcementData = {};
    let portalTipsData = {};

    getAsyncStorage = async(key) => {
        try {
          const getAsyncStorageData = await AsyncStorage.getItem(key);
          const getAsyncStorageParsed = JSON.parse(getAsyncStorageData);
          return getAsyncStorageParsed;
        } catch (error) {
          console.warn(error);
        }
    }

    getAsyncStorage("loginData").then((result) => {
        resData = result;
        announcementData = resData.Announcements;
        portalTipsData = resData.PortalTips; 

        console.log("Test 1: ", announcementData);
        console.log("Test 2: ", portalTipsData);
    });

当我尝试使用annoucmentData或portalTipsData时,很奇怪的是,我收到一条错误消息,指出对象作为React子对象无效(找到:带有键{_40,_65 ...
的对象。
这不是数据的外观,我认为这有点愚蠢,我想让大家都可以打电话给我。

谢谢

2 个答案:

答案 0 :(得分:0)

是的,是的,您必须对对象进行字符串化。

AsyncStorage.setItem("loginData", JSON.stringify(result.Data), (err)=> {
    if(err){
        console.log("Something bad happened :(");
    }
    console.log("Boom!");
}).catch((err)=> {
    console.log("error is: " + err);
});

阅读时,应该对其进行解析。

try {
    const value = await AsyncStorage.getItem("loginData");
    if (value !== null) {
        console.log(JSON.parse(value));
    }
} catch (error) {
    // Error retrieving data
}

如果这不起作用,则可以检查result.Data的值

答案 1 :(得分:0)

我运行了上面提供的代码,发现相关字段可以正常访问。我认为您在上面对AsyncStorage的使用没有任何问题。可能是您的其他用法有误。但是,对于AsyncStorage的使用,我们建议您使用开放源代码库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);