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)
|