跳至主要内容

React useEffect

async 的目的,是為了讓你可以在函式內 以同步的寫法處理非同步(平行執行)流程
useEffect 的功用在,將 js 回傳的 Promise 轉成 JSX 供 React 使用。

React 中使用 async 語法時,因為 await 回傳的是 Promise,而非 JSX。
但是 React Component 必須回傳 JSX,於是 React 便以 useEffect Hook 來封裝與管理回傳的 Promise 並適當地轉換成 JSX。

React 中使用 async 情境​

下方範例 回傳的會是以 Promise 封裝的內容。因部分動作被 React 封裝 (語法糖) 所以沒看到 Promise 字眼。

  • 處理 API Request。等待遠端伺服器回應時使用。
    async function fetchData() {
const res = await fetch("/api/data")
const data = await res.json()
setData(data)
}
  • 事件處理器中使用非同步,等待實際平行動作結束後才往後走。
    function Button() {
const handleClick = async () => {
await saveData()
alert("儲存完成")
}

return <button onClick={handleClick}>Save</button>
}
  • 搭配 try catch 處理錯誤,以同步語法方式處理非同步錯誤,以方便閱讀
    async function loadUser() {
try {
const res = await fetch("/api/user")
const user = await res.json()
setUser(user)
} catch (err) {
setError(err)
}
}

React 中的 UI Component​

  • 簡單說: useEffect 幫忙將 Promise 轉成 JSX。
  • React 在實作 Component 時也常以 function 作為結構定義。而此時 js function 回傳的必須是 JSX。
  • 當 Component 的 state 須由其他 API Server 取得時,則不可直接在 function 前加上 async,因為 UI Component 回傳的必須是 JSX 而不是 Promise。
  • React 提供 useEffect Hook 來處理非同步動作行為。
  • React 架構下將 async 動作傳給 useEffect,由 React 來管理異步操作。
  • useEffect 將所得的資料傳給 state 供後續渲染使用
  • useEffect 使用概念範例
    function MyComponent() {
useEffect(() => {
async function fetchData() {
const res = await fetch(...)
setData(res)
}
fetchData()
}, [])
}