【React 學習筆記 EP.11】useEffect

更新 發佈閱讀 6 分鐘

什麼是 useEffect?

useEffect 是 React 用來處理 Side Effects(副作用)的 Hook,用於在元件渲染後執行與畫面無直接關係的操作,例如資料抓取或是操作 DOM。

useEffect 基礎語法

  1. 基本結構:useEffect(() => { 副作用邏輯 }, [依賴陣列])
  2. 依賴陣列:第二個參數決定 effect 的觸發時機,控制重新執行的條件。
  3. 空陣列 []:僅在元件初次掛載 (Mount) 時執行一次。
  4. 有值陣列 [val]:每當 val 變動時重新執行 effect
  5. 清除函式:在 useEffectreturn 一個函式,元件卸載或下次 effect 執行前會自動呼叫,用來清除上一次的副作用。

常見錯誤與解決方法

  1. useEffect 內直接修改了被列為依賴的狀態,導致「觸發 → 更新 → 觸發」的無限迴圈。
  2. 計時器或事件監聽未在 cleanup function 中移除,建議一律在 return () => {} 中呼叫對應的取消方法。
import { useState, useEffect } from "react";

function UserCard({ userId }) {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);

useEffect(() => {
// 每次 userId 改變時,重置載入與錯誤狀態
setLoading(true);
setError(null);

// 建立 AbortController 實例來控制/取消網路請求
const abortController = new AbortController();

fetch(`https://jsonplaceholder.typicode.com/users/${userId}`, {
signal: abortController.signal, // 將 signal 綁定到 fetch 請求
})
.then((res) => {
if (!res.ok) throw new Error("獲取資料失敗");
return res.json(); // 解析 JSON
})
.then((data) => {
setUser(data);
setLoading(false);
})
.catch((err) => {
if (err.name !== "AbortError") {
setError(err.message);
setLoading(false);
}
});

// 當 userId 改變或元件卸載時,取消前一次未完成的請求
return () => {
abortController.abort();
};
}, [userId]); // 依賴 userId,當 userId 改變時重新執行

// 條件渲染
if (loading) return <p>載入中...</p>;
if (error) return <p style={{ color: "red" }}>發生錯誤:{error}</p>;
if (!user) return <p>查無使用者</p>;

return (
<div>
<h2>{user.name}</h2>
<p>{user.email}</p>
</div>
);
}

export default UserCard;
import "./App.css";
import { useState } from "react";
import UserCard from "./components/UserCard";

const App = () => {
const [userId, setUserId] = useState(1); // 預設顯示 ID 為 1 的使用者

return (
<div>
{/* 點擊按鈕切換 userId,將新值傳入 UserCard 觸發 useEffect 重新抓取 */}
<button onClick={() => setUserId((id) => id + 1)}>
下一位使用者 (目前 ID: {userId})
</button>

<UserCard userId={userId} />
</div>
);
};

