我們不該過度使用 useEffect

更新 發佈閱讀 3 分鐘

此文是我作為 React 工程師 (Junior) 的學習記錄(更新至 2026/03/12),歡迎各位大大指正。


上週面試時,遇到一個有趣的考題。面試官給了這段程式碼,請我找出這段程式碼有什麼問題。

function Form() {
const [firstName, setFirstName] = useState('Taylor');
const [lastName, setLastName] = useState('Swift');
const [fullName, setFullName] = useState('');

useEffect(() => {
setFullName(firstName + ' ' + lastName);
}, [firstName, lastName]);

// ...其他程式碼
}

(此段程式碼來源於React官網)

老實說,第一眼看上去只覺得程式看起來可以執行,邏輯上也沒問題呀?但其實,這是一種反模式(Anti-pattern)

這段程式碼主要存在著兩個問題:

    • 因為 React 渲染機制的關係,當我們修改 firstName 時,舊組件會先以舊的 fullName 渲染一次,再透過 useEffect 進行 state 更新,渲染成新的 fullName 。
    • 在後續的程式維護,我們被迫多維護 useEffect 的依賴,假設後續邏輯有變,可能會不小心忘記維護。


在 React 官方文件 You Might Not Need an Effect 中建議:如果某個值可以從現有的 props 或 state 計算出來,就不應該將其放入 state。


我們應該直接在渲染期間計算:

function Form() {
const [firstName, setFirstName] = useState('Taylor');
const [lastName, setLastName] = useState('Swift');

// 直接在渲染期間計算
const fullName = firstName + ' ' + lastName;

// ...其他程式碼
}

(此段程式碼來源於React官網)


useEffect 應該用於「處理副作用」,例如:操作 DOM、訂閱事件、或是呼叫 API 等與外部系統同步的行為。

如果是為了根據 A 狀態去更新 B 狀態,能直接推導出來的話,就讓它保持簡單吧!


