Задание: реализовать форму логина на React. Требования: - два поля: email + password - controlled inputs - сабмит формы с preventDefault - базовая валидация (поле не пустое) - по отправке выполнить async запрос (можно имитировать через setTimeout) - показать состояние loading (кнопка disabled) - показать ошибку при неуспешном логине Дополнительно (необязательно): - валидация email
sobes.tech AI
Answer from AI
jsx import React, { useState } from 'react';
function LoginForm() { const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [loading, setLoading] = useState(false); const [error, setError] = useState('');
const validateEmail = (email) => { // Simple email format check return /^[^\s@]+@[^\s@]+.[^\s@]+$/.test(email); };
const handleSubmit = (e) => { e.preventDefault(); setError('');
if (!email || !password) {
setError('Please fill in all fields');
return;
}
if (!validateEmail(email)) {
setError('Enter a valid email');
return;
}
setLoading(true);
// Simulate async request
setTimeout(() => {
setLoading(false);
// Example login check
if (email === 'user@example.com' && password === 'password123') {
alert('Login successful');
} else {
setError('Incorrect email or password');
}
}, 1500);
};
return ( <form onSubmit={handleSubmit}> <div> <label> Email: <input type="email" value={email} onChange={(e) => setEmail(e.target.value)} disabled={loading} /> </label> </div> <div> <label> Password: <input type="password" value={password} onChange={(e) => setPassword(e.target.value)} disabled={loading} /> </label> </div> {error && <div style={{ color: 'red' }}>{error}</div>} <button type="submit" disabled={loading}> {loading ? 'Logging in...' : 'Login'} </button> </form> ); }
export default LoginForm;