Why Use This
This skill provides specialized capabilities for coder's codebase.
Use Cases
- Developing new features in the coder repository
- Refactoring existing code to follow coder standards
- Understanding and working with coder's codebase structure
Install Guide
2 steps - 1
- 2
Install inside Ananke
Click Install Skill, paste the link below, then press Install.
https://github.com/coder/mux/tree/main/.mux/skills/react-effects
Skill Snapshot
Auto scan of skill assets. Informational only.
Valid SKILL.md
Checks against SKILL.md specification
Source & Community
Updated At Jan 19, 2026, 04:46 AM
Skill Stats
SKILL.md 116 Lines
Total Files 1
Total Size 2.7 KB
License AGPL-3.0
---
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
```tsx
// ❌ Derived state stored separately
const [fullName, setFullName] = useState('');
useEffect(() => setFullName(first + ' ' + last), [first, last]);
// ✅ Calculate during render
const fullName = first + ' ' + last;
```
```tsx
// ❌ Event logic in effect
useEffect(() => { if (isOpen) doSomething(); }, [isOpen]);
// ✅ In the handler
const handleOpen = () => { setIsOpen(true); doSomething(); };
```
```tsx
// ❌ 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`:
```tsx
// ❌ 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:
```tsx
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:
```tsx
let didInit = false;
function App() {
useEffect(() => {
if (!didInit) {
didInit = true;
loadDataFromLocalStorage();
checkAuthToken();
}
}, []);
}
```
Or run during module initialization (before render):
```tsx
if (typeof window !== 'undefined') {
checkAuthToken();
loadDataFromLocalStorage();
}
```