留言
avatar-img
Ted 前端共享空間
0會員
1內容數
React 技術分享 | 前端職場心得 | 工程師成長筆記
你可能也想看
Thumbnail
5 月,方格創作島正式開島。這是一趟 28 天的創作旅程。活動期間,每週都會有新的任務地圖與陪跑計畫,從最簡單的帳號使用、沙龍建立,到帶著你從一句話、一張照片開始,一步一步找到屬於自己的創作節奏。不需要長篇大論,不需要完美的文筆,只需要帶上你今天的日常,就可以出發。征服創作島,抱回靈感與大獎!
Thumbnail
5 月,方格創作島正式開島。這是一趟 28 天的創作旅程。活動期間,每週都會有新的任務地圖與陪跑計畫,從最簡單的帳號使用、沙龍建立,到帶著你從一句話、一張照片開始,一步一步找到屬於自己的創作節奏。不需要長篇大論,不需要完美的文筆,只需要帶上你今天的日常,就可以出發。征服創作島,抱回靈感與大獎!
Thumbnail
當代名導基里爾.賽勒布倫尼科夫身兼電影、劇場與歌劇導演,其作品流動著強烈的反叛與詩意。在俄烏戰爭爆發後,他持續以創作回應專制體制的壓迫。《傳奇:帕拉贊諾夫的十段殘篇》致敬蘇聯電影大師帕拉贊諾夫。本文作者透過媒介本質的分析,解構賽勒布倫尼科夫如何利用影劇雙棲的特質,在荒謬世道中尋找藝術的「生存之道」。
Thumbnail
當代名導基里爾.賽勒布倫尼科夫身兼電影、劇場與歌劇導演,其作品流動著強烈的反叛與詩意。在俄烏戰爭爆發後,他持續以創作回應專制體制的壓迫。《傳奇:帕拉贊諾夫的十段殘篇》致敬蘇聯電影大師帕拉贊諾夫。本文作者透過媒介本質的分析,解構賽勒布倫尼科夫如何利用影劇雙棲的特質,在荒謬世道中尋找藝術的「生存之道」。
Thumbnail
近期遇到好幾位應徵者,當詢問為何離開前一份工作或是為何尋找外部新工作時,都欲言又止地提到和主管的相處有一些挑戰。若你也有相同的情形,離職原因和主管有關,可以如何回應比較恰當呢?在面試中坦然地談及挑戰、採取的積極性行動以及自身的正面學習,都可以有效回答這樣的問題。
Thumbnail
近期遇到好幾位應徵者,當詢問為何離開前一份工作或是為何尋找外部新工作時,都欲言又止地提到和主管的相處有一些挑戰。若你也有相同的情形,離職原因和主管有關,可以如何回應比較恰當呢?在面試中坦然地談及挑戰、採取的積極性行動以及自身的正面學習,都可以有效回答這樣的問題。
Thumbnail
當時間變少之後,看戲反而變得更加重要——這是在成為母親之後,我第一次誠實地面對這一件事:我沒有那麼多的晚上,可以任性地留給自己了。看戲不再只是「今天有沒有空」,而是牽動整個週末的結構,誰應該照顧孩子,我該在什麼時間回到家,隔天還有沒有精神帶小孩⋯⋯於是,我不得不學會一件以前並不擅長的事:挑選。
Thumbnail
當時間變少之後,看戲反而變得更加重要——這是在成為母親之後,我第一次誠實地面對這一件事:我沒有那麼多的晚上,可以任性地留給自己了。看戲不再只是「今天有沒有空」,而是牽動整個週末的結構,誰應該照顧孩子,我該在什麼時間回到家,隔天還有沒有精神帶小孩⋯⋯於是,我不得不學會一件以前並不擅長的事:挑選。
Thumbnail
時常有應徵者在苦惱,面試時面試官的最後一題「請問你有什麼想問的?」要怎麼回答?要如何在這一題中,讓面試官留下好印象,展現自己積極進取的態度?這篇文章,就來誠實的分享身為人資的我對這個議題的看法,並提供一些建議給大家參考。
Thumbnail
時常有應徵者在苦惱,面試時面試官的最後一題「請問你有什麼想問的?」要怎麼回答?要如何在這一題中,讓面試官留下好印象,展現自己積極進取的態度?這篇文章,就來誠實的分享身為人資的我對這個議題的看法,並提供一些建議給大家參考。
Thumbnail
領取來自塔羅占卜的訊息:這次的面試會有好的結果嗎?(無時間限制) ※靜下心來憑直覺從1.2.3.4中,選出一個數字※ 如果有不只一個面試機會,也可以選擇不同選項來接收不同訊息 (運勢提醒僅供參考,希望能幫助大家用來趨吉避凶,命運掌握在自己手中!) ************* ************
Thumbnail
領取來自塔羅占卜的訊息:這次的面試會有好的結果嗎?(無時間限制) ※靜下心來憑直覺從1.2.3.4中,選出一個數字※ 如果有不只一個面試機會,也可以選擇不同選項來接收不同訊息 (運勢提醒僅供參考,希望能幫助大家用來趨吉避凶,命運掌握在自己手中!) ************* ************
Thumbnail
本文針對面試邀約後的準備工作及臨場寒暄提供了一些實用建議,幫助求職者在面試的第一印象中脫穎而出。從回信確認面試資訊到保持適當的到達時間,以及如何利用寒暄時間增進雙方互動,我們提供了多方面的提醒。希望這些細節能幫助應徵者在面試過程中,抓住更多機會,贏得面試官的青睞。
Thumbnail
本文針對面試邀約後的準備工作及臨場寒暄提供了一些實用建議,幫助求職者在面試的第一印象中脫穎而出。從回信確認面試資訊到保持適當的到達時間,以及如何利用寒暄時間增進雙方互動,我們提供了多方面的提醒。希望這些細節能幫助應徵者在面試過程中,抓住更多機會,贏得面試官的青睞。
Thumbnail
見諸參與鄧伯宸口述,鄧湘庭於〈那個大霧的時代〉記述父親回憶,鄧伯宸因故遭受牽連,而案件核心的三人,在鄧伯宸記憶裡:「成立了成大共產黨,他們製作了五星徽章,印刷共產黨宣言——刻鋼板的——他們收集中共空飄的傳單,以及中國共產黨中央委員會有關文化大革命決議文的英文打字稿,另外還有手槍子彈十發。」
Thumbnail
見諸參與鄧伯宸口述,鄧湘庭於〈那個大霧的時代〉記述父親回憶,鄧伯宸因故遭受牽連,而案件核心的三人,在鄧伯宸記憶裡:「成立了成大共產黨,他們製作了五星徽章,印刷共產黨宣言——刻鋼板的——他們收集中共空飄的傳單,以及中國共產黨中央委員會有關文化大革命決議文的英文打字稿,另外還有手槍子彈十發。」
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News