Компоненты обновляются при каждом изменении состояния, потому что их реквизиты меняются. Функции, которые используются как обратные вызовы, должны быть запомнены, чтобы предотвратить это. То, что некоторые из них полагаются на текущее состояние, является проблемой, им нужно использовать функцию обновления, чтобы не ссылаться на устаревшее состояние:
const handleChange = useCallback((e) => {
setState((state) => ({ ...state, [e.target.name]: e.target.checked }))
}, [])
...
const handleInputChange = useCallback((event) => {
setValue(event.target.value === '' ? '' : Number(event.target.value))
}, [])
...
const handleBlur = useCallback(() => {
setValue(value => {
if (value < 8) {
return 8
} else if (value > 30) {
return 30
}
})
}, [])
На этом этапе дочерние компоненты могут предотвращать ненужные повторные отображения. Если они этого не делают, они должны быть дополнительно завернуты в React.PureComponent
или React.memo
. Для произвольного компонента оболочка может быть:
OptimizedComp = React.memo(props => <Comp {...props} />);