React 代碼審查提示詞(hooks 依賴、無效重渲染、key、副作用清理逐項檢查)

審查 React 組件或排查「頁面卡、數據閃、請求發兩次、狀態不更新」這類問題時用:讓 AI 按 React 特有的問題清單逐項檢查 hooks 用法、渲染性能、列表 key、副作用清理和狀態設計,給出修改後的代碼。

NNathaniel bigo··原創首發·AI 輔助撰寫
通用大模型 對話模型通用
你是一名精通 React 的前端工程師,熟悉函數組件、hooks 的規則和常見反模式。請審查下面的組件。

背景:
- React 版本與框架:[如 React 19 + Next.js]
- 狀態管理方式:[狀態管理方式](例:useState、Redux、Zustand)
- 用戶反饋的問題:[如輸入框打字卡頓,沒有就寫無]
- 組件代碼(包括它用到的自定義 hook):
  [粘貼代碼]

逐項檢查,只報告真實存在的問題:
1. hooks 規則:是否在條件、循環裏調用 hook;自定義 hook 命名是否以 use 開頭。
2. useEffect:
   - 依賴數組是否完整,有沒有閉包拿到舊值;
   - 是否把本該在渲染時直接計算的派生數據放進了 effect + setState;
   - 訂閱、定時器、事件監聽、未完成的請求是否在清理函數里取消;
   - 開發模式嚴格模式下 effect 會執行兩次,代碼是否能承受。
3. 渲染性能:每次渲染都新建的對象、數組、函數傳給了被 memo 的子組件;狀態放得太高導致大範圍重渲染;是否真的需要 useMemo / useCallback(不要建議到處加)。
4. 列表:key 是否穩定唯一,有沒有用數組下標導致刪除、排序後狀態錯位。
5. 狀態設計:重複或可推導的狀態、多個狀態應該合併、受控與非受控輸入混用。
6. 其他:直接修改 state 對象或數組、在渲染中產生副作用、可訪問性(按鈕用 div、缺少 label)。

輸出:
- 問題表:嚴重程度 | 位置 | 問題 | 會導致的現象;
- 對嚴重問題給出修改後的代碼片段,說明改了什麼;
- 如果用戶反饋的問題能被某條解釋,明確指出是哪一條。

不確定的寫「需確認」,例如組件的父組件如何傳參會影響結論時。

高亮處換成你自己的內容:[如 React 19 + Next.js]、[狀態管理方式]、[如輸入框打字卡頓,沒有就寫無]、[粘貼代碼]

ChatGPT Plus 充值

已被複製 0 次

使用說明

怎麼填變量:[用戶反饋的問題] 很有用,「請求發了兩次」「切換標籤後顯示的還是上一個人的數據」這類描述能讓 AI 直接對上原因。組件用到的自定義 hook 一定要一起貼,很多問題藏在 hook 裏。

常見坑:

  • 開發模式下 React 嚴格模式會故意讓 effect 掛載、卸載、再掛載一次,看到請求發兩次不一定是 Bug;但如果沒有清理函數導致重複訂閱,那就是問題。
  • 不要讓 AI「給所有函數都加 useCallback」。只有傳給 memo 組件、或作為其他 hook 依賴的函數才值得加,否則只會讓代碼更難讀。
  • 用數組下標做 key,在列表只追加、不刪除不排序時沒問題;一旦能刪除或拖拽排序,輸入框內容就會串行。

追問技巧:修改後把新代碼貼回去,說「只檢查上次指出的問題是否都已修復,有沒有引入新的依賴問題」。

示例輸出

示例,僅供參考(節選)
嚴重程度位置問題現象
嚴重useEffect 第 14 行依賴數組缺少 userId,切換用戶後不會重新請求顯示上一個用戶的數據
嚴重同上請求沒有取消,快速切換時舊請求後返回會覆蓋新數據數據閃回
一般fullName 狀態由 first 和 last 推導,不需要單獨存成狀態多一次渲染
jsx
useEffect(() => {
  const controller = new AbortController()
  fetch(`/api/users/${userId}`, { signal: controller.signal })
    .then((r) => r.json())
    .then(setUser)
    .catch((e) => { if (e.name !== 'AbortError') setError(e) })
  return () => controller.abort()
}, [userId])

const fullName = `${first} ${last}` // 渲染時直接計算

同款作品

用這條提示詞做出來的作品;原作者會因此獲得積分

做同款

還沒有同款,來做第一個。

Nathaniel 的更多內容

同主題

同模型

0 條評論

登入 後參與評論

還沒有評論,來搶沙發~