成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

從一個PR窺探React未來開發(fā)方式

開發(fā) 前端
都說Hooks是React的未來,但Hooks的最佳實踐是什么呢?關(guān)于這塊知識,官方文檔一點兒都沒提及。本篇就帶給大家相關(guān)知識。

[[419828]]

大家好,我是卡頌。

都說Hooks是React的未來,但Hooks的最佳實踐是什么呢?

關(guān)于這塊知識,官方文檔一點兒都沒提及。

所以在實際項目中,常會出現(xiàn)類似下面的問題:

  1. // ... 
  2. useEffect(() => { 
  3.   fetchData(a, b).then
  4.     // ... 
  5.   ) 
  6. }, [a, b]) 
  7. //... 

useEffect依賴了a b兩個狀態(tài),當(dāng)其中任意一個變化后會執(zhí)行fetchData請求數(shù)據(jù)。

當(dāng)應(yīng)用變得復(fù)雜,要追蹤a、b何時變化變得越來越難。

假以時日接口調(diào)整,fetchData還需要狀態(tài)c作為參數(shù)。那么追蹤狀態(tài)變化的難度又會進(jìn)一步提高。

最終會導(dǎo)致:

  • 輕則無意義的fetchData多次調(diào)用
  • 重則邏輯出現(xiàn)難以追查的bug

有朋友會說:你可以封裝自定義Hook啊。

這只是將問題隱藏的更深了......

如何解決這個問題

以上問題的本質(zhì)原因是:「副作用」實在太多,可以被當(dāng)作「副作用」的東西也實在太多。這導(dǎo)致useEffect被濫用。

所以,要解決濫用問題,就需要為不同類型「副作用」提供官方解決方案。

這樣,具體問題有了具體解決方案,才不會useEffect一把梭。

從一個PR看到變化

最近React有個很不起眼的PR[1]:

大體意思是:

在之前,當(dāng)你在一個已經(jīng)卸載的組件(unmounted)中調(diào)用setState會觸發(fā)一個warning,這個PR將移除這個warning。

舉個例子,以下代碼在組件mount時注冊handleChange:

  1. useEffect(() => { 
  2.   function handleChange() { 
  3.      setState(store.getState()) 
  4.   } 
  5.   store.subscribe(handleChange) 
  6.    
  7.   return () => store.unsubscribe(handleChange) 
  8. }, []) 

如果你忘記寫這行解綁代碼:

  1. return () => store.unsubscribe(handleChange) 

那么組件卸載后handleChange也可能被調(diào)用,進(jìn)而調(diào)用setState。

這是潛在的內(nèi)存泄漏。

在之前的React中,這種行為會報warning。

那為什么要移除這種行為下的warning呢?

PR的背后

一方面,這個warning有一定概率誤判,比如「點擊按鈕提交表單」:

  1. async function handleSubmit() { 
  2.   setPending(true
  3.   await post('/someapi'
  4.   setPending(false

點擊按鈕后調(diào)用setPending觸發(fā)loading圖標(biāo)顯示,接著發(fā)起post請求。

有可能請求返回前組件就卸載了,此時會調(diào)用:

  1. setPending(false

并不會有內(nèi)存泄漏風(fēng)險,但是會報warning。

不過warning移除還有另一個更本質(zhì)的原因:

在第一個示例中,我們在useEffect中調(diào)用store.subscribe,這種行為可以歸類為:

在組件中訂閱外部源

什么是「外部源」呢?

任何「變化與否不受React控制的源」都是「外部源」。

比如:

  • 各種第三方狀態(tài)管理庫
  • 希望location.hash變化觸發(fā)組件更新

未來所有這類行為都會收斂到useMutableSource這個Hook中。

更多例子

再比如,對于I/O操作(比如「請求數(shù)據(jù)」)這種大家都會放在useEffect中的邏輯,未來使用resource結(jié)合Suspense可能是更好的選擇:

  1. const resource = fetchDetail(); 
  2.  
  3. function Page() { 
  4.   return ( 
  5.     <Suspense fallback={<h1>Loading...</h1>}> 
  6.       <Details/> 
  7.     </Suspense> 
  8.   ); 
  9.  
  10. function Details() { 
  11.   const data = resource.read(); 
  12.   return <h1>{data.name}</h1>; 

 以上例子中,調(diào)用fetchDetail會發(fā)起數(shù)據(jù)請求。

Details組件調(diào)用resource.read直接消費數(shù)據(jù)即可。

如果數(shù)據(jù)還未返回,視圖會渲染最近的Suspense的fallback(即<h1>Loading...</h1>)。

總結(jié)

「副作用」是多種多樣的,以前沒得選,只能用useEffect。

隨著React18的穩(wěn)定,面對不同「副作用」場景,會有更明確的解決方案。

屆時,可能才最終迎來Hooks真香的時代......

 

責(zé)任編輯:姜華 來源: 魔術(shù)師卡頌
相關(guān)推薦

2021-10-12 08:34:23

React組件前端

2025-04-07 08:25:01

React復(fù)合組件組件模式

2013-03-06 09:58:39

開發(fā)方式軟件開發(fā)程序員

2015-09-22 09:30:28

2023-03-07 15:08:57

2009-11-23 09:27:00

PayPal支付接口

2014-03-14 14:04:29

AlloyDesign前端開發(fā)

2022-08-02 07:57:54

RAC故障運維

2010-12-01 09:04:59

PHP開發(fā)

2018-03-14 19:39:31

數(shù)據(jù)庫Oracle臨時表

2021-06-24 09:53:05

前端架構(gòu)開源

2024-06-05 08:40:53

2015-08-06 17:15:28

2021-04-19 10:47:11

NettyDemoI

2010-02-06 14:52:15

ibmdw敏捷測試

2025-02-19 18:00:00

神經(jīng)網(wǎng)絡(luò)模型AI

2020-10-20 14:01:16

HTTP

2015-11-12 13:47:53

Firefox OSAPPFirefox

2023-07-14 07:23:21

ReactuseEffect

2024-05-08 07:40:20

ChatGPT訓(xùn)練數(shù)據(jù)預(yù)測
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 成人精品免费 | 久久91精品 | 欧美一区二区大片 | 国产精品色婷婷久久58 | 黄网站在线播放 | 伊人二区 | 日韩欧美在线播放 | 国产999精品久久久久久 | 国产精品久久久久久一级毛片 | 毛片在线视频 | 亚洲毛片在线观看 | 9191成人精品久久 | 免费黄色片在线观看 | 精精国产xxxx视频在线野外 | 国产精品日韩欧美一区二区三区 | 日本视频在线播放 | 国产精品久久久久久妇女6080 | 午夜免费网站 | 日韩成人免费 | 一区二区中文字幕 | 综合九九| 日韩视频精品在线 | 日日噜噜噜夜夜爽爽狠狠视频, | 人人玩人人添人人澡欧美 | 国产九九九 | 日韩精品一区二区三区在线观看 | 男女羞羞视频大全 | 国产成人免费视频网站视频社区 | 一级久久久久久 | 欧美激情一区二区 | 成人免费视频观看 | 亚洲精品久久久久久一区二区 | 日韩av在线免费 | 国产婷婷 | www.日本在线观看 | 日日躁狠狠躁aaaaxxxx | 国产精品久久久久久久久久99 | 五月天天丁香婷婷在线中 | 亚洲二区视频 | 天天干天天操天天射 | 欧美黄色网 |