Вопрос проверяет понимание причин двойного срабатывания обработчика submit формы и умение диагностировать такие баги в реальных проектах.
Двойной вызов обработчика отправки формы — классическая проблема, с которой сталкиваются и новички, и опытные разработчики. Причина почти всегда кроется в том, как именно событие submit распространяется по DOM или как фреймворк управляет жизненным циклом компонента.
function Form() {
const handleSubmit = (e) => {
e.preventDefault(); // обязательно, иначе страница перезагрузится
console.log('submit');
};
useEffect(() => {
const form = document.querySelector('form');
form.addEventListener('submit', handleSubmit);
// без cleanup слушатель добавится повторно при повторном монтировании
return () => form.removeEventListener('submit', handleSubmit);
}, []);
return (
<form onSubmit={handleSubmit}>
<button type="submit">Send</button>
</form>
);
}В этом примере обработчик навешен и через JSX, и через addEventListener — это гарантированный двойной вызов. Достаточно оставить один способ регистрации.
Итог: двойной submit почти всегда связан с дублированием регистрации обработчика или всплытием события. Правильный подход — один обработчик на форме, обязательный preventDefault и корректная очистка слушателей в useEffect.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию