跳到正文
cccskills
免费在 GitHub 公开

debugging-react-hooks

Debug React hooks infinite loops, stale closures, and missing dependencies. Systematic approach.

中文简介正在准备中。当前显示原文说明。

查看安装方法

包含的文件(1)

  • SKILL.md2.9 KB

SKILL.md(原文)

安装前可以查看交给 AI 代理的指令内容。

The Most Common Hook Bugs

Bug 1: Infinite useEffect Loop

Symptom: Component re-renders endlessly, console floods with logs.

Cause Pattern:

// BUG: object/array created in render → new reference every render
useEffect(() => {
  setData(processData(rawData));
}, [processData]); // processData re-created every render!

Fix:

// Move stable values outside component, or use useCallback/useMemo
const processData = useCallback((data) => {
  return data.map(item => ({ ...item, processed: true }));
}, []); // empty deps = stable reference

useEffect(() => {
  setData(processData(rawData));
}, [processData, rawData]);

Bug 2: Stale Closure

Symptom: Effect reads old state value. The count is always 0 in a timer.

// BUG: count is captured at effect creation time (0)
useEffect(() => {
  const id = setInterval(() => {
    console.log(count); // always 0!
    setCount(count + 1); // always 1!
  }, 1000);
  return () => clearInterval(id);
}, []); // empty deps = stale closure

Fix:

// Option A: functional update (doesn't need count in deps)
useEffect(() => {
  const id = setInterval(() => {
    setCount(prev => prev + 1); // reads current value
  }, 1000);
  return () => clearInterval(id);
}, []);

// Option B: include count in deps (but re-registers interval)
useEffect(() => {
  const id = setInterval(() => setCount(count + 1), 1000);
  return () => clearInterval(id);
}, [count]);

Bug 3: Missing Dependency Warning → Incorrect Fix

Bad fix:

// Silencing ESLint by disabling rule — WRONG
useEffect(() => {
  fetchUser(userId); // depends on userId but it's not in deps
  // eslint-disable-next-line react-hooks/exhaustive-deps
}, []);

Correct fix:

useEffect(() => {
  fetchUser(userId);
}, [userId]); // proper dependency

Debugging Checklist

  1. Add console.log to identify the loop:

    useEffect(() => {
      console.log('Effect ran, deps:', dep1, dep2);
    }, [dep1, dep2]);
    
  2. Check if a dep is an object/array:

    // Each render creates a new object! → new reference → triggers effect
    const options = { limit: 10 }; // bad
    const options = useMemo(() => ({ limit: 10 }), []); // good
    
  3. React DevTools Profiler:

    • "Highlight updates when components render" — shows what's re-rendering
  4. Why Did You Render library:

    npm install @welldone-software/why-did-you-render
    

Rules of Hooks Compliance

  • Only call hooks at the top level (not inside loops/conditions)
  • Only call hooks from React functions
  • Install eslint-plugin-react-hooks — let the linter catch issues

评价

还没有评价。欢迎分享你的使用感受。

评论

无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。

还没有评论。来写第一条吧。

提交后会立即公开。请勿填写邮箱、电话等个人信息。URL 最多 2 个。

0 / 1000 字

此表单受 reCAPTCHA 保护,适用 Google 的隐私权政策和服务条款。

同一仓库的技能

anoa

免费

Drive a real browser from the command line — open pages, snapshot the interactive elements as refs, click and fill by ref, read text, run JS, screenshot. Use when a task needs a live browser: checking a page renders, walking a login or checkout flow, scraping something that only exists after JavaScript runs, or reproducing a UI bug.

中文简介正在准备中。当前显示原文说明。

porcupine-md/jonggrang162026年9月15日 更新

Run linters/typecheckers to calculate health score.

中文简介正在准备中。当前显示原文说明。

porcupine-md/jonggrang162026年9月15日 更新

Comprehensive UI/UX compliance check (A11y, performance, responsive).

中文简介正在准备中。当前显示原文说明。

porcupine-md/jonggrang162026年9月15日 更新

Infrastructure-first security audit (OWASP, secrets, dependencies).

中文简介正在准备中。当前显示原文说明。

porcupine-md/jonggrang162026年9月15日 更新

auth

免费

Setup authentication flow (register, login, session/JWT, middleware)

中文简介正在准备中。当前显示原文说明。

porcupine-md/jonggrang162026年9月15日 更新

Deep knowledge about deploying applications to AWS (EC2, ECS, S3, CloudFront, Cloud Run).

中文简介正在准备中。当前显示原文说明。

porcupine-md/jonggrang162026年9月15日 更新

查看 porcupine-md 的全部技能

报告此技能的问题