Performance: Handling checkboxes and radio buttons
This affects interaction responsiveness and rendering speed when users toggle checkboxes or radio buttons in React forms.
function Form() { const [checked, setChecked] = React.useState(false); const handleChange = (e) => setChecked(e.target.checked); return <input type="checkbox" checked={checked} onChange={handleChange} />; }
function Form() { const [checked, setChecked] = React.useState(false); return <input type="checkbox" checked={checked} onChange={() => setChecked(!checked)} />; }
| Pattern | DOM Operations | Reflows | Paint Cost | Verdict |
|---|---|---|---|---|
| Direct state toggle without event | Minimal | 1 per toggle | Low | [!] OK |
| Using event.target.checked in handler | Minimal | 1 per toggle | Low | [OK] Good |
| Spreading state object on toggle | Minimal | 1 per toggle | Low to Medium | [!] OK |
| Functional state update with prev state | Minimal | 1 per toggle | Low | [OK] Good |
| Inline onChange handlers for radios | Minimal | 1 per toggle | Low | [!] OK |
| Single stable handler for radios | Minimal | 1 per toggle | Low | [OK] Good |
checked prop to reflect its state, not value.onChange event provides e.target.checked boolean to update state.function RadioGroup() {
const [selected, setSelected] = React.useState('');
return (
<div>
<input type='radio' name='group' value='1' checked={selected === '1'} onChange={e => setSelected(e.target.value)} /> Option 1
<input type='radio' name='group' value='2' checked={selected === '2'} onChange={e => setSelected(e.target.value)} /> Option 2
<p>Selected: {selected}</p>
</div>
);
}selected starts as empty string, so no radio is checked initially.onChange sets selected to '2'.Selected: 2 because state updated to '2'.function Checkbox() {
const [checked, setChecked] = React.useState(false);
return (
<input type='checkbox' checked={checked} onChange={e => setChecked(e.target.value)} />
);
}e.target.value, which is a string, not boolean.e.target.checked which is boolean true/false.Pass the test and this pattern moves unknown