← Back to list

The Experience of being 2020 JSDC Speaker

嗨大家好,我是米蒂。擁有嚴重拖延症候群的我終於在一年後把擔任 JSDC 講師經驗給記錄下來(扶額)。雖然時間過了有點久,但我相信內容跟好酒一樣會越陳越香的啦(到底在說什麼)。說到這邊如果還有興趣看下去的話,且聽我分享!

Mindy · 2021-12-09 10:38 · 102 claps · 4.9 min read
#jsdc #javascript #react
Open on Medium ↗
Wiki topics: 🌐 · Web Development

The Experience of being 2020 JSDC Speaker

嗨大家好,我是米蒂。擁有嚴重拖延症候群的我終於在一年後把擔任 JSDC 講師經驗給記錄下來(扶額)。雖然時間過了有點久,但我相信內容跟好酒一樣會越陳越香的啦(到底在說什麼)。說到這邊如果還有興趣看下去的話,且聽我分享!

JSDC 是著名的 JS 開發者年會,這次非常榮幸能夠受邀為講者,分享 React Hooks 底層運作。

之前在公司有做過零星幾個分享,這次對外大眾演講倒是第一次,其實心中非常忐忑緊張,還好身邊有很多朋友聽我試講,感恩各位大大。

以此篇紀錄演講內容。

自己的工具自己造,咱們來 React Hooks

這次的演講主題同標題,主要想要向大家分享 React hooks 的底層運作。這次挑了 useEffect 及 useState 兩個 hooks 作討論。

💡沒有 Hooks 的世界長什麼樣子呢 ?

Hooks 是 React 16.8 釋出的新功能,在 Hooks 尚未釋出以前,在實作 component (以下皆會用「元件」來稱呼) 會是以 class(class component) 實作。class 是 Javascript 的語法糖,讓 Javascript 能夠更加物件導向。而 Hooks 的出現讓元件能夠以 function 實作(functional component),更加方便簡短。

試看以下程式碼:

[embed]

這段程式碼是在實作一個按鈕,使用者每按一下,count 就會加一。畫面大概會長這樣:

Counter 元件範例展示

Counter 元件範例展示

在實作上,會需要一個 constructor function 來初始化 state,最後會有一個 render function 來把畫面呈現出來。

this.setState({ count: this.state.count + 1})

是讓 count 改變的最主要的函式。

改成 hooks 版本後,程式碼如下:

[embed]

程式碼與 class 相比精簡相當多,setCount 這個 hook function 就能夠改變 state 的值。

那麼有了 hooks 後,除了程式碼精簡許多外,還有怎麼樣的優點呢?

Hooks 可以解決什麼問題 ?

🛑 共用邏輯可抽出做使用

hooks 基本上是 function,會繼承 function 的屬性。在寫程式的過程中,會盡量符合 「DRY」( Don’t repeat yourself )原則,會把重複性的程式邏輯抽出來共用,對 hooks 而言,可以抽出來做 custom hooks

🛑 邏輯拆分更加清楚不混亂

假設一個情境:因為某些特殊狀況需要在同一個元件裡處理兩支 API,若是以 class component 實作,會需要在同個 lifecycle ( 通常為componentDidmount )裡處理這兩支 API,邏輯會相當混雜。

而 hooks 的出現,可以在同一個元件裡使用複數個相同的 hooks ( 通常為 useEffect ),可以讓這兩支 API 可以分開實作,邏輯更加清楚。

試看以下程式碼:

class component

componentDidMount () {
  A API handler.....
  B API handler.....
}

functional component

useEffect(()=> {
    A API handler
})
useEffect(()=> {
    B API handler
})

Hooks 的規則

🛑 不能在迴圈、條件式 、nested functions 裡使用 hooks

在 function 裡面的 function 就是 nested function,例如 callback function 即是一種。 原因為 React 在記錄元件的 hooks 的順序是依靠 fiber 實作,以 linked list 方式依在元件內呼叫順序儲存 hooks,而如果在剛剛提到的三個條件做使用,會使 React 在呼叫 hooks 的時候順序亂掉,以至於會呼叫到錯的 state。

🛑 只會在 functional component 或是在 custom hooks 使用 hooks

元件間共用的 hooks function 可抽出來為 custom hooks。

可以想像 hooks 實作概念為操作 array 的過程

實作 useState

還記得前面 Counter 例子有出現以下這行嗎?

const [count, setCount] = useState(0)

useState 是很常使用到的 hook,本身是一個用來改變現在 state 狀態的 function,回傳值為陣列。陣列解構復賦值 後就能取得現在 state 的狀態及改變 state 的 function。

以下為以操作陣列為概念實作出的 useState 程式碼:

[embed]

實作 useEffect

useEffect(()=> callback, [dependencies])

useEffect 為處理 side effects 的 hooks function,會用到的場景通常為處理 API、訂閱、間聽事件。

💡 關於 useEffect 的執行順序

決定是否要執行的條件:有無 dependencies。

以下為實作 useEffect 的程式碼:

[embed]

⚙ 米蒂真心話 ⚙

這次會分享這個主題是拜公司讀書會所賜,當時對解構 hooks 底層實作非常有興趣,於是經過一番研究後,決定分享給更多人認識 hooks。 這次參加 JSDC 頗有收獲,認識了很多平常有在 follow 的大大們,非常開心。

此為演講 live coding 範例程式碼投影片,歡迎指教。

如果你喜歡我在 Medium 上的內容⋯

可以給我一些掌聲當作小小鼓勵喔 😻


메타데이터
post_id
87ad7aefae01
slug
the-experience-of-being-2020-jsdc-speaker-87ad7aefae01
url
https://medium.com/@zoratai/the-experience-of-being-2020-jsdc-speaker-87ad7aefae01
canonical_url
https://medium.com/@zoratai/the-experience-of-being-2020-jsdc-speaker-87ad7aefae01
author_url
https://medium.com/@zoratai
status
ok
fetched_at
2026-06-16 19:09:56