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

React要更新,就像渣男會變心

開發 前端
React有個特性 — Strict Mode,被StrictMode包裹的組件在DEV環境會對不推薦寫法有更嚴格的提示與輔助檢測行為。

[[407908]]

大家好,我是卡頌。

今天和同事聊天,我說他是個鐵憨憨,不會和女生聊天。

他啪的一下跳起來,“我可懂情調了”

“哦?那你來句土味情話。”

他清清嗓子,壓低了腔調,望向遠方,緩緩道:

  • 如果我是component,我對你的情愫在didMount時燃起,直到我生命unmount時熄滅

正當他沉浸在YY的世界無法自拔時,我說:

  • 你知道在React18,componentDidMount和componentWillUnmount可能調用多次么?

從Strict Mode談起

React有個特性 — Strict Mode,被StrictMode包裹的組件在DEV環境會對不推薦寫法有更嚴格的提示與輔助檢測行為。

  1. <StrictMode> 
  2.   <div> 
  3.     <ComponentOne /> 
  4.     <ComponentTwo /> 
  5.   </div> 
  6. </StrictMode> 

「輔助檢測行為」是指部分方法會被React重復調用,幫助開發者更容易發現不規范使用這些方法時的潛在bug。

所有會被重復調用的API見StrictMode文檔[1]

