React hooks之useEffect

useEffect(副作用)通過一個參數來實現模擬class組件的componentDidMount、componentWillUnmount還有componentDidUpdate這幾個生命周期函數
無阻塞更新:因為他是在組件掛載之后執行操作,比如請求數據,他是在組件掛載完了以后才執行數據請求,這樣就算請求失敗了,頁面也能正常顯示,不會報錯;
同一個組件可以多次使用useEffect。

第一種:第二個參數不傳值

相當于是監聽頁面的變化,只要頁面有更新,都會執行。
注意:不能在這個函數體內執行頁面更新操作,否則會陷入死循環

import React, { useEffect, useRef, useState, useReducer, useMemo } from 'react';
export default function HookDemo(props) {
    let [num, setNum] = useState(0);
    useEffect(() => {
        // 這個是監聽的頁面的變化,只要頁面有state變化就會執行,不能在這個函數體內執行頁面更新操作,否則會陷入死循環。
        // 類似class組件的componentDidUpdate
        console.log('頁面監聽');
    });
    return (
        <div style={{ padding: 30 }}>
            <div style={{ marginTop: 30 }}>
                {/* useEffect */}
                <h2>useEffect</h2>
                <h2>你點了我{num}次了</h2>
                <button onClick={() => setNum(num + 1)}>點擊</button>
            </div>
        </div>
    );
}

第二種:第二個參數傳[]

表示的是它不監聽頁面數據的變化,只有在頁面初始化和銷毀之前會執行;
執行的是類似于class組件的componentDidMount和componentWillUnmount兩個生命周期;

    useEffect(() => {
        // 類似componentDidMount
        console.log('初始化一下');
        return () => {
            // 類似componentWillUnmount
            console.log('什么都不監聽的時候return的函數');
        };
    }, []);

第三種:第二個參數傳具體的值

監聽第二個參數數組內所傳的值,當對應的state有更新時觸發。
注意:這里的執行順序其實不是先執行上一次useEffect return的函數,而是先正常執行下一次狀態更新然后再執行上一次的effct,然后再執行,下一次的effct。因為大多數情況下,effct不會阻塞頁面的更新。

    useEffect(() => {
        // 這個的執行順序是:先執行return里的函數,再執行外部函數體內的函數,return里獲取到的num未更新num前的數據。
        console.log('監聽num變化');
        console.log('函數體內獲取的num', num);      // 函數體內獲取的num 1
        return () => {
            console.log('監聽num的時候return的函數');
            console.log('return獲取的num', num);        // return獲取的num 0
        };
    }, [num]);

effct其實是組件輸出的一部分,單次渲染范圍內,effct里的props和state是保持不變的。

effects會在每次渲染后運行,并且概念上它是組件輸出的一部分,可以“看到”屬于某次特定渲染的props和state。就是只要組件有更新,useEffect都是作為組件輸出的一部分。
在單次渲染的范圍內,props和state都保持不變。
這一點上,函數式組件和class組件是不一樣的,因為class組件做了處理,this.state始終是指向最新的值,而不是屬于某次特定渲染的值。

    const lateInputValue = useRef(inputVal);
    useEffect(() => {
        setTimeout(() => {
            console.log(`延時獲取inputval的值:${inputVal}`);       
            // 延時獲取inputval的值:2  延時獲取inputval的值:23 延時獲取inputval的值:234
        }, 3000);
        // 用ref可以打破這種單次獨立渲染,因為ref始終指向的是最新的inpuval的值,所以在定時器范圍內更改了inputval的值,那么ref獲取到的就是最新的狀態值。
        lateInputValue.current = inputVal;
        setTimeout(() => {
            console.log(`驗證一下lateInputValue是幾? ${lateInputValue.current}`);      
            // 驗證一下lateInputValue是幾?  234 驗證一下lateInputValue是幾? 234    驗證一下lateInputValue是幾? 234
        }, 3000);
    }, [inputVal]);
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內容