Homepage (site/index.html): integration-v14 promoted, Writings section integrated with 33 pieces clustered by type (stories/essays/miscellany), Writings welcome lightbox, content frame at 98% opacity. Co-Authored-By: Claude Sonnet 4.6 <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)
|