遇到React的無(wú)限循環(huán)?死循環(huán)怎么辦?

創(chuàng)建日期: 2021年4月6日
最近帶新人云稚,經(jīng)常被求助隧饼,“無(wú)限循環(huán)了,怎么辦呀”静陈?
琢磨了一下燕雁,寫(xiě)下這篇筆記。本篇是基于使用react hooks的基礎(chǔ)上窿给,完成的贵白。

1. useEffect

副作用。簡(jiǎn)單點(diǎn)說(shuō)崩泡,每次進(jìn)入新畫(huà)面的時(shí)候,畫(huà)面里如果有這個(gè)方法猬膨,都會(huì)被調(diào)用角撞。如果單純的React項(xiàng)目,那么很可能就是它的問(wèn)題勃痴。

useEffect(() => {
// 代碼...
}, [這里是依賴(lài)]);

調(diào)查方法:

  • 首先谒所,檢查,添加依賴(lài)的中括號(hào)“[ ]”是否添加了沛申?新人劣领,有的會(huì)忘記寫(xiě)這個(gè)。
// 錯(cuò)誤例子
useEffect(() => {
// 代碼...
});  // 依賴(lài)的中括號(hào)“[ ]”忘記寫(xiě)了
  • 把依賴(lài)清空铁材,看看是否還死循環(huán)尖淘?
  • 如果注釋掉依賴(lài),死循環(huán)解決了的話著觉,那么我們要排查依賴(lài)的項(xiàng)目村生。
  1. 依賴(lài)?yán)锏淖兞坷铮嬖谕ㄟ^(guò)useState定義的狀態(tài)變量饼丘;
    那么趁桃,副作用的內(nèi)部,是否調(diào)用其對(duì)應(yīng)的setState方法肄鸽?如果有卫病,那么你要修改下邏輯了,但是典徘,你不能用了該狀態(tài)變量蟀苛,卻不把它加在依賴(lài)?yán)铩H绻患釉谝蕾?lài)?yán)锢谜敲茨愀弊饔美锏膕tate屹逛,永遠(yuǎn)都是初始值础废。
    例子:(代碼是直接在簡(jiǎn)書(shū)上盲敲的,有錯(cuò)誤的話罕模,請(qǐng)見(jiàn)諒)
const [visible, setVisible] = useState(false);
useEffect(() => {
  setVisible(!visible);
}, [visible]);

比如這個(gè)评腺,我們想根據(jù)state的當(dāng)前值,來(lái)決定接下來(lái)的設(shè)定淑掌。如果按上面的寫(xiě)法蒿讥,就會(huì)出現(xiàn)死循環(huán)。我們可以這樣寫(xiě):

const [visible, setVisible] = useState(false);
useEffect(() => {
  setVisible(preState => !preState);
}, []);
  1. 依賴(lài)?yán)锏淖兞颗淄螅嬖谝粋€(gè)普通的變量芋绸;
    那么,請(qǐng)嘗試用useMemo包裹一下這個(gè)普通變量担敌;
    例子:
const array = new Array();
useEffect(() => {
  // do something with array...
  // call setState(...)
}, [array]);

注意:依賴(lài)?yán)锏淖兞克ち玻玫氖菧\比較,因此全封,當(dāng)你因?yàn)檎{(diào)用setState重新刷新畫(huà)面的時(shí)候马昙,array會(huì)被認(rèn)為是一個(gè)新的對(duì)象,因此刹悴,useEffect會(huì)被再次調(diào)用行楞。
修改方法:

const array = useMemo(() => {
  return myArray;
}, [myArray]);
//...省略
  1. 依賴(lài)?yán)铮嬖诤瘮?shù)
    那么土匀,請(qǐng)嘗試用useCallback包裹一下這個(gè)函數(shù)子房。
    跟2的原理一樣,函數(shù)用useCallback包裹一下:
const getArray = useCallback(() => {
// do something to get array
  return ary;
}, []);
//...省略
  • 如果依賴(lài)注釋掉了就轧,還是死循環(huán)证杭,那么找找相關(guān)的地方吧,可能定位就定錯(cuò)了钓丰。

2. useFouceEffect