舉個例子:

  1. function App() { 
  2.   const [num, update] = useState(0); 
  3.  
  4.   function onClick() { 
  5.     update(num + 1); 
  6.   } 
  7.  
  8.   console.log('render'); 
  9.  
  10.   return ( 
  11.     <p onClick={onClick}>{num}</p> 
  12.   ); 

當App被StrictMode包裹,點擊p觸發更新后,App組件會render兩次。

  • 在v17之前,例子中console.log會執行兩次。但在v17之后,React覆寫了console方法,所以console.log只會執行一次,但組件實際會render兩次

這么做的目的是:作為函數組件,App的「副作用」應該在useEffect回調中執行。

如果不規范書寫副作用(比如在組件函數體內寫副作用),那么重復render更容易暴露可能產生的bug。

鋪墊完背景。接下來,讓我們揭露React善變的渣男行徑。

最近刷v18討論組時突然發現:StrictMode中會增加一條Strict Effect規則。

Strict Effect

簡單的說,類似上文講到的部分API在StrictMode下會重復執行。

Strict Effect規則會讓useEffect、useLayoutEffect在StrictMode下也會重復執行。

比如:

  1. function App() { 
  2.   // 或useLayoutEffect 
  3.   useEffect(() => { 
  4.     // 邏輯1 
  5.     return () => // 邏輯2; 
  6.   }, []) 
  7.    
  8.   // ... 

在當前React中,組件mount時,執行邏輯1。

而在Strict Effect規則下,mount時的邏輯如下:

  • 組件mount時,執行邏輯1
  • React模擬組件unmount,執行邏輯2

  • React模擬組件mount,執行邏輯1

注意,這里useEffect的依賴項是[],在以往的認知里,依賴項為「空數組」意味著該useEffect邏輯只會在mount時執行一次。

而在v18的Strict Mode,由于包含了Strict Effect規則,mount時的useEffect邏輯會被重復執行。

某種程度上講,這種打破開發者既有認知的Breaking Change,比Concurrent Mode更讓人難以接受。

那么React團隊為什么要設計這條規則呢?

一切為了Offscreen

Offscreen是一個開發中的API,預計會在某個v18的小版本發布。

他的功能類似Vue中的keep-alive,用來在組件「失活」時在后臺保存組件狀態。

舉個Tab切換的例子,在Posts和Archive之間切換Tab:

當切換到Posts時,Archive屬于「失活」狀態。

如果不需要保存狀態,則銷毀Archive組件。當切換到Archive Tab時,再重新mount Archive。

當需要保存狀態時,只能將Posts與Archive的狀態保存在他們的父組件或狀態管理(比如Redux)中。

而有了Offscreen API,在Fiber樹(可以理解為虛擬DOM樹)層面,可以保存失活的組件結構與狀態。

這個API的應用場景主要包括:

  • 切換路由時保存之前路由的狀態
  • 預加載將要切換的路由

現在問題來了:當Offscreen組件從「失活」變為「活動」,會觸發什么生命周期函數呢?

答案是:componentDidMount以及:

  1. useEffect(() => { 
  2.    // 觸發這個邏輯... 
  3. }, []) 

當Offscreen組件從「活動」變為「失活」時,會觸發componentWillUnmount與:

  1. useEffect(() => { 
  2.    // ... 
  3.    return () => { 
  4.      // 觸發這個邏輯... 
  5.    } 
  6. }, []) 

所以,這些曾經被認為在組件生命周期中只會觸發一次的方法,由于Offscreen,在未來可能會多次觸發。

這也是React提前在StrictMode中加上Strict Effect規則的原因。

就像渣男變心前都會有些反常的舉動。

React18是真的挑戰

不管是Offscreen還是Concurrent Mode,可以預見隨著v18的到來,React會更強大,相應的學習曲線會更陡峭。

這既是機遇,也是挑戰。

千萬別等變化一股腦到眼前時再埋怨:

你個渣男,當初說好一心一意只會觸發一次,現在為了妖艷新特性,背叛我們的諾言。

到那時React只會拍拍屁股轉身,留下不羈的背影:

[[407909]]

參考資料

[1]StrictMode文檔:

https://zh-hans.reactjs.org/docs/strict-mode.html#detecting-unexpected-side-effects

 

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

2020-07-21 16:33:49

高德地圖高德家人地圖移動應用

2025-01-13 08:27:58

AI提示詞量化標準

2021-12-02 07:50:32

提測需求技術

2023-08-29 08:28:43

React并發更新

2020-10-19 10:25:57

ReactReact.js前端

2009-08-26 09:36:45

IT男

2025-01-20 06:10:00

2018-01-19 11:16:33

2017-04-12 11:15:52

ReactsetState策略

2015-08-20 09:50:30

2016-03-11 14:05:20

CIO時代網

2013-10-15 13:29:50

設計

2019-11-04 10:10:37

互聯網安全感 程序員

2020-10-13 08:36:30

React 架構機制

2014-08-11 16:09:04

應用開發

2017-02-20 11:48:15

戴爾

2020-04-06 12:13:46

Vue.jsReact框架

2020-03-03 15:31:47

ReactVue前端

2021-12-26 18:21:28

MySQLAlter更新表

2022-07-01 08:35:50

keyReact前端
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 色爱区综合 | 国产欧美日韩精品在线观看 | 色噜噜狠狠色综合中国 | 成人在线中文字幕 | 欧美一区二区三区久久精品 | 久久久久久久久国产精品 | 亚洲日本中文 | 91成人小视频 | 色视频网站 | 激情毛片 | www.99re| 亚洲乱码国产乱码精品精的特点 | 久久久高清 | 在线免费观看黄a | 国产超碰人人爽人人做人人爱 | 午夜精品一区二区三区在线观看 | 日本不卡一区二区 | 久久久久久黄 | 国产精品精品视频一区二区三区 | 国产91一区二区三区 | 久久久久国产一区二区三区 | 久草成人| 欧美日韩在线一区二区 | 中文字幕在线观看视频一区 | 欧美一区二区三区在线观看 | 日日夜夜精品免费视频 | 国产一区二区三区在线 | 国产区在线 | 日韩在线播放中文字幕 | 国产精品成人国产乱一区 | 亚洲天堂精品久久 | 亚洲精品日本 | 国产在线精品一区 | 欧美精品在线播放 | 国产成人精品免费视频大全最热 | 日本午夜免费福利视频 | 999精品视频 | 日韩精品一区二区在线观看 | 国产精品福利网 | 一区二区在线 | 日韩欧美三级电影在线观看 |