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

從一個PR窺探React未來開發方式

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

[[419828]]

大家好,我是卡頌。

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

關于這塊知識,官方文檔一點兒都沒提及。

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

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

useEffect依賴了a b兩個狀態,當其中任意一個變化后會執行fetchData請求數據。

當應用變得復雜,要追蹤a、b何時變化變得越來越難。

假以時日接口調整,fetchData還需要狀態c作為參數。那么追蹤狀態變化的難度又會進一步提高。

最終會導致:

  • 輕則無意義的fetchData多次調用
  • 重則邏輯出現難以追查的bug

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

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

如何解決這個問題

以上問題的本質原因是:「副作用」實在太多,可以被當作「副作用」的東西也實在太多。這導致useEffect被濫用。

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

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

從一個PR看到變化

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

大體意思是:

在之前,當你在一個已經卸載的組件(unmounted)中調用setState會觸發一個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也可能被調用,進而調用setState。

這是潛在的內存泄漏。

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

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

PR的背后

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

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

點擊按鈕后調用setPending觸發loading圖標顯示,接著發起post請求。

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

  1. setPending(false

并不會有內存泄漏風險,但是會報warning。

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

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

在組件中訂閱外部源

什么是「外部源」呢?

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

比如:

  • 各種第三方狀態管理庫
  • 希望location.hash變化觸發組件更新

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

更多例子

再比如,對于I/O操作(比如「請求數據」)這種大家都會放在useEffect中的邏輯,未來使用resource結合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>; 

 以上例子中,調用fetchDetail會發起數據請求。

Details組件調用resource.read直接消費數據即可。

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

總結

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

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

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

 

責任編輯:姜華 來源: 魔術師卡頌
相關推薦

2021-10-12 08:34:23

React組件前端

2025-04-07 08:25:01

React復合組件組件模式

2013-03-06 09:58:39

開發方式軟件開發程序員

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前端開發

2022-08-02 07:57:54

RAC故障運維

2010-12-01 09:04:59

PHP開發

2018-03-14 19:39:31

數據庫Oracle臨時表

2024-06-05 08:40:53

2021-06-24 09:53:05

前端架構開源

2015-08-06 17:15:28

2015-11-12 13:47:53

Firefox OSAPPFirefox

2021-04-19 10:47:11

NettyDemoI

2010-02-06 14:52:15

ibmdw敏捷測試

2020-10-20 14:01:16

HTTP

2025-02-19 18:00:00

神經網絡模型AI

2023-07-14 07:23:21

ReactuseEffect

2023-06-07 08:25:41

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲成av人片在线观看无码 | 中文字幕动漫成人 | 国产精品国产精品国产专区不片 | 欧美xxxx做受欧美 | www国产成人免费观看视频,深夜成人网 | 第一av| 国产在线高清 | 免费v片在线观看 | 国产精品成人一区二区三区 | 国产成人福利视频 | 天天av综合 | 久久com| 伊人伊人伊人 | 国产精品久久国产精品 | 精品国产亚洲一区二区三区大结局 | 国产免费看 | 亚洲国产欧美日韩 | 中文字幕视频在线 | 欧美精品在线一区 | 91精品麻豆日日躁夜夜躁 | 日韩三级在线 | 中文字幕第九页 | 欧美激情综合色综合啪啪五月 | 午夜精品久久久久久久99黑人 | 国产91在线视频 | 国产小u女发育末成年 | 日韩电影一区 | 久久久99精品免费观看 | 欧美一区二区在线看 | 日本黄色免费视频 | 欧美三级久久久 | 欧美日韩看片 | 成人在线免费av | 自拍视频在线观看 | 国产蜜臀97一区二区三区 | 在线观看亚洲专区 | 亚洲综合在线播放 | 羞羞视频网站 | 亚洲成人毛片 | 亚洲精品成人av久久 | www.久久99 |