Autodesk 前端面试注重 React 最佳实践和用户体验。本文通过登录表单实现,展React Hooks、表单验证和状态管理,csvosupport 助你掌握前端面试要点
📋 题目要求
实现一React 登录表单,包含:
- 用户名和密码输入
- 实时表单验证
- 提交处理和错误提
- Loading 状
- 响应式设
🎯 核心考点
- React Hooks - useState, useEffect
- 表单处理 - 受控组件
- 验证逻辑 - 客户端验
- 用户体验 - Loading 和错误提
- 代码组织 - 组件拆分
💡 实现方案(csvosupport 指导
import React, { useState } from 'react';
function LoginForm() {
const [formData, setFormData] = useState({
username: '',
password: ''
});
const [errors, setErrors] = useState({});
const [isLoading, setIsLoading] = useState(false);
const [submitError, setSubmitError] = useState('');
const validate = () => {
const newErrors = {};
if (!formData.username) {
newErrors.username = 'Username is required';
} else if (formData.username.length < 3) {
newErrors.username = 'Username must be at least 3 characters';
}
if (!formData.password) {
newErrors.password = 'Password is required';
} else if (formData.password.length < 6) {
newErrors.password = 'Password must be at least 6 characters';
}
return newErrors;
};
const handleChange = (e) => {
const { name, value } = e.target;
setFormData(prev => ({
...prev,
[name]: value
}));
// 清除该字段的错误
if (errors[name]) {
setErrors(prev => ({
...prev,
[name]: ''
}));
}
};
const handleSubmit = async (e) => {
e.preventDefault();
const newErrors = validate();
if (Object.keys(newErrors).length > 0) {
setErrors(newErrors);
return;
}
setIsLoading(true);
setSubmitError('');
try {
const response = await fetch('/api/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(formData)
});
if (!response.ok) {
throw new Error('Login failed');
}
const data = await response.json();
// 处理成功登录
console.log('Login successful', data);
} catch (error) {
setSubmitError('Invalid username or password');
} finally {
setIsLoading(false);
}
};
return (
<div className="login-container">
<form onSubmit={handleSubmit} className="login-form">
<h2>Login</h2>
<div className="form-group">
<label htmlFor="username">Username</label>
<input
type="text"
id="username"
name="username"
value={formData.username}
onChange={handleChange}
className={errors.username ? 'error' : ''}
disabled={isLoading}
/>
{errors.username && (
<span className="error-message">{errors.username}</span>
)}
</div>
<div className="form-group">
<label htmlFor="password">Password</label>
<input
type="password"
id="password"
name="password"
value={formData.password}
onChange={handleChange}
className={errors.password ? 'error' : ''}
disabled={isLoading}
/>
{errors.password && (
<span className="error-message">{errors.password}</span>
)}
</div>
{submitError && (
<div className="submit-error">{submitError}</div>
)}
<button
type="submit"
disabled={isLoading}
className="submit-button"
>
{isLoading ? 'Logging in...' : 'Login'}
</button>
</form>
</div>
);
}
export default LoginForm;
🎨 CSS 样式
.login-container {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
background: #f5f5f5;
}
.login-form {
background: white;
padding: 2rem;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
width: 100%;
max-width: 400px;
}
.form-group {
margin-bottom: 1.5rem;
}
.form-group label {
display: block;
margin-bottom: 0.5rem;
font-weight: 500;
}
.form-group input {
width: 100%;
padding: 0.75rem;
border: 1px solid #ddd;
border-radius: 4px;
font-size: 1rem;
}
.form-group input.error {
border-color: #e74c3c;
}
.error-message {
color: #e74c3c;
font-size: 0.875rem;
margin-top: 0.25rem;
display: block;
}
.submit-button {
width: 100%;
padding: 0.75rem;
background: #3498db;
color: white;
border: none;
border-radius: 4px;
font-size: 1rem;
cursor: pointer;
transition: background 0.3s;
}
.submit-button:hover:not(:disabled) {
background: #2980b9;
}
.submit-button:disabled {
background: #95a5a6;
cursor: not-allowed;
}
🚀 进阶优化
使用自定Hook
function useForm(initialValues, validate) {
const [values, setValues] = useState(initialValues);
const [errors, setErrors] = useState({});
const handleChange = (e) => {
const { name, value } = e.target;
setValues(prev => ({ ...prev, [name]: value }));
};
const handleSubmit = (callback) => (e) => {
e.preventDefault();
const validationErrors = validate(values);
setErrors(validationErrors);
if (Object.keys(validationErrors).length === 0) {
callback();
}
};
return { values, errors, handleChange, handleSubmit };
}
💼 csvosupport 助力
*React 最佳实 - Hooks 和组件设 用户体验 - Loading 和错误处 代码质量 - 清晰的结构和注释 性能优化 - 避免不必要的渲染
联系 csvosupport,专业前端面试辅助!
*标签 #Autodesk #React #前端面试 #表单处理 #VO辅助 #面试辅助 #一亩三分地
需要面试真题? 立刻联系微信 Coding0201,获得真题。