所以我这里有一个问题,我只想仅在应用程序中运行一次功能
我只需要向异步存储初始化一次空数组。我稍后将使用ComponentWillMount()在数组中读取和写入函数。
问题是我如何首先初始化一个空数组,而我又不想以后再将其清空(例如关闭和打开应用程序时)
每次屏幕渲染时,我都会读取异步存储中存储的数据...但是,当屏幕首次呈现时,应用程序已安装...我没有调用以下功能
setObjectValue = async () => {
try {
const jsonValue = JSON.stringify(this.state.data)
await AsyncStorage.setItem('Emails', jsonValue)
this.setState({ value : this.state.data.length })
} catch(e) {
// save error
}
console.log('Done.')
}
但是如果我在读取之前调用它...它将擦除现有数据并将其设置为空数组(因为我有一个具有数据的构造器:[]),所以当我读取数据时,我得到了一个空数组
您可以在此处看到完整的代码-https://snack.expo.io/@belgin/budget-tracker
感谢任何帮助的人:)
答案 0 :(得分:1)
您的应用程序需要进行的更改很少。
首先用componentDidMount替换UNSAFE_componentWillMount
并按如下所示更改您的getMyObject,以确保仅在值存在的情况下才更新
getMyObject = async () => {
try {
const jsonValue = await AsyncStorage.getItem('Emails');
if (jsonValue) {
const data = JSON.parse(jsonValue);
this.setState({ data: data, value: data.length });
}
} catch (e) {
// read error
}
};
还从更新asyncStorage的函数中删除setState调用,因为在状态未更新的情况下完成了调用,这将显示无效数据。
还可以在状态更新后更新asyncStorage,如下所示
this.setState({ data: this.state.data },()=>this.setObjectValue());