- 此问题在此处已有答案**:
The useState set method is not reflecting a change immediately(16个答案)
(13个答案)
6小时前关门了。
我有一段代码,它使用useEffect钩子从Firebase存储中获取文件列表的元数据。然而,我很难在这个useEffect中更新我的状态。我使用async/await模式来缓解setState的异步特性,但没有取得多大成功。
我的伪代码片段:
const [someData,setSomeData]=useState([])
const dataArray=[]
useFocusEffect(
useCallback(()=>{
async function getData(){
const result=await listAll(storageRef);
await result.items.map(async (itemRef)=>{
const Metadata=await getMetadata(itemRef);
await dataArray.push({'name':Metadata.name})
await console.log(dataArray) //shows the array being populated on each iteration
})
await setSomeData(dataArray);
await console.log(someData) // I'm expecting it to print an updated state, prints an empty array instead
}
getData()
},[])
)
我似乎也无法访问代码返回部分的状态:
return(
{someData.map(({item})=>{
return(
<View><Text>{item.name}</Text><View>)})
据我所知没有任何输出。
我的方法遗漏了什么?
先谢了
2条答案
按热度按时间0pizxfdo1#
cvxl0en22#
dataArray
在每次渲染时都被重新初始化为[]
,然后你将someData
设置为dataArray
,实际上将someData
设置为一个空数组。我认为如果你将异步Map封装在Promise.all中,那么你可以将dataArray的作用域设置为getData
函数: