React 中 map 處理異步數(shù)據(jù)不渲染的問題及解決方法
Map 異步之困:從卡頓到流暢的蛻變
當
map遇上異步,你的頁面還在“思考人生”嗎?
故事:一個讓頁面“沉默”的 bug
昨天,我的頁面像個啞巴一樣——數(shù)據(jù)準備好了,UI 卻一片空白??刂婆_沒有報錯,網(wǎng)絡請求一切正常,但用戶看到的就是 “無”。
調(diào)試三小時后,終于找到了罪魁禍首:
// ?? 沉默的“兇手”
const markList = data.map(item => ({
...item,
content: parseMarkdown(item.rawContent) // 這里返回的是 Promise!
}));
// 結(jié)果:markList = [Promise, Promise, Promise...]
// React: “我該渲染什么?一堆 Promise 對象?”問題診斷:為什么頁面不渲染?
同步思維 vs 異步現(xiàn)實
// ? 我們以為的(同步思維): const result = [處理后的對象1, 處理后的對象2, ...] // ? 實際上的(異步現(xiàn)實): const result = [Promise<pending>, Promise<pending>, ...]
React 的困惑
// React 嘗試渲染時:
<div>
{markList.map(item => (
<div>{item.content}</div> // item.content 是 Promise,不是字符串!
))}
</div>
// 輸出:[object Promise], [object Promise]...解決方案:讓異步“排隊站好”
方案一:Promise.all 大法(最常用)
// ? 正確姿勢:等待所有 Promise 完成
const processedData = await Promise.all(
data.map(async item => ({
...item,
content: await parseMarkdown(item.rawContent)
}))
);可視化流程:
原始數(shù)據(jù):[A, B, C]
↓ map + async(創(chuàng)建 Promise 隊列)
Promise隊列:[PA, PB, PC]
↓ Promise.all(等待全部完成)
處理結(jié)果:[A', B', C'] ← 這才是 React 要的!有趣的比喻
把異步處理想象成餐廳廚房:
// ? 錯誤做法:一個廚師做完所有菜才上菜 // (顧客:我餓死了...) // ? 正確做法:Promise.all - 多個廚師并行做菜 // (所有菜同時做好,一起上桌) // ?? 優(yōu)化做法:分批處理 - 做好一部分先上 // (顧客:先吃著,后面的馬上好)
備忘清單
需要 Promise.all 的場景:
- ?
marked.parse()處理 Markdown - ? 圖片預加載
new Image().src - ? API 并行請求多個資源
- ? 文件讀取/處理
- ? 加密/解密操作
不需要 Promise.all 的場景:
- ? 純同步計算(
array.map(x => x * 2)) - ? 簡單的數(shù)據(jù)轉(zhuǎn)換
- ? 過濾/排序操作
下次當你的頁面陷入沉默時,記得問一句:
“是不是有 Promise 在 map 里沒被 await?”
記?。寒惒讲豢膳拢膳碌氖遣恢浪钱惒降?!
到此這篇關于React 中 map 處理異步數(shù)據(jù)不渲染的問題及解決方法的文章就介紹到這了,更多相關react map 處理異步數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
ReactHook使用useState更新變量后,如何拿到變量更新后的值
這篇文章主要介紹了ReactHook使用useState更新變量后,如何拿到變量更新后的值問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03
React使用useEffect解決setState副作用詳解
這篇文章主要為大家介紹了React使用useEffect解決setState副作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10
react中使用forEach或map兩種方式遍歷數(shù)組
這篇文章主要介紹了react中使用forEach或map兩種方式遍歷數(shù)組,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09
react實現(xiàn)antd線上主題動態(tài)切換功能
這篇文章主要介紹了react實現(xiàn)antd線上主題動態(tài)切換功能,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-08-08
React函數(shù)組件與類組件使用及優(yōu)劣對比
本文主要介紹了React函數(shù)組件與類組件使用及優(yōu)劣對比,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04

