Agent Skills › coder/xum › react-effects

react-effects

GitHub

提供React中useEffect的使用与避免指南,包含决策树、合法场景及反模式示例,指导开发者正确管理副作用、数据获取和外部订阅。

.xum/skills/react-effects/SKILL.md coder/xum

Trigger Scenarios

询问React useEffect最佳实践 检查React组件中的副作用代码规范

Install

npx skills add coder/xum --skill react-effects -g -y
More Options

Non-standard path

npx skills add https://github.com/coder/xum/tree/main/.xum/skills/react-effects -g -y

Use without installing

npx skills use coder/xum@react-effects

指定 Agent (Claude Code)

npx skills add coder/xum --skill react-effects -a claude-code -g -y

安装 repo 全部 skill

npx skills add coder/xum --all -g -y

预览 repo 内 skill

npx skills add coder/xum --list

SKILL.md

Frontmatter
{
    "name": "react-effects",
    "description": "Guidelines for when to use (and avoid) useEffect in React components"
}

React Effects Guidelines

Primary reference: https://react.dev/learn/you-might-not-need-an-effect

Quick Decision Tree

Before adding useEffect, ask:

  1. Can I calculate this during render? → Derive it, don't store + sync
  2. Is this resetting state when a prop changes? → Use key prop instead
  3. Is this triggered by a user event? → Put it in the event handler
  4. Am I syncing with an external system? → Effect is appropriate

Legitimate Effect Uses

  • DOM manipulation (focus, scroll, measure)
  • External widget lifecycle (terminal, charts, non-React libraries)
  • Browser API subscriptions (ResizeObserver, IntersectionObserver)
  • Data fetching on mount/prop change
  • Global event listeners

Common Anti-Patterns

// ❌ Derived state stored separately
const [fullName, setFullName] = useState('');
useEffect(() => setFullName(first + ' ' + last), [first, last]);

// ✅ Calculate during render
const fullName = first + ' ' + last;
// ❌ Event logic in effect
useEffect(() => { if (isOpen) doSomething(); }, [isOpen]);

// ✅ In the handler
const handleOpen = () => { setIsOpen(true); doSomething(); };
// ❌ Reset state on prop change
useEffect(() => { setComment(''); }, [userId]);

// ✅ Use key to reset
<Profile userId={userId} key={userId} />

External Store Subscriptions

For subscribing to external data stores (not DOM APIs), prefer useSyncExternalStore:

// ❌ Manual subscription in effect
const [isOnline, setIsOnline] = useState(true);
useEffect(() => {
  const update = () => setIsOnline(navigator.onLine);
  window.addEventListener('online', update);
  window.addEventListener('offline', update);
  return () => { /* cleanup */ };
}, []);

// ✅ Built-in hook for external stores
const isOnline = useSyncExternalStore(
  subscribe,
  () => navigator.onLine,  // client
  () => true               // server
);

Data Fetching Cleanup

Always handle race conditions with an ignore flag:

useEffect(() => {
  let ignore = false;
  fetchData(query).then(result => {
    if (!ignore) setData(result);
  });
  return () => { ignore = true; };
}, [query]);

App Initialization

For once-per-app-load logic (not once-per-mount), use a module-level guard:

let didInit = false;

function App() {
  useEffect(() => {
    if (!didInit) {
      didInit = true;
      loadDataFromLocalStorage();
      checkAuthToken();
    }
  }, []);
}

Or run during module initialization (before render):

if (typeof window !== 'undefined') {
  checkAuthToken();
  loadDataFromLocalStorage();
}

Version History

  • c3aa2a6 Current 2026-08-28 21:04

Same Skill Collection

.agents/skills/dogfood/SKILL.md
.mux/skills/deep-review/SKILL.md
.mux/skills/dev-desktop-sandbox/SKILL.md
.mux/skills/dev-server-sandbox/SKILL.md
.mux/skills/generate-readme-screenshots/SKILL.md
.mux/skills/pull-requests/SKILL.md
.mux/skills/react-effects/SKILL.md
.mux/skills/tbench/SKILL.md
.mux/skills/tests/SKILL.md
.xum/skills/bug-bash/SKILL.md
.xum/skills/crap-gate/SKILL.md
.xum/skills/deep-review/SKILL.md
.xum/skills/dev-desktop-sandbox/SKILL.md
.xum/skills/dev-server-sandbox/SKILL.md
.xum/skills/generate-readme-screenshots/SKILL.md
.xum/skills/pull-requests/SKILL.md
.xum/skills/tbench/SKILL.md
.xum/skills/tests/SKILL.md
.agents/skills/electron/SKILL.md

Metadata

Files
0
Version
5cedf41
Hash
9a376b76
Indexed
2026-08-28 21:04

Accueil - Wiki
Copyright © 2011-2026 iteam. Current version is 2.155.2. UTC+08:00, 2026-11-01 11:54
浙ICP备14020137号-1