React Native将对象加入数组存AsyncStorage需点击两次才生效问题求助
问题原因
- React的状态更新(
setinitialElements、setvideoid这类方法)是异步批量执行的,你调用setinitialElements(newArray)之后,当前作用域下的initialElements还是更新前的旧值,所以你马上用JSON.stringify(initialElements)存到AsyncStorage的时候,实际存的是还没加新元素的旧数组。这就是为什么第一次点击存不上,第二次点击的时候才能拿到上一次更新完的数组,才会保存成功。 - 额外注意:如果代码里的
videopath没有通过useState声明为状态变量,同样会存在取值异步的问题,建议统一改成状态管理。
修复方案
直接把你新生成的数组newArray传给AsyncStorage即可,不要用还没完成更新的state值,修改addElement方法:
const addElement = async () => { let ItemData = { itemKey: videoid, itemName: 'Object ' + (videoid+ 1), image: imgpath, video: videopath, }; var newArray = [...initialElements, ItemData]; setvideoid(videoid+ 1); setinitialElements(newArray); try { // 直接用新生成的newArray存储,避开状态异步更新的问题 await AsyncStorage.setItem('cachedvideos', JSON.stringify(newArray)); } catch (error) { console.log('数据存储失败', error) } };
如果后续需要依赖initialElements更新完成的状态执行其他逻辑,可以通过useEffect监听状态变化:
useEffect(() => { // initialElements更新完成后会触发该回调 console.log('本地存储的最新数组:', initialElements) }, [initialElements])
内容的提问来源于stack exchange,提问作者Obare13
相关产品推荐
相关产品推荐

