Проблема проста.
В операторе else в обоих обновлениях состояния вы распространяете предыдущее состояние и передаете новое обновленное значение. Однако вы должны знать, какие обновления состояния в обработчиках являются пакетными, т.е. если вы вызываете setState несколько раз, результат всех обновлений состояния объединяется в один и обновляется
При пакетировании изменения, которое вы внесли в [previous]
состояние потеряно, потому что следующий вызов обновления состояния также распространяет состояние, и поскольку обновления состояния асинхронны, c state
в
setState({ ...state, [event.target.name]: event.target.checked });
также будет ссылаться на исходное состояние до того, как был вызван какой-либо setState
Решение здесь для выполнения всех обновлений в одном вызове setState, например
setState({
...state,
[previous]: false,
[event.target.name]: event.target.checked
});
Однако вы должны отметить, что всякий раз, когда вы используете предыдущее состояние, как и выше, лучше использовать функциональный setState, а также сохраните значения событий перед их использованием, так как события Syntheti c повторно используются и обнуляются React
const { name, checked } = e.target;
setState(prevState => ({
...prevState,
[previous]: false,
[name]: checked
}));
В вашем блоке if все три обновления состояния работают, потому что когда они группируются, они ссылаются на разные средства обновления состояния