手機(jī)項(xiàng)目中躯砰,有時(shí)候會(huì)用到這個(gè)hooks(如果單詞拼寫(xiě)錯(cuò)了,請(qǐng)見(jiàn)諒)携丁,一般琢歇,定義里面的函數(shù)時(shí),都會(huì)用useCallback包裹一下梦鉴,否則李茫,容易出現(xiàn)死循環(huán)。另外肥橙,就是useCallback的依賴(lài)魄宏,排查方法與上面相同。

3. 自定義hooks

自定義hooks的好處存筏,就是多個(gè)畫(huà)面宠互,可以復(fù)用同一個(gè)方法味榛,現(xiàn)在也越來(lái)越被大家所喜歡。
在返回定義的方法(函數(shù))時(shí)予跌,推薦你用useCallback包裹一下搏色,否則,其他人如果在useEffect等地方調(diào)用它的時(shí)候券册,很容易引起死循環(huán)频轿。


好吧,先說(shuō)到這里烁焙。大概就這么些情況航邢。因?yàn)槊Γ晕醇邮吕a骄蝇。
如果你出現(xiàn)死循環(huán)膳殷,無(wú)法解決的話,可以給筆者留言乞榨。筆者也很想挑戰(zhàn)一下秽之。
如果,我的文章吃既,解決了你的問(wèn)題,麻煩動(dòng)動(dòng)你福氣的小手跨细,給點(diǎn)個(gè)贊鹦倚,我想知道,我的排查方法到底管不管用冀惭。

望本篇能把那些掙扎在死循環(huán)里的小伙伴們震叙,拖上岸??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市散休,隨后出現(xiàn)的幾起案子媒楼,更是在濱河造成了極大的恐慌,老刑警劉巖戚丸,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件划址,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡限府,警方通過(guò)查閱死者的電腦和手機(jī)夺颤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)胁勺,“玉大人世澜,你說(shuō)我怎么就攤上這事∈鹚耄” “怎么了寥裂?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵嵌洼,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我封恰,道長(zhǎng)麻养,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任俭驮,我火速辦了婚禮回溺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘混萝。我一直安慰自己遗遵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布逸嘀。 她就那樣靜靜地躺著车要,像睡著了一般。 火紅的嫁衣襯著肌膚如雪崭倘。 梳的紋絲不亂的頭發(fā)上翼岁,一...
    開(kāi)封第一講書(shū)人閱讀 51,287評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音司光,去河邊找鬼琅坡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛残家,可吹牛的內(nèi)容都是我干的榆俺。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼坞淮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼茴晋!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起回窘,我...
    開(kāi)封第一講書(shū)人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤诺擅,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后啡直,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體烁涌,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年付枫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了烹玉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡阐滩,死狀恐怖二打,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情掂榔,我是刑警寧澤继效,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布症杏,位于F島的核電站,受9級(jí)特大地震影響瑞信,放射性物質(zhì)發(fā)生泄漏厉颤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一凡简、第九天 我趴在偏房一處隱蔽的房頂上張望逼友。 院中可真熱鬧,春花似錦秤涩、人聲如沸帜乞。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)黎烈。三九已至,卻和暖如春匀谣,著一層夾襖步出監(jiān)牢的瞬間照棋,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工武翎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留烈炭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓宝恶,卻偏偏與公主長(zhǎng)得像梳庆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子卑惜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 前言 很早就知道hooks,但是那個(gè)時(shí)候并沒(méi)有去使用,就是大概的了解了下驻售,到后來(lái)使用了hooks露久,但是用的不深,總...
    json_q閱讀 1,130評(píng)論 0 0
  • React-Hooks 1. React-hooks是什么 我們先來(lái)看一下官網(wǎng)的解釋?zhuān)?Hook 是 React ...
    Linyqs閱讀 902評(píng)論 0 0
  • 前言 本文全面介紹了React Hooks的所有API概念欺栗、用法毫痕、豐富的demo以及部分底層原理。 實(shí)際上迟几,Rea...
    南宮__閱讀 3,579評(píng)論 0 6
  • 自從Hooks出現(xiàn)消请,函數(shù)式組件(Function Component)的功能在不斷豐富,你很可能已經(jīng)運(yùn)用Hooks...
    tracyXia閱讀 11,419評(píng)論 2 7
  • 今天感恩節(jié)哎类腮,感謝一直在我身邊的親朋好友臊泰。感恩相遇!感恩不離不棄蚜枢。 中午開(kāi)了第一次的黨會(huì)缸逃,身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,564評(píng)論 0 11