react实现登录注册
使用React实现登录注册功能
创建React项目
确保已安装Node.js和npm。使用Create React App初始化项目:
npx create-react-app auth-app
cd auth-app
安装依赖
安装React Router和Axios用于路由管理和HTTP请求:
npm install react-router-dom axios
项目结构
src/
├── components/
│ ├── Login.js
│ ├── Register.js
│ └── Dashboard.js
├── App.js
├── index.js
└── styles.css
实现登录组件
// src/components/Login.js
import React, { useState } from 'react';
import axios from 'axios';
import { useNavigate } from 'react-router-dom';
function Login() {
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const navigate = useNavigate();
const handleSubmit = async (e) => {
e.preventDefault();
try {
const response = await axios.post('http://localhost:5000/api/login', {
email,
password
});
localStorage.setItem('token', response.data.token);
navigate('/dashboard');
} catch (error) {
console.error(error);
}
};
return (
<div>
<h2>Login</h2>
<form onSubmit={handleSubmit}>
<input
type="email"
placeholder="Email"
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
<input
type="password"
placeholder="Password"
value={password}
onChange={(e) => setPassword(e.target.value)}
/>
<button type="submit">Login</button>
</form>
</div>
);
}
export default Login;
实现注册组件
// src/components/Register.js
import React, { useState } from 'react';
import axios from 'axios';
import { useNavigate } from 'react-router-dom';
function Register() {
const [name, setName] = useState('');
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const navigate = useNavigate();
const handleSubmit = async (e) => {
e.preventDefault();
try {
await axios.post('http://localhost:5000/api/register', {
name,
email,
password
});
navigate('/login');
} catch (error) {
console.error(error);
}
};
return (
<div>
<h2>Register</h2>
<form onSubmit={handleSubmit}>
<input
type="text"
placeholder="Name"
value={name}
onChange={(e) => setName(e.target.value)}
/>
<input
type="email"
placeholder="Email"
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
<input
type="password"
placeholder="Password"
value={password}
onChange={(e) => setPassword(e.target.value)}
/>
<button type="submit">Register</button>
</form>
</div>
);
}
export default Register;
实现受保护路由
// src/App.js
import React from 'react';
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import Login from './components/Login';
import Register from './components/Register';
import Dashboard from './components/Dashboard';
function App() {
return (
<Router>
<Routes>
<Route path="/login" element={<Login />} />
<Route path="/register" element={<Register />} />
<Route path="/dashboard" element={<Dashboard />} />
<Route path="/" element={<Login />} />
</Routes>
</Router>
);
}
export default App;
实现仪表盘组件
// src/components/Dashboard.js
import React from 'react';
import { useNavigate } from 'react-router-dom';
function Dashboard() {
const navigate = useNavigate();
const handleLogout = () => {
localStorage.removeItem('token');
navigate('/login');
};
return (
<div>
<h2>Welcome to Dashboard</h2>
<button onClick={handleLogout}>Logout</button>
</div>
);
}
export default Dashboard;
添加基本样式
/* src/styles.css */
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 20px;
}
form {
display: flex;
flex-direction: column;
max-width: 300px;
margin: 0 auto;
}
input {
margin-bottom: 10px;
padding: 8px;
}
button {
padding: 8px;
background-color: #007bff;
color: white;
border: none;
cursor: pointer;
}
button:hover {
background-color: #0056b3;
}
后端API实现
需要Node.js后端处理登录注册请求。简单示例:
// server.js
const express = require('express');
const bodyParser = require('body-parser');
const jwt = require('jsonwebtoken');
const app = express();
app.use(bodyParser.json());
const users = [];
const SECRET_KEY = 'your-secret-key';
app.post('/api/register', (req, res) => {
const { name, email, password } = req.body;
users.push({ name, email, password });
res.status(201).send('User registered');
});
app.post('/api/login', (req, res) => {
const { email, password } = req.body;
const user = users.find(u => u.email === email && u.password === password);
if (user) {
const token = jwt.sign({ email }, SECRET_KEY);
res.json({ token });
} else {
res.status(401).send('Invalid credentials');
}
});
app.listen(5000, () => console.log('Server running on port 5000'));
运行项目
启动前端:

npm start
启动后端:
node server.js
功能扩展建议
表单验证
添加表单验证确保用户输入符合要求:

const [errors, setErrors] = useState({});
const validate = () => {
const newErrors = {};
if (!email) newErrors.email = 'Email is required';
if (!password) newErrors.password = 'Password is required';
setErrors(newErrors);
return Object.keys(newErrors).length === 0;
};
持久化登录状态
创建高阶组件保护路由:
function ProtectedRoute({ element }) {
const token = localStorage.getItem('token');
const navigate = useNavigate();
if (!token) {
navigate('/login');
return null;
}
return element;
}
错误处理
增强错误处理显示用户友好消息:
const [error, setError] = useState('');
try {
// API call
} catch (err) {
setError(err.response?.data?.message || 'Login failed');
}
加载状态
添加加载状态提升用户体验:
const [loading, setLoading] = useState(false);
const handleSubmit = async (e) => {
e.preventDefault();
setLoading(true);
try {
// API call
} finally {
setLoading(false);
}
};
<button type="submit" disabled={loading}>
{loading ? 'Loading...' : 'Login'}
</button>






