精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

React Hooks 在 React-refresh 模塊熱替換(HMR)下的異常行為

開發(fā) 前端
本篇文章主要講解 React Hooks 在 react-refresh 模式下的怪異行為,現(xiàn)在我來看下 react-refresh 對函數(shù)組件的工作機制。

[[400802]]

 什么是 react-refresh

react-refresh-webpack-plugin[1] 是 React 官方提供的一個 模塊熱替換(HMR)插件。

  • A Webpack plugin to enable "Fast Refresh" (also previously known as Hot Reloading) for React components.

在開發(fā)環(huán)境編輯代碼時,react-refresh 可以保持組件當前狀態(tài),僅僅變更編輯的部分。在 umi[2] 中可以通過 fastRefresh: {}快速開啟該功能。

圖片

 

這張 gif 動圖展示的是使用 react-refresh 特性的開發(fā)體驗,可以看出,修改組件代碼后,已經(jīng)填寫的用戶名和密碼保持不變,僅僅只有編輯的部分變更了。

react-refresh 的簡單原理

對于 Class 類組件,react-refresh 會一律重新刷新(remount),已有的 state 會被重置。而對于函數(shù)組件,react-refresh 則會保留已有的 state。所以 react-refresh 對函數(shù)類組件體驗會更好。本篇文章主要講解 React Hooks 在 react-refresh 模式下的怪異行為,現(xiàn)在我來看下 react-refresh 對函數(shù)組件的工作機制。

在熱更新時為了保持狀態(tài),useState 和 useRef 的值不會更新。

在熱更新時,為了解決某些問題[3],useEffect、useCallback、useMemo 等會重新執(zhí)行。

  • When we update the code, we need to "clean up" the effects that hold onto past values (e.g. passed functions), and "setup" the new ones with updated values. Otherwise, the values used by your effect would be stale and "disagree" with value used in your rendering, which makes Fast Refresh much less useful and hurts the ability to have it work with chains of custom Hooks.
圖片

如上圖所示,在文本修改之后,state保持不變,useEffect被重新執(zhí)行了。

react-refresh 工作機制導(dǎo)致的問題

在上述工作機制下,會帶來很多問題,接下來我會舉幾個具體的例子。

