[30DaysChallenge] Hook - useEffect

30DaysChallenge 是自主性每兩天寫一篇技術相關的部落格

React

這篇回到 Hook 身上,來了解影響渲染也很重要的 Hook,useEffect!

useEffect

如果 useState 是用來儲存狀態,useEffect 看名字就知道是要用來影響某些事情

沒錯! 就是會發生某些事情,也可稱之 side effect!

語法及用途

useEffect 語法

useEffect(() => {
  A
  return () => {} //C
}, [B])

useEffect 的用途就是會在整個畫面渲染完成時,再執行裡面的動作

第一次以及隨後每次的渲染,都必定會執行useEffect

聽起來是不是很適合這時候串接 API 處理資料請求、更新一些計時、畫面更新等等呢?

那如果我不想每次都渲染呢?

沒問題,B 處的地方為 dependencies,填入對應的資料,通常都是填入 state

第一次執行後,每當dependencies裡面的資料有更新,就會再跑一次useEffect

回到語法上來看:

  • A 處就是放需要執行的動作,例如這邊就可以填入 API 請求
  • B 處(dependencies)則是會綁定特定資料,第一次進入畫面執行後過,若資料更新才會再執行

useEffect 的移除動作

還有一個 C 處 return function,這邊寫法是固定的

這一處的 return function 會再 useEffect 要執行之前,先執行一次

也就是說

1.

  • 第一次進入畫面,渲染完成
  • (A) 執行 useEffect 裡面的動作,執行完畢
  • (B) 若有 dependencies,useEffect 會好好觀察有沒有改變
  • (C) 若 dependencies 裡的資料改變了,會先執行 return function 內的動作
  • (A) 再來執行預計的動作
  • and so on…
  1. 另一個情況則是當元件從 DOM 上消失,也會執行,暫且先不理會這一點

-

通常都要避免監聽器疊加時,因前面提到,每次都會執行的特點

若同一個元素一直新增一樣的監聽器,可能會瘋掉吧

所以為了維持一個監聽器的數量,先移除、再安裝,就非常適合這時候使用

只要return function,就會屬於移除動作


為何要等渲染完成再執行其他動作?

在逛網頁的時候,有沒有發現當你第一次點進去時

沒有馬上出現資料,很常看到轉圈圈、閃爍的畫面、或是進度條…等等

由於跟後端請求資料時,難免會有時間差(或本來就很花時間)

為了不讓使用者乾等,會先渲染大部分的架構,

再用動畫方式(如:閃爍畫面),來讓使用者知道有正在抓資料

總不可能要全部弄好再渲染,那這樣使用者可能等不到你的畫面就離開了……


SUM UP

兩大 HOOK,就可以將原生的方式完全拋諸於腦後,但這兩個只是最基本的

  • useState: 儲存狀態及資料的好幫手
  • useEffect: 執行渲染期間的其他動作好幫手

在小專案中非常好用,但大專案的話就有不同的用法跟容身之地


下一篇要記錄啥呢?? 8/17