export default App;
留言
avatar-img
梧笙 WuSheng 的沙龍
67會員
57內容數
⛰️ 梧笙,意即「吾生」,我是一個平凡的理工宅男。 生活離不開 Code 與 Game,這裡主要紀錄與分享: 📖 學習筆記|紀錄我學習過的電腦技能與知識。 💻 科技新知|整理實用工具與科技領域的資訊。 🎮 電玩娛樂|聊聊遊戲動漫與實況直播的話題。 目前更新頻率不固定,有興趣歡迎追蹤。
2026/05/04
表單處理是收集使用者輸入並將其與應用程式資料同步的機制。在 React 中,我們通常透過狀態 (State) 來接管表單元素,以精確控制資料驗證與提交邏輯。
2026/05/04
表單處理是收集使用者輸入並將其與應用程式資料同步的機制。在 React 中,我們通常透過狀態 (State) 來接管表單元素,以精確控制資料驗證與提交邏輯。
2026/05/03
useState 陣列與物件基礎語法,複製狀態:使用 展開運算子 (Spread Operator) ... 將既有物件或陣列內容提取出來。物件更新:以 { ...prevObj, key: newValue } 的寫法覆寫特定屬性,同時保留其餘未修改的資料。
2026/05/03
useState 陣列與物件基礎語法,複製狀態:使用 展開運算子 (Spread Operator) ... 將既有物件或陣列內容提取出來。物件更新:以 { ...prevObj, key: newValue } 的寫法覆寫特定屬性,同時保留其餘未修改的資料。
2026/05/03
React 透過 SyntheticEvent 系統封裝了瀏覽器的原生事件,提供跨瀏覽器一致的互動介面。它是網頁應用程式回應使用者操作(如點擊、輸入、送出表單)的核心機制。
2026/05/03
React 透過 SyntheticEvent 系統封裝了瀏覽器的原生事件,提供跨瀏覽器一致的互動介面。它是網頁應用程式回應使用者操作(如點擊、輸入、送出表單)的核心機制。
看更多
你可能也想看
Thumbnail
動態導覽列為增加使用者經驗UX,要如何在Tailwind CSS上實現呢?這次JayLin來帶大家做一個動態導覽列(Animation Navigation)
Thumbnail
動態導覽列為增加使用者經驗UX,要如何在Tailwind CSS上實現呢?這次JayLin來帶大家做一個動態導覽列(Animation Navigation)
Thumbnail
Todo App是一個很好學習程式語言的專案開始,JayLin來帶大家手把手用TypeScript | React | TailwildCSS 來做一個小專案
Thumbnail
Todo App是一個很好學習程式語言的專案開始,JayLin來帶大家手把手用TypeScript | React | TailwildCSS 來做一個小專案
Thumbnail
5 月,方格創作島正式開島。這是一趟 28 天的創作旅程。活動期間,每週都會有新的任務地圖與陪跑計畫,從最簡單的帳號使用、沙龍建立,到帶著你從一句話、一張照片開始,一步一步找到屬於自己的創作節奏。不需要長篇大論,不需要完美的文筆,只需要帶上你今天的日常,就可以出發。征服創作島,抱回靈感與大獎!
Thumbnail
5 月,方格創作島正式開島。這是一趟 28 天的創作旅程。活動期間,每週都會有新的任務地圖與陪跑計畫,從最簡單的帳號使用、沙龍建立,到帶著你從一句話、一張照片開始,一步一步找到屬於自己的創作節奏。不需要長篇大論,不需要完美的文筆,只需要帶上你今天的日常,就可以出發。征服創作島,抱回靈感與大獎!
Thumbnail
這篇文章深入淺出地解釋 JavaScript 中表達式 (expression) 與陳述式 (statement) 的差異,並以 React 中 JSX 的應用為例,說明為何大括號 {} 內只能放入表達式。文章以類比人類語言的句子結構來幫助理解,並提供相關參考資料連結。
Thumbnail
這篇文章深入淺出地解釋 JavaScript 中表達式 (expression) 與陳述式 (statement) 的差異,並以 React 中 JSX 的應用為例,說明為何大括號 {} 內只能放入表達式。文章以類比人類語言的句子結構來幫助理解,並提供相關參考資料連結。
Thumbnail
當時間變少之後,看戲反而變得更加重要——這是在成為母親之後,我第一次誠實地面對這一件事:我沒有那麼多的晚上,可以任性地留給自己了。看戲不再只是「今天有沒有空」,而是牽動整個週末的結構,誰應該照顧孩子,我該在什麼時間回到家,隔天還有沒有精神帶小孩⋯⋯於是,我不得不學會一件以前並不擅長的事:挑選。
Thumbnail
當時間變少之後,看戲反而變得更加重要——這是在成為母親之後,我第一次誠實地面對這一件事:我沒有那麼多的晚上,可以任性地留給自己了。看戲不再只是「今天有沒有空」,而是牽動整個週末的結構,誰應該照顧孩子,我該在什麼時間回到家,隔天還有沒有精神帶小孩⋯⋯於是,我不得不學會一件以前並不擅長的事:挑選。
Thumbnail
見諸參與鄧伯宸口述,鄧湘庭於〈那個大霧的時代〉記述父親回憶,鄧伯宸因故遭受牽連,而案件核心的三人,在鄧伯宸記憶裡:「成立了成大共產黨,他們製作了五星徽章,印刷共產黨宣言——刻鋼板的——他們收集中共空飄的傳單,以及中國共產黨中央委員會有關文化大革命決議文的英文打字稿,另外還有手槍子彈十發。」
Thumbnail
見諸參與鄧伯宸口述,鄧湘庭於〈那個大霧的時代〉記述父親回憶,鄧伯宸因故遭受牽連,而案件核心的三人,在鄧伯宸記憶裡:「成立了成大共產黨,他們製作了五星徽章,印刷共產黨宣言——刻鋼板的——他們收集中共空飄的傳單,以及中國共產黨中央委員會有關文化大革命決議文的英文打字稿,另外還有手槍子彈十發。」
Thumbnail
當代名導基里爾.賽勒布倫尼科夫身兼電影、劇場與歌劇導演,其作品流動著強烈的反叛與詩意。在俄烏戰爭爆發後,他持續以創作回應專制體制的壓迫。《傳奇:帕拉贊諾夫的十段殘篇》致敬蘇聯電影大師帕拉贊諾夫。本文作者透過媒介本質的分析,解構賽勒布倫尼科夫如何利用影劇雙棲的特質,在荒謬世道中尋找藝術的「生存之道」。
Thumbnail
當代名導基里爾.賽勒布倫尼科夫身兼電影、劇場與歌劇導演,其作品流動著強烈的反叛與詩意。在俄烏戰爭爆發後,他持續以創作回應專制體制的壓迫。《傳奇:帕拉贊諾夫的十段殘篇》致敬蘇聯電影大師帕拉贊諾夫。本文作者透過媒介本質的分析,解構賽勒布倫尼科夫如何利用影劇雙棲的特質,在荒謬世道中尋找藝術的「生存之道」。
Thumbnail
useEffect 是 React 的一個 Hook,它告訴 React 在以下情況下執行某些代碼。 透過本章的學習,你將能夠 熟練使用 useEffect() 處理 React 副作用,並掌握 最佳實務,確保 React 應用運行順暢、效能最佳!
Thumbnail
useEffect 是 React 的一個 Hook,它告訴 React 在以下情況下執行某些代碼。 透過本章的學習,你將能夠 熟練使用 useEffect() 處理 React 副作用,並掌握 最佳實務,確保 React 應用運行順暢、效能最佳!
Thumbnail
React.js 是一個熱門的library,JayLin今天講解React核心概念以及利用一個小案例概括理論部分
Thumbnail
React.js 是一個熱門的library,JayLin今天講解React核心概念以及利用一個小案例概括理論部分
Thumbnail
本系列文章將循序漸進地介紹 JavaScript 的核心概念,從基礎語法到進階應用,例如非同步程式設計和 React 基礎。內容淺顯易懂,並使用生活化的比喻幫助讀者理解,搭配程式碼範例,適合 JavaScript 初學者學習。
Thumbnail
本系列文章將循序漸進地介紹 JavaScript 的核心概念,從基礎語法到進階應用,例如非同步程式設計和 React 基礎。內容淺顯易懂,並使用生活化的比喻幫助讀者理解,搭配程式碼範例,適合 JavaScript 初學者學習。
Thumbnail
這集介紹Next Image Module模組和CSS3如何定位在Next.js Framework
Thumbnail
這集介紹Next Image Module模組和CSS3如何定位在Next.js Framework
Thumbnail
這集跟大家初步介紹Next.js和如何安裝與設置最後製作一個作品集(Portfolio) 如果對設計有興趣的朋友們可以看以下連結文章來學習Figma設計軟件 https://vocus.cc/article/645c733dfd89780001ffe890
Thumbnail
這集跟大家初步介紹Next.js和如何安裝與設置最後製作一個作品集(Portfolio) 如果對設計有興趣的朋友們可以看以下連結文章來學習Figma設計軟件 https://vocus.cc/article/645c733dfd89780001ffe890
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News