useEffect - 生命周期

在 React 中,function component 和 class component 相比較求妹,function component 是沒有生命周期的

我們可以用 useEffect 來代替在 class component 中研乒,一些有關(guān)生命周期的操作

我們用一個例子來說明 useEffect 的一些用法和作用

首先有一個 Example 組件汹忠,組件里面有一個 button,當(dāng)點擊 button 的時候雹熬,可以進行計數(shù)

在這個組件里面還有兩個 link宽菜,Index 和 List

function Example() {
    const [count, setCount] = useState(0);

    return (
        <div>
            <p>You clicked {count} times</p>
            <button onClick={() => { setCount(count + 1) }}>click me</button>

            <Router>
                <ul>
                    <li><Link to="/">Index</Link></li>
                    <li><Link to="/list/">Link</Link></li>
                </ul>
                <Route path="/" component={Index} exact></Route>
                <Route path="/list/" component={List} exact></Route>
            </Router>
        </div>

    )
}

export default Example;
function Index() {
    return (
        <p>this is Index</p>
    )
}
function List() {
    return (
        <p>this is List</p>
    )
}

現(xiàn)在頁面上是這樣子的

現(xiàn)在給 Index 和 list 分別加上 useEffect

function Index() {
    useEffect(() => {
        console.log("this is Index");
    })
    return (
        <p>this is Index</p>
    )
}
function List() {
    useEffect(() => {
        console.log("this is Link");
    })
    return (
        <p>this is List</p>
    )
}

當(dāng)頁面第一次渲染的時候

點擊 Link

可以看出此時 useEffect 有類似 componentDidMount 的作用

現(xiàn)在點擊兩次 button

可以看到 “this is Link” 又多打印了兩次,可以看出 useEffect 有類似 componentDidUpdate 的作用

注意:

  • React 首次渲染和之后的每次渲染都會調(diào)用一遍 useEffect 函數(shù)竿报,而componentDidMount 表示首次渲染铅乡, componentDidUpdate 表示更新導(dǎo)致的重新渲染
  • uesEffect 中定義的函數(shù)的執(zhí)行不會阻礙瀏覽器更新視圖,也就是說這些函數(shù)是異步執(zhí)行的烈菌,但是 componentDidMountcomponentDidUpdate 中的代碼都是同步執(zhí)行的

現(xiàn)在阵幸,我們給 useEffect 加上一個 return 函數(shù)

function Index() {
    useEffect(() => {
        console.log("this is Index");
        return () => {
            console.log("you have leaved Index");
        }
    })
    return (
        <p>this is Index</p>
    )
}
function List() {
    useEffect(() => {
        console.log("this is Link");
        return () => {
            console.log("you have leaved Link");
        }
    })
    return (
        <p>this is List</p>
    )
}

當(dāng)初次渲染,然后點擊 Link 的時候

再切換回 Index

可以看到在組件 unmount 的時候芽世, useEffect 里面的 return 函數(shù)被觸發(fā)了

所以 useEffect 也可以實現(xiàn) componentWillUnmount 的功能

但是挚赊!

當(dāng)我們點擊 button 的時候

可以看到 useEffect 里面的 return 也執(zhí)行了

但是我們不想讓它執(zhí)行,只是實現(xiàn) componentWillUnmount 的功能

這時候可以設(shè)置 useEffect 的第二個參數(shù)

function Index() {
    useEffect(() => {
        console.log("this is Index");
        return () => {
            console.log("you have leaved Index");
        }
    }, [])
    return (
        <p>this is Index</p>
    )
}

這時候點擊 button

切換

關(guān)于 useEffect 的第二個參數(shù)

我們現(xiàn)在給 Example 加一個 useEffect

useEffect(()=>{
  console.log(`useEffect=>You clicked ${count} times`)

   return ()=>{
      console.log('====================')
    }
},[count])

第一次渲染的時候

點擊 button 的時候

總結(jié):

  • 當(dāng)沒有 return 的時候
    • 第二個參數(shù)是副效應(yīng)函數(shù)的依賴項捂襟,只有該變量發(fā)生變化的時候咬腕,副效應(yīng)函數(shù)才執(zhí)行
    • 如果第二個參數(shù)是一個空數(shù)組,表明副效應(yīng)參數(shù)沒有任何依賴項葬荷,所以涨共,副效應(yīng)函數(shù)這時只會在組件加載進 DOM 后執(zhí)行一次
  • 當(dāng)有 return 的時候,return 函數(shù)部分
    • 如果沒有第二個參數(shù)宠漩,state 發(fā)生變化举反,組件 unmount 的時候會執(zhí)行;
    • 如果第二個參數(shù)是一個空數(shù)組扒吁,那么 return 部分和 componentWillUnmount 效果是一樣的
    • 如果有依賴項火鼻,依賴項發(fā)生變化的時候,雕崩,useEffect 第一個參數(shù)部分都會執(zhí)行魁索,并且 return 函數(shù)先執(zhí)行
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市盼铁,隨后出現(xiàn)的幾起案子粗蔚,更是在濱河造成了極大的恐慌,老刑警劉巖饶火,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹏控,死亡現(xiàn)場離奇詭異致扯,居然都是意外死亡,警方通過查閱死者的電腦和手機当辐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門抖僵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人缘揪,你說我怎么就攤上這事耍群。” “怎么了找筝?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵世吨,是天一觀的道長。 經(jīng)常有香客問我呻征,道長,這世上最難降的妖魔是什么罢浇? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任陆赋,我火速辦了婚禮,結(jié)果婚禮上嚷闭,老公的妹妹穿的比我還像新娘攒岛。我一直安慰自己,他們只是感情好胞锰,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布灾锯。 她就那樣靜靜地躺著,像睡著了一般嗅榕。 火紅的嫁衣襯著肌膚如雪顺饮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天凌那,我揣著相機與錄音兼雄,去河邊找鬼。 笑死帽蝶,一個胖子當(dāng)著我的面吹牛赦肋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播励稳,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼佃乘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了驹尼?” 一聲冷哼從身側(cè)響起趣避,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎扶欣,沒想到半個月后鹅巍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體千扶,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年骆捧,在試婚紗的時候發(fā)現(xiàn)自己被綠了澎羞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡敛苇,死狀恐怖妆绞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情枫攀,我是刑警寧澤括饶,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站来涨,受9級特大地震影響图焰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蹦掐,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一技羔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧卧抗,春花似錦藤滥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至泳秀,卻和暖如春标沪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背晶默。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工谨娜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人磺陡。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓趴梢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親币他。 傳聞我的和親對象是個殘疾皇子坞靶,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

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