Autodesk 前端面試注重 React 最佳實踐和用戶體驗。本文通過登入表單實作,展示 React Hooks、表單驗證和狀態管理,oavoservice 助你掌握前端面試要點。
📋 題目要求
實作一個 React 登入表單,包含:
- 用戶名和密碼輸入
- 即時表單驗證
- 提交處理和錯誤提示
- Loading 狀態
- 響應式設計
🎯 核心考點
- React Hooks - useState, useEffect
- 表單處理 - 受控組件
- 驗證邏輯 - 客戶端驗證
- 用戶體驗 - Loading 和錯誤提示
- 程式碼組織 - 組件拆分
💡 實作方案(oavoservice 指導)
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 };
}
💼 oavoservice 助力
React 最佳實踐 - Hooks 和組件設計 用戶體驗 - Loading 和錯誤處理 程式碼質量 - 清晰的結構和註釋 性能優化 - 避免不必要的渲染
聯繫 oavoservice,專業前端面試輔助!
標籤: #Autodesk #React #前端面試 #表單處理 #VO輔助 #面試輔助 #一畝三分地
需要面試真題? 立刻聯繫微信 Coding0201,獲得真題。