我想做的事情看起来很简单,但是我遇到了一些主要问题。我有一个要保存并从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 ...
的对象。
这不是数据的外观,我认为这有点愚蠢,我想让大家都可以打电话给我。
谢谢
答案 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);