第一個問題

  1. import React, { useEffect, useState } from 'react'
  2.  
  3. export default () => { 
  4.   const [count, setState] = useState(0); 
  5.  
  6.   useEffect(() => { 
  7.     setState(s => s + 1); 
  8.   }, []); 
  9.  
  10.   return ( 
  11.     <div> 
  12.       {count
  13.     </div> 
  14.   ) 

 上面的代碼很簡單,在正常模式下,count值最大為 1。因為 useEffect 只會在初始化的時候執(zhí)行一次。但在 react-refresh 模式下,每次熱更新的時候,state 不變,但 useEffect 重新執(zhí)行,就會導(dǎo)致 count 的值一直在遞增。

圖片

如上圖所示,count 隨著每一次熱更新在遞增。

第二個問題

如果你使用了 ahooks[4] 或者 react-use[5] 的 useUpdateEffect,在熱更新模式下也會有不符合預(yù)期的行為。

  1. import React, { useEffect } from 'react'
  2. import useUpdateEffect from './useUpdateEffect'
  3.  
  4. export default () => { 
  5.  
  6.   useEffect(() => { 
  7.     console.log('執(zhí)行了 useEffect'); 
  8.   }, []); 
  9.  
  10.   useUpdateEffect(() => { 
  11.     console.log('執(zhí)行了 useUpdateEffect'); 
  12.   }, []); 
  13.  
  14.   return ( 
  15.     <div> 
  16.       hello world 
  17.     </div> 
  18.   ) 

 useUpdateEffect 與 useEffect相比,它會忽略第一次執(zhí)行,只有在 deps 變化時才會執(zhí)行。以上代碼的在正常模式下,useUpdateEffect 是永遠不會執(zhí)行的,因為 deps 是空數(shù)組,永遠不會變化。但在 react-refresh 模式下,熱更新時,useUpdateEffect 和 useEffect 同時執(zhí)行了。

圖片

造成這個問題的原因,就是 useUpdateEffect 用 ref 來記錄了當前是不是第一次執(zhí)行,見下面的代碼。

  1. import { useEffect, useRef } from 'react'
  2.  
  3. const useUpdateEffect: typeof useEffect = (effect, deps) => { 
  4.   const isMounted = useRef(false); 
  5.  
  6.   useEffect(() => { 
  7.     if (!isMounted.current) { 
  8.       isMounted.current = true
  9.     } else { 
  10.       return effect(); 
  11.     } 
  12.   }, deps); 
  13. }; 
  14.  
  15. export default useUpdateEffect; 

上面代碼的關(guān)鍵在 isMounted

初始化時,useEffect 執(zhí)行,標記 isMounted 為 true

熱更新后,useEffect 重新執(zhí)行了,此時 isMounted 為 true,就往下執(zhí)行了

第三個問題

最初發(fā)現(xiàn)這個問題,是 ahooks 的 useRequest 在熱更新后,loading 會一直為 true。經(jīng)過分析,原因就是使用 isUnmount ref 來標記組件是否卸載。

  1. import React, { useEffect, useState } from 'react'
  2.  
  3. function getUsername() { 
  4.   console.log('請求了'
  5.   return new Promise(resolve => { 
  6.     setTimeout(() => { 
  7.       resolve('test'); 
  8.     }, 1000); 
  9.   }); 
  10.  
  11. export default function IndexPage() { 
  12.  
  13.   const isUnmount = React.useRef(false); 
  14.   const [loading, setLoading] = useState(true); 
  15.  
  16.   useEffect(() => { 
  17.     setLoading(true); 
  18.     getUsername().then(() => { 
  19.       if (isUnmount.current === false) { 
  20.         setLoading(false); 
  21.       } 
  22.     }); 
  23.     return () => { 
  24.       isUnmount.current = true
  25.     } 
  26.   }, []); 
  27.  
  28.   return loading ? <div>loading</div> : <div>hello world</div>; 

 如上代碼所示,在熱更新時,isUnmount 變?yōu)榱藅rue,導(dǎo)致二次執(zhí)行時,代碼以為組件已經(jīng)卸載了,不再響應(yīng)異步操作。

如何解決這些問題

方案一

第一個解決方案是從代碼層面解決,也就是要求我們在寫代碼的時候,時時能想起來 react-refresh 模式下的怪異行為。比如 useUpdateEffect 我們就可以在初始化或者熱替換時,將 isMounted ref 初始化掉。如下:

  1. import { useEffect, useRef } from 'react'
  2.  
  3. const useUpdateEffect: typeof useEffect = (effect, deps) => { 
  4.   const isMounted = useRef(false); 
  5.  
  6. +  useEffect(() => { 
  7. +   isMounted.current = false
  8. +  }, []); 
  9.    
  10.   useEffect(() => { 
  11.     if (!isMounted.current) { 
  12.       isMounted.current = true
  13.     } else { 
  14.       return effect(); 
  15.     } 
  16.   }, deps); 
  17. }; 
  18.  
  19. export default useUpdateEffect; 

這個方案對上面的問題二和三都是有效的。

方案二

根據(jù)官方文檔[6],我們可以通過在文件中添加以下注釋來解決這個問題。

  1. /* @refresh reset */ 

添加這個問題后,每次熱更新,都會 remount,也就是組件重新執(zhí)行。useState 和 useRef 也會重置掉,也就不會出現(xiàn)上面的問題了。

官方態(tài)度

本來 React Hooks 已經(jīng)有蠻多潛規(guī)則了,在使用 react-refresh 時,還有潛規(guī)則要注意。但官方回復(fù)說這是預(yù)期行為,見該 issue[7]

  • Effects are not exactly "mount"/"unmount" — they're more like "show"/"hide".

不管你暈沒暈,反正我是暈了,╮(╯▽╰)╭。

參考資料

[1]react-refresh-webpack-plugin:

https://github.com/pmmmwh/react-refresh-webpack-plugin

[2]umi:

https://umijs.org/zh-CN/docs/fast-refresh

[3]為了解決某些問題:

https://github.com/facebook/react/issues/21019#issuecomment-800650091

[4]ahooks:

https://github.com/alibaba/hooks/blob/master/packages/hooks/src/useUpdateEffect/index.ts

[5]react-use:

https://github.com/streamich/react-use/blob/master/docs/useUpdateEffect.md

[6]官方文檔:

https://github.com/pmmmwh/react-refresh-webpack-plugin/blob/main/docs/API.md#reset

[7]issue:

https://github.com/facebook/react/issues/21019

 

責任編輯:姜華 來源: 前端技術(shù)磚家
相關(guān)推薦

2019-08-20 15:16:26

Reacthooks前端

2022-08-21 09:41:42

ReactVue3前端

2023-11-06 08:00:00

ReactJavaScript開發(fā)

2021-03-18 08:00:55

組件Hooks React

2020-10-28 09:12:48

React架構(gòu)Hooks

2022-03-31 17:54:29

ReactHooks前端

2020-09-19 17:46:20

React Hooks開發(fā)函數(shù)

2021-05-18 08:21:38

React HooksReact前端

2019-03-13 10:10:26

React組件前端

2021-02-02 11:02:20

React任務(wù)饑餓行為優(yōu)先級任務(wù)

2021-09-26 09:40:25

React代碼前端

2022-04-16 20:10:00

React Hookfiber框架

2022-07-18 09:01:58

React函數(shù)組件Hooks

2022-02-10 19:15:18

React監(jiān)聽系統(tǒng)模式

2021-05-11 08:48:23

React Hooks前端

2023-05-08 07:52:29

JSXReactHooks

2020-08-10 06:31:01

React Hooks前端開發(fā)

2022-03-16 22:24:50

ReactstateHooks

2021-11-05 10:36:19

性能優(yōu)化實踐

2023-02-02 08:41:14

React團隊Vite
點贊
收藏

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

久久精品视频在线看| 97精品国产| 樱花影视一区二区| 91久久极品少妇xxxxⅹ软件 | 国产麻豆剧传媒精品国产av| av伦理在线| 91麻豆文化传媒在线观看| 欧美一区二区三区四区在线| 欧美做受喷浆在线观看| 欧美成人精品三级网站| 中文字幕一区二区三区不卡在线 | 成人深夜福利| 亚洲精品日日夜夜| 久久偷看各类wc女厕嘘嘘偷窃| 中文字幕日本视频| 中文在线日韩| 亚洲系列中文字幕| 少妇熟女视频一区二区三区| 成人小电影网站| 亚洲视频一二三区| 久久99国产精品99久久| 国产一区二区在线不卡| 一区二区91| 久久久精品视频在线观看| 在线精品一区二区三区| 99亚洲男女激情在线观看| 性做久久久久久免费观看| 日韩三级电影网站| 人妻一区二区三区四区| 日本午夜一本久久久综合| 久久久久久97| 日韩国产第一页| 亚瑟一区二区三区四区| 日韩午夜在线观看| 久久久久免费精品| 国产激情小视频在线| 91美女在线视频| 不卡视频一区二区三区| 一级淫片免费看| 毛片一区二区| 久久久免费精品| 午夜剧场免费在线观看| 狠狠做深爱婷婷综合一区| 日韩精品一区二| 亚洲精品20p| 成人欧美大片| 欧美日韩国产综合新一区| 黄色网zhan| 黄色国产在线| 337p粉嫩大胆噜噜噜噜噜91av| 国产女人18毛片水18精品| 黄色在线视频网址| 日韩天天综合| 午夜精品理论片| 69av视频在线| 在线免费观看日本欧美爱情大片| 一本大道亚洲视频| 少妇按摩一区二区三区| 加勒比久久高清| 亚洲精品一区二区三区福利| 中文字幕在线视频一区二区| 欧美成人aaa| 欧美日韩国产综合草草| 日韩一级免费片| 偷拍精品精品一区二区三区| 色呦呦日韩精品| 熟妇人妻va精品中文字幕| 黑人巨大精品| 色嗨嗨av一区二区三区| 欧美三级午夜理伦三级| 亚洲美女尤物影院| 日韩欧美国产一区二区| 久久精品国产精品亚洲色婷婷| 国产一二三在线| 亚洲精品免费在线| 成人免费网站入口| 国产美女情趣调教h一区二区| 国产精品对白交换视频| 亚洲视频sss| 国产精品久久麻豆| 亚洲最大成人网4388xx| www.av毛片| 俄罗斯一级**毛片在线播放 | 亚洲午夜精品福利| 日韩成人影视| 亚洲综合免费观看高清完整版在线| 国产一区 在线播放| av黄在线观看| 午夜视频在线观看一区| 97视频在线免费播放| 色8久久影院午夜场| 欧美日本在线视频| 亚洲欧洲日韩综合| 亚洲精品3区| 按摩亚洲人久久| 欧美极品视频在线观看| 在线免费高清一区二区三区| 欧美一区在线直播| 中文字幕网址在线| 国产成人免费视频一区| 快播亚洲色图| 男人和女人做事情在线视频网站免费观看| 国产精品家庭影院| 99亚洲精品视频| 亚洲校园激情春色| 日韩视频一区二区三区在线播放| 亚洲第一香蕉网| 国内自拍一区| 国产精品爽黄69| 日本护士...精品国| 亚洲欧美日韩国产成人精品影院 | 日韩乱码在线视频| 校园春色 亚洲| 奇米影视一区二区三区| 精品日本一区二区三区在线观看 | av一区二区高清| 国内精品一区二区三区| 国产一区二区三区四区视频| 久久蜜桃av一区二区天堂| 国产一区 在线播放| 免费成人黄色网| 亚洲性生活视频| 日韩高清免费av| 国产成人综合精品三级| 一区二区三区四区免费视频| 写真福利精品福利在线观看| 亚洲成人网在线| 九九热精品免费视频| 久久电影网站中文字幕| 视频一区国产精品| a日韩av网址| 亚洲精品乱码久久久久久金桔影视| 国产女人被狂躁到高潮小说| 九色综合狠狠综合久久| 四虎影视永久免费在线观看一区二区三区| 白浆在线视频| 亚洲国产精品久久久久秋霞蜜臀| 国产这里有精品| 国产酒店精品激情| 国产精品av免费观看| 国产日本亚洲| 欧美精品免费在线| 国产强伦人妻毛片| 中文字幕欧美一区| 天天干天天色天天干| 91综合在线| 亚洲自拍偷拍色片视频| av免费网站在线| 日韩小视频在线观看专区| 免费中文字幕在线| 国产成人精品影视| 99在线精品免费视频| 精品网站aaa| 茄子视频成人在线| 黄色av网站在线免费观看| 在线免费观看视频一区| 国产99在线 | 亚洲| 免费观看一级特黄欧美大片| 亚洲欧洲精品一区| 91精品网站在线观看| 久久影院在线观看| 俄罗斯嫩小性bbwbbw| 午夜视频一区在线观看| 蜜桃无码一区二区三区| 美女在线一区二区| 超碰在线免费观看97| 欧美特黄不卡| 97视频在线观看播放| 黄色片在线免费看| 91精品免费在线观看| 精品无码黑人又粗又大又长| av一区二区三区在线| 日韩精品一区二区三区色欲av| 国内精品伊人久久久| 91精品在线观| 久草在线资源福利站| 一本色道久久88亚洲综合88| 国产草草影院ccyycom| 亚洲无线码一区二区三区| 男生裸体视频网站| 免费的国产精品| 欧美日韩视频免费| 久9久9色综合| 亚洲在线免费视频| 原纱央莉成人av片| 久久久极品av| 嫩草精品影院| 日韩午夜av一区| 手机在线看片1024| 亚洲综合丝袜美腿| 成人免费无遮挡无码黄漫视频| 精品亚洲成a人| 国产h视频在线播放| 欧美3p在线观看| 狠狠色综合色区| 精品国产美女a久久9999| 国内久久久精品| 一区二区三区视频网站| 亚洲第一视频网站| 国产孕妇孕交大片孕| 黑人巨大精品欧美一区免费视频 | 牛牛精品在线| 色悠悠久久久久| 天堂中文在线资源| 欧美日本乱大交xxxxx| 日韩久久中文字幕| 一级特黄大欧美久久久| 国产一二三av| 91蝌蚪porny成人天涯| 佐佐木明希电影| 美女视频网站黄色亚洲| 秋霞无码一区二区| 一精品久久久| 午夜精品一区二区三区四区 | 精品一区二区三区久久| 黄在线观看网站| 欧美日韩亚洲一区| 日本在线观看一区二区| 极品束缚调教一区二区网站| 成人性生交大片免费观看嘿嘿视频| 蜜桃麻豆影像在线观看| 色综合久综合久久综合久鬼88| 97人人在线| 亚洲人午夜精品免费| 偷拍精品一区二区三区| 精品国产乱码久久久久久牛牛| 国产精品亚洲欧美在线播放| 在线亚洲+欧美+日本专区| 日韩精品在线免费视频| 亚洲国产另类av| 国产性猛交普通话对白| 亚洲免费伊人电影| 亚洲女人久久久| 国产精品久久久久婷婷| 91视频免费看片| 中文字幕乱码一区二区免费| 国产又粗又猛又爽视频| 2021国产精品久久精品| 亚洲国产精品无码久久久久高潮 | 日韩wuma| 国产综合久久久| 欧洲一区二区日韩在线视频观看免费 | 一本色道综合久久欧美日韩精品| 成人一区二区在线观看| 怡红院一区二区| 不卡的电视剧免费网站有什么| 激情av中文字幕| 成人av在线播放网址| 亚洲av熟女高潮一区二区| 成人h动漫精品一区二区 | 亚洲国产精品t66y| 精品一区二区三区蜜桃在线| 中文字幕+乱码+中文字幕一区| 久久久精品成人| 一区在线观看免费| 国产人妻精品一区二区三区不卡 | 日韩精品一区二区在线播放| 亚洲第一av色| 国产欧美一区二区三区在线看蜜臂 | 亚洲欧洲一区二区在线观看| 国产精品91一区二区三区| 黄色一级片网址| 国内精品福利| 日本wwww视频| 秋霞影院一区二区| 一级黄色片国产| 成人午夜激情片| 久久亚洲AV成人无码国产野外| 久久精品视频一区二区三区| 情侣偷拍对白清晰饥渴难耐| 亚洲综合色婷婷| 亚洲影院在线播放| 欧美日韩高清在线| 精品国自产拍在线观看| 日韩av在线不卡| 成人在线观看黄色| 欧美日韩999| 亚洲成人看片| 91欧美视频网站| 色狼人综合干| 一区二区三区四区在线视频| 韩日在线一区| 天天碰免费视频| 国产精品一区二区无线| 亚洲av无码一区二区二三区| 国产精品传媒入口麻豆| 久久精品国产亚洲AV无码男同 | 国产喷水吹潮视频www| 亚洲精品久久视频| 91精彩视频在线观看| 欧美激情按摩在线| 国产91在线精品| 国产一区不卡在线观看| 色乱码一区二区三区网站| 亚洲人精品午夜射精日韩| 久久精品久久99精品久久| 国产在线观看免费播放| 欧美激情综合五月色丁香小说| 成人免费看片98| 欧美日韩国产123区| 日本ー区在线视频| 九九精品在线观看| 国模私拍国内精品国内av| 国产精品一区二区你懂得| 欧美成人自拍| www黄色在线| 99这里只有精品| 曰本女人与公拘交酡| 欧美亚洲动漫精品| 性感美女一级片| 欧美激情视频一区二区三区不卡| 成人毛片免费| 免费看污久久久| 伊人久久成人| 91丨porny丨九色| 国产精品福利av| 在线观看一二三区| 亚洲九九九在线观看| 激情国产在线| 成人免费视频视频在| 中文字幕亚洲精品乱码| 日本不卡一区二区在线观看| 欧美激情在线观看视频免费| 欧美黑人一区二区| 亚洲精品电影网站| 98色花堂精品视频在线观看| 亚洲一区免费网站| 在线电影一区二区| 91福利免费观看| www.av视频在线观看| 成人盗摄视频| 日韩欧美激情四射| 三级在线播放| 久久久久久久久综合| 9999精品| av动漫免费观看| 青青草原综合久久大伊人精品优势 | 欧美xxxxx牲另类人与| 黄网站在线播放| 91啪国产在线| 欧美日韩国产色综合一二三四| 免费人成视频在线播放| 亚洲欧美日本在线| 一起草av在线| 久久久国产一区二区三区| 99tv成人影院| 国产91在线亚洲| 成人小视频免费在线观看| 日韩三级av在线| 亚洲精品99久久久久中文字幕| www.51av欧美视频| 免费成人在线观看av| 丝袜国产日韩另类美女| 免费看黄色av| 欧美日韩精品欧美日韩精品 | 97婷婷涩涩精品一区| 欧美激情15p| 国产综合免费视频| 日本一区二区成人| 91精品国自产| 欧美多人乱p欧美4p久久| 超碰97久久| 日日碰狠狠添天天爽超碰97| 久久综合一区二区| 亚洲中文无码av在线| 久久天堂电影网| aaa国产精品视频| 黄色片一级视频| 国产精品视频一区二区三区不卡| 国产一区二区视频免费观看| 欧美精品在线第一页| 欧美网色网址| www.亚洲高清| 一个色妞综合视频在线观看| 香港三日本三级少妇66| 国产精品电影在线观看| 91精品国产91久久久久久密臀| 性农村xxxxx小树林| 色婷婷av一区| 18videosex性欧美麻豆| 国产呦系列欧美呦日韩呦| 日本不卡一区二区三区高清视频| 国产女人18水真多毛片18精品| 亚洲国产精品系列| 伦一区二区三区中文字幕v亚洲| www.xxx麻豆| 国产欧美日韩三区| 性生交生活影碟片| 国产精品7m视频| 欧美1区2区3区| 扒开jk护士狂揉免费| 91精品国产品国语在线不卡| 亚洲一级少妇| 97超碰人人爱| 久久久91精品国产一区二区精品 | 亚洲精品美女在线| 四虎精品在线观看| 成人免费aaa| 亚洲欧美一区二区三区孕妇| 欧美成人免费|