← Назад к вопросам

Как сделать submit формы на React?

1.7 Middle🔥 231 комментариев
#React#Архитектура и паттерны

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как сделать submit формы на React

Отправка форм - одна из базовых задач в React. Существует несколько подходов: управляемые компоненты (controlled), неуправляемые (uncontrolled) и библиотеки для работы с формами.

1. Простая управляемая форма

import {useState} from 'react';

function LoginForm() {
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');
  const [isLoading, setIsLoading] = useState(false);

  const handleSubmit = async (e) => {
    e.preventDefault(); // Отменяем дефолтное поведение
    setIsLoading(true);

    try {
      const response = await fetch('/api/login', {
        method: 'POST',
        headers: {'Content-Type': 'application/json'},
        body: JSON.stringify({email, password})
      });

      if (response.ok) {
        const data = await response.json();
        console.log('Login successful', data);
        setEmail('');
        setPassword('');
      } else {
        alert('Login failed');
      }
    } catch (error) {
      console.error('Error:', error);
    } finally {
      setIsLoading(false);
    }
  };

  return (
    <form onSubmit={handleSubmit}>
      <input
        type="email"
        value={email}
        onChange={(e) => setEmail(e.target.value)}
        placeholder="Email"
        required
      />
      <input
        type="password"
        value={password}
        onChange={(e) => setPassword(e.target.value)}
        placeholder="Password"
        required
      />
      <button type="submit" disabled={isLoading}>
        {isLoading ? 'Logging in...' : 'Login'}
      </button>
    </form>
  );
}

2. Форма с несколькими полями (оптимизированная)

function ContactForm() {
  const [formData, setFormData] = useState({
    name: '',
    email: '',
    message: ''
  });

  const handleChange = (e) => {
    const {name, value} = e.target;
    setFormData(prev => ({...prev, [name]: value}));
  };

  const handleSubmit = async (e) => {
    e.preventDefault();

    const response = await fetch('/api/contact', {
      method: 'POST',
      headers: {'Content-Type': 'application/json'},
      body: JSON.stringify(formData)
    });

    if (response.ok) {
      alert('Message sent!');
      setFormData({name: '', email: '', message: ''});
    }
  };

  return (
    <form onSubmit={handleSubmit}>
      <input name="name" value={formData.name} onChange={handleChange} />
      <input name="email" value={formData.email} onChange={handleChange} />
      <textarea name="message" value={formData.message} onChange={handleChange} />
      <button type="submit">Send</button>
    </form>
  );
}

3. С валидацией ошибок

function SignUpForm() {
  const [formData, setFormData] = useState({email: '', password: '', confirmPassword: ''});
  const [errors, setErrors] = useState({});

  const validateForm = () => {
    const newErrors = {};
    if (!formData.email.includes('@')) newErrors.email = 'Invalid email';
    if (formData.password.length < 8) newErrors.password = 'Min 8 characters';
    if (formData.password !== formData.confirmPassword) newErrors.confirmPassword = 'Passwords do not match';
    return newErrors;
  };

  const handleSubmit = async (e) => {
    e.preventDefault();
    const validationErrors = validateForm();

    if (Object.keys(validationErrors).length > 0) {
      setErrors(validationErrors);
      return;
    }

    const response = await fetch('/api/signup', {
      method: 'POST',
      headers: {'Content-Type': 'application/json'},
      body: JSON.stringify({email: formData.email, password: formData.password})
    });

    if (response.ok) console.log('Account created!');
  };

  return (
    <form onSubmit={handleSubmit}>
      <input
        type="email"
        value={formData.email}
        onChange={(e) => setFormData({...formData, email: e.target.value})}
      />
      {errors.email && <span className="error">{errors.email}</span>}

      <input
        type="password"
        value={formData.password}
        onChange={(e) => setFormData({...formData, password: e.target.value})}
      />
      {errors.password && <span className="error">{errors.password}</span>}

      <input
        type="password"
        value={formData.confirmPassword}
        onChange={(e) => setFormData({...formData, confirmPassword: e.target.value})}
      />
      {errors.confirmPassword && <span className="error">{errors.confirmPassword}</span>}

      <button type="submit">Sign Up</button>
    </form>
  );
}

4. Форма с checkbox и select

function SurveyForm() {
  const [formData, setFormData] = useState({
    name: '',
    country: '',
    agreeTerms: false,
    interests: []
  });

  const handleCheckbox = (e) => {
    setFormData({...formData, agreeTerms: e.target.checked});
  };

  const handleMultiSelect = (e) => {
    const {value, checked} = e.target;
    if (checked) {
      setFormData({
        ...formData,
        interests: [...formData.interests, value]
      });
    } else {
      setFormData({
        ...formData,
        interests: formData.interests.filter(i => i !== value)
      });
    }
  };

  const handleSubmit = async (e) => {
    e.preventDefault();
    if (!formData.agreeTerms) {
      alert('You must agree to terms');
      return;
    }
    // Submit data
  };

  return (
    <form onSubmit={handleSubmit}>
      <input
        value={formData.name}
        onChange={(e) => setFormData({...formData, name: e.target.value})}
      />
      <select
        value={formData.country}
        onChange={(e) => setFormData({...formData, country: e.target.value})}
      >
        <option value="">Select country</option>
        <option value="US">USA</option>
        <option value="RU">Russia</option>
      </select>
      <label>
        <input type="checkbox" checked={formData.agreeTerms} onChange={handleCheckbox} />
        Agree to terms
      </label>
      <button type="submit">Submit</button>
    </form>
  );
}

5. Использование React Hook Form (рекомендуется)

import {useForm} from 'react-hook-form';

function AdvancedForm() {
  const {register, handleSubmit, formState: {errors}} = useForm();

  const onSubmit = async (data) => {
    const response = await fetch('/api/data', {
      method: 'POST',
      headers: {'Content-Type': 'application/json'},
      body: JSON.stringify(data)
    });
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <input {...register('email', {required: 'Email is required'})} />
      {errors.email && <span>{errors.email.message}</span>}

      <input {...register('password', {minLength: {value: 8, message: 'Min 8 chars'}})} />
      {errors.password && <span>{errors.password.message}</span>}

      <button type="submit">Submit</button>
    </form>
  );
}

Ключевые моменты

  • e.preventDefault() - отменяет дефолтное поведение (перезагрузка страницы)
  • Managed state - хранишь значение в state и обновляешь его
  • type="submit" - кнопка отправки формы
  • Валидация - проверяй данные перед отправкой
  • Error handling - обрабатывай ошибки сети и валидации
  • Loading state - показывай пользователю, что идёт отправка

Для сложных форм используй React Hook Form, это значительно упростит код.

Как сделать submit формы на React? | PrepBro