跳至主要内容

React useEffect

async 的目的,是為了讓你可以在函式內 以同步的寫法處理非同步(平行執行)流程

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

React 中使用 async 情境

  • 處理 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

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