useEffect

useEffect的含義:副作用鉤子棚唆,用于處理組件中的副作用泳猬,用來(lái)取代生命周期函數(shù)。所謂的"副作用"就是指的是組件中狀態(tài)或生命周期改變時(shí)在useEffect可監(jiān)聽(tīng)到前计。

如果熟悉class組件中生命周期方法均澳,可以將useEffect視作coponentDidMount恨溜、componentDidUpdate和componentWillUnmount的組合體。

useEffect使用的幾種方式找前,根據(jù)第二個(gè)參數(shù)的情況而定

  1. 無(wú)此參數(shù):組件的任何更新糟袁,該 useEffect 對(duì)應(yīng)的返回函數(shù)和函數(shù)都執(zhí)行
  2. 為空數(shù)組:只在componentDidMount執(zhí)行一次,不監(jiān)聽(tīng)組件的更新躺盛,
  3. 數(shù)組中有具體依賴:對(duì)應(yīng)的依賴數(shù)據(jù)项戴,有變化的時(shí)候,才會(huì)執(zhí)行(初始不會(huì)執(zhí)行)

清除 effect

通常槽惫,組件卸載時(shí)需要清除 effect 創(chuàng)建的諸如訂閱或計(jì)時(shí)器 ID 等資源周叮。要實(shí)現(xiàn)這一點(diǎn),useEffect 函數(shù)需返回一個(gè)清除函數(shù)界斜。以下就是一個(gè)事件綁定的例子:

import { useState, useEffect } from "react";
import * as ReactDOM from "react-dom";

function App() {
  const [position, setPosition] = useState({x:0, y: 0})

  useEffect(()=>{
    console.log('點(diǎn)擊了b')
    const mouseClickHandle = (e) =>{
      console.log('點(diǎn)擊了c')
      setPosition({
        x: e.clientX,
        y: e.clientY
      })
    }
    document.addEventListener('click', mouseClickHandle)
    
    // return ()=>{
    //   console.log('點(diǎn)擊了d')
    //   document.removeEventListener('click', mouseClickHandle)
    // }
  })
  console.log('點(diǎn)擊了a')

  return (
    <>
      <p>
        X:{position.x}, Y: {position.y}
      </p>
    </>
  )
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

執(zhí)行點(diǎn)擊事件仿耽,可以看到打印結(jié)果如下:

微信截圖_20211207151814.png

可以看到,當(dāng)我第三次點(diǎn)擊的時(shí)候锄蹂,打印結(jié)果顯示click事件被執(zhí)行了兩次氓仲,在這個(gè)示例中水慨,意味著組件的每一次更新都會(huì)創(chuàng)建新的事件綁定得糜,這很顯然是不被允許的。
這個(gè)時(shí)候就需要使用清除函數(shù)晰洒,清除函數(shù)會(huì)在組件卸載前執(zhí)行朝抖。另外,如果組件多次渲染(通常如此)谍珊,則在執(zhí)行下一個(gè) effect 之前治宣,上一個(gè) effect 就已被清除

useEffect允許返回一個(gè)函數(shù)來(lái)解決上述問(wèn)題:

 useEffect(()=>{
    console.log('點(diǎn)擊了b')
    const mouseClickHandle = (e) =>{
      console.log('點(diǎn)擊了c')
      setPosition({
        x: e.clientX,
        y: e.clientY
      })
    }
    document.addEventListener('click', mouseClickHandle)
    // 在此處返回一個(gè)解綁函數(shù)即可
    return ()=>{
      console.log('點(diǎn)擊了d')
      document.removeEventListener('click', mouseClickHandle)
    }
 })
 console.log('點(diǎn)擊了a')

當(dāng)返回一個(gè)解綁函數(shù)后再次測(cè)試發(fā)現(xiàn)砌滞,在組件在執(zhí)行下一個(gè) effect 之前侮邀,上一個(gè) effect 就已被清除(d在b之前打印可以印證這點(diǎn))。


微信截圖_20211207152514.png

下面再來(lái)印證上述提到的第二個(gè)參數(shù)為空數(shù)組的情況:

 useEffect(()=>{
    console.log('點(diǎn)擊了b')
    const mouseClickHandle = (e) =>{
      console.log('點(diǎn)擊了c')
      setPosition({
        x: e.clientX,
        y: e.clientY
      })
    }
    document.addEventListener('click', mouseClickHandle)
    
    return ()=>{
      console.log('點(diǎn)擊了d')
      document.removeEventListener('click', mouseClickHandle)
    }
  },[])
  console.log('點(diǎn)擊了a')
微信截圖_20211207153514.png

可以看到贝润,當(dāng)?shù)诙€(gè)參數(shù)為空數(shù)組的時(shí)候绊茧,b和d都沒(méi)有打印,說(shuō)明此時(shí)useEffect并不被執(zhí)行打掘,執(zhí)行的只是初始進(jìn)入就綁定的事件华畏。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鹏秋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子亡笑,更是在濱河造成了極大的恐慌侣夷,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仑乌,死亡現(xiàn)場(chǎng)離奇詭異百拓,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)晰甚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)耐版,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人压汪,你說(shuō)我怎么就攤上這事粪牲。” “怎么了止剖?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵腺阳,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我穿香,道長(zhǎng)亭引,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任皮获,我火速辦了婚禮焙蚓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘洒宝。我一直安慰自己购公,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布雁歌。 她就那樣靜靜地躺著宏浩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪靠瞎。 梳的紋絲不亂的頭發(fā)上比庄,一...
    開(kāi)封第一講書(shū)人閱讀 52,156評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音乏盐,去河邊找鬼佳窑。 笑死,一個(gè)胖子當(dāng)著我的面吹牛父能,可吹牛的內(nèi)容都是我干的神凑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼法竞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼耙厚!你這毒婦竟也來(lái)了强挫?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤薛躬,失蹤者是張志新(化名)和其女友劉穎俯渤,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體型宝,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡八匠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了趴酣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梨树。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖岖寞,靈堂內(nèi)的尸體忽然破棺而出抡四,到底是詐尸還是另有隱情,我是刑警寧澤仗谆,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布指巡,位于F島的核電站,受9級(jí)特大地震影響隶垮,放射性物質(zhì)發(fā)生泄漏藻雪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一狸吞、第九天 我趴在偏房一處隱蔽的房頂上張望勉耀。 院中可真熱鬧,春花似錦蹋偏、人聲如沸便斥。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)椭住。三九已至崇渗,卻和暖如春字逗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宅广。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工葫掉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人跟狱。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓俭厚,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親驶臊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挪挤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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