gitignore 의 *.md / .claude/ 차단을 풀어 다음 파일을 git 으로 추적. - /CLAUDE.md, /AGENTS.md (루트 에이전트 가이드) - .agents/**/*.md (skills 문서 95개) - .claude/settings.json (Claude Code 프로젝트 설정) .claude/worktrees/ 는 git worktree 메타이므로 신규 ignore 라인으로 제외. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
46 lines
1.2 KiB
Markdown
46 lines
1.2 KiB
Markdown
---
|
|
title: Put Interaction Logic in Event Handlers
|
|
impact: MEDIUM
|
|
impactDescription: avoids effect re-runs and duplicate side effects
|
|
tags: rerender, useEffect, events, side-effects, dependencies
|
|
---
|
|
|
|
## Put Interaction Logic in Event Handlers
|
|
|
|
If a side effect is triggered by a specific user action (submit, click, drag), run it in that event handler. Do not model the action as state + effect; it makes effects re-run on unrelated changes and can duplicate the action.
|
|
|
|
**Incorrect (event modeled as state + effect):**
|
|
|
|
```tsx
|
|
function Form() {
|
|
const [submitted, setSubmitted] = useState(false)
|
|
const theme = useContext(ThemeContext)
|
|
|
|
useEffect(() => {
|
|
if (submitted) {
|
|
post('/api/register')
|
|
showToast('Registered', theme)
|
|
}
|
|
}, [submitted, theme])
|
|
|
|
return <button onClick={() => setSubmitted(true)}>Submit</button>
|
|
}
|
|
```
|
|
|
|
**Correct (do it in the handler):**
|
|
|
|
```tsx
|
|
function Form() {
|
|
const theme = useContext(ThemeContext)
|
|
|
|
function handleSubmit() {
|
|
post('/api/register')
|
|
showToast('Registered', theme)
|
|
}
|
|
|
|
return <button onClick={handleSubmit}>Submit</button>
|
|
}
|
|
```
|
|
|
|
Reference: [Should this code move to an event handler?](https://react.dev/learn/removing-effect-dependencies#should-this-code-move-to-an-event-handler)
|