React项目开发详解
本课程将深入讲解React实战项目的完整开发流程,从项目初始化到部署上线的全过程。通过学习本课程,你将掌握如何构建一个结构合理、性能优化、可维护性强的React应用,为你的React开发生涯打下坚实的基础。
// 组件设计示例
import React, { useState, useEffect } from 'react';
import { fetchPosts } from '../services/api';
import PostCard from './PostCard';
import LoadingSpinner from './LoadingSpinner';
import ErrorMessage from './ErrorMessage';
// 容器组件 - 负责数据获取和状态管理
function PostList() {
const [posts, setPosts] = useState([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
const [page, setPage] = useState(1);
useEffect(() => {
const loadPosts = async () => {
setLoading(true);
try {
const data = await fetchPosts(page);
setPosts(prev => page === 1 ? data : [...prev, ...data]);
} catch (err) {
setError('获取帖子失败');
} finally {
setLoading(false);
}
};
loadPosts();
}, [page]);
return (
帖子列表
{error && }
{posts.map(post => (
))}
{loading && }
第 {page} 页
);
}
// 展示组件 - 负责UI渲染
function PostCard({ post }) {
return (
{post.title}
{post.body}
作者: {post.author}
日期: {post.date}
);
}
export { PostList, PostCard };
// 状态管理示例
// 1. 使用Context API进行状态管理
import React, { createContext, useContext, useState, useReducer, useCallback } from 'react';
// 创建Context
const AuthContext = createContext();
// 初始状态
const initialState = {
user: null,
token: localStorage.getItem('token'),
isLoading: false,
error: null,
};
// Reducer函数
function authReducer(state, action) {
switch (action.type) {
case 'LOGIN_REQUEST':
return { ...state, isLoading: true, error: null };
case 'LOGIN_SUCCESS':
return {
...state,
isLoading: false,
user: action.payload.user,
token: action.payload.token
};
case 'LOGIN_FAILURE':
return { ...state, isLoading: false, error: action.payload };
case 'LOGOUT':
return { ...state, user: null, token: null };
default:
return state;
}
}
// Provider组件
export function AuthProvider({ children }) {
const [state, dispatch] = useReducer(authReducer, initialState);
// 登录函数
const login = useCallback(async (email, password) => {
dispatch({ type: 'LOGIN_REQUEST' });
try {
const response = await fetch('https://api.example.com/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ email, password }),
});
if (!response.ok) {
throw new Error('登录失败');
}
const data = await response.json();
localStorage.setItem('token', data.token);
dispatch({ type: 'LOGIN_SUCCESS', payload: data });
} catch (error) {
dispatch({ type: 'LOGIN_FAILURE', payload: error.message });
}
}, []);
// 登出函数
const logout = useCallback(() => {
localStorage.removeItem('token');
dispatch({ type: 'LOGOUT' });
}, []);
const value = {
...state,
login,
logout,
};
return (
{children}
);
}
// 自定义Hook
export function useAuth() {
const context = useContext(AuthContext);
if (!context) {
throw new Error('useAuth must be used within an AuthProvider');
}
return context;
}
// 使用示例
function ProtectedRoute({ children }) {
const { token, isLoading } = useAuth();
if (isLoading) {
return 加载中...;
}
if (!token) {
return ;
}
return children;
}
export default ProtectedRoute;
// 路由配置示例
import React from 'react';
import { BrowserRouter as Router, Routes, Route, Navigate } from 'react-router-dom';
import { AuthProvider, useAuth } from './context/AuthContext';
import HomePage from './pages/HomePage';
import LoginPage from './pages/LoginPage';
import RegisterPage from './pages/RegisterPage';
import DashboardPage from './pages/DashboardPage';
import PostDetailPage from './pages/PostDetailPage';
import NotFoundPage from './pages/NotFoundPage';
import Layout from './components/Layout';
import ProtectedRoute from './components/ProtectedRoute';
// 根路由配置
function AppRoutes() {
return (
}>
} />
} />
} />
}
/>
} />
} />
);
}
// 布局组件
function Layout() {
const { user, logout } = useAuth();
return (
);
}
export default AppRoutes;
// 表单处理示例
import React, { useState } from 'react';
function LoginForm() {
const [formData, setFormData] = useState({
email: '',
password: '',
});
const [errors, setErrors] = useState({});
const [isSubmitting, setIsSubmitting] = useState(false);
// 处理输入变化
const handleChange = (e) => {
const { name, value } = e.target;
setFormData(prev => ({
...prev,
[name]: value,
}));
// 清除对应字段的错误
if (errors[name]) {
setErrors(prev => {
const newErrors = { ...prev };
delete newErrors[name];
return newErrors;
});
}
};
// 表单验证
const validateForm = () => {
const newErrors = {};
if (!formData.email) {
newErrors.email = '邮箱不能为空';
} else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(formData.email)) {
newErrors.email = '请输入有效的邮箱地址';
}
if (!formData.password) {
newErrors.password = '密码不能为空';
} else if (formData.password.length < 6) {
newErrors.password = '密码长度不能少于6位';
}
return newErrors;
};
// 处理表单提交
const handleSubmit = async (e) => {
e.preventDefault();
const validationErrors = validateForm();
if (Object.keys(validationErrors).length > 0) {
setErrors(validationErrors);
return;
}
setIsSubmitting(true);
try {
// 模拟API调用
await new Promise(resolve => setTimeout(resolve, 1000));
console.log('登录成功:', formData);
// 这里可以调用登录API
} catch (error) {
console.error('登录失败:', error);
} finally {
setIsSubmitting(false);
}
};
return (
);
}
export default LoginForm;
// CI/CD配置示例 (GitHub Actions)
name: Deploy React App
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
- name: Build
run: npm run build
- name: Deploy to Vercel
uses: amondnet/vercel-action@v20
with:
vercel-token: ${{ secrets.VERCEL_TOKEN }}
vercel-org-id: ${{ secrets.VERCEL_ORG_ID }}
vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }}
working-directory: ./
vercel-args: '--prod'
创建一个React项目,实现以下功能:
构建一个完整的博客应用,包括:
开发一个电商应用,实现:
将你的应用部署到以下平台之一:
| 阶段 | 任务 | 工具/技术 |
|---|---|---|
| 初始化 | 项目创建与配置 | Vite, Create React App, npm/yarn |
| 设计 | 架构设计与组件规划 | Figma, Adobe XD |
| 开发 | 组件开发与功能实现 | React, Hooks, Context API |
| 测试 | 单元测试与集成测试 | Jest, React Testing Library |
| 优化 | 性能优化与代码质量 | React DevTools, Lighthouse |
| 部署 | 构建与上线 | Vercel, Netlify, CI/CD |
| 维护 | 监控与更新 | Error tracking, Analytics |
通过本课程学习,你应该掌握了React实战项目的完整开发流程:
React项目开发是一个综合性的过程,需要不断学习和实践。记住,好的代码不仅仅是能工作的代码,更是可维护、可扩展、性能良好的代码。继续深入学习和实践,你将成为一名优秀的React开发者。