Skip to Content
Nextra 4.0 is released 🎉

React 学习指南

React 是一个用于构建用户界面的 JavaScript 库,由 Facebook 开发。它采用组件化思想,让前端开发更加高效和可维护。

🚀 快速开始

创建 React 项目

# 使用 Create React App npx create-react-app my-app # 使用 Vite (推荐) npm create vite@latest my-app -- --template react # 使用 Next.js npx create-next-app@latest my-app

📚 核心概念

JSX 语法

JSX 是 JavaScript 的语法扩展,允许在 JavaScript 中编写类似 HTML 的代码:

const element = ( <div className="container"> <h1>Hello, React!</h1> <p>Welcome to the world of React</p> </div> );

组件基础

React 组件分为函数组件和类组件:

// 函数组件 (推荐) function Welcome(props) { return <h1>Hello, {props.name}!</h1>; } // 类组件 class Welcome extends React.Component { render() { return <h1>Hello, {this.props.name}!</h1>; } }

⚡ React Hooks

Hooks 是 React 16.8 引入的新特性,让函数组件也能使用状态和其他 React 特性。

useState - 状态管理

import { useState } from 'react'; function Counter() { const [count, setCount] = useState(0); return ( <div> <p>Count: {count}</p> <button onClick={() => setCount(count + 1)}> Increment </button> </div> ); }

useEffect - 副作用处理

import { useEffect, useState } from 'react'; function UserProfile({ userId }) { const [user, setUser] = useState(null); useEffect(() => { // 组件挂载时获取用户数据 fetchUser(userId).then(setUser); // 清理函数 return () => { // 组件卸载时清理 }; }, [userId]); // 依赖数组 return user ? <div>{user.name}</div> : <div>Loading...</div>; }

useContext - 上下文

import { createContext, useContext } from 'react'; const ThemeContext = createContext(); function App() { return ( <ThemeContext.Provider value="dark"> <Header /> </ThemeContext.Provider> ); } function Header() { const theme = useContext(ThemeContext); return <header className={theme}>Header</header>; }

🎯 常用 Hooks

Hook用途示例
useState状态管理const [state, setState] = useState(initial)
useEffect副作用处理useEffect(() => {}, [deps])
useContext上下文消费const value = useContext(MyContext)
useReducer复杂状态逻辑const [state, dispatch] = useReducer(reducer, initial)
useMemo值记忆化const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b])
useCallback函数记忆化const memoizedCallback = useCallback(() => { doSomething(a, b); }, [a, b])

🔧 性能优化

React.memo

import { memo } from 'react'; const ExpensiveComponent = memo(function ExpensiveComponent({ data }) { // 只有当 props 改变时才重新渲染 return <div>{/* 复杂渲染逻辑 */}</div>; });

useMemo 和 useCallback

import { useMemo, useCallback } from 'react'; function ParentComponent({ items }) { // 记忆化计算结果 const expensiveValue = useMemo(() => { return items.reduce((sum, item) => sum + item.value, 0); }, [items]); // 记忆化回调函数 const handleClick = useCallback((id) => { console.log('Clicked:', id); }, []); return ( <div> <p>Total: {expensiveValue}</p> <ChildComponent onItemClick={handleClick} /> </div> ); }

📦 状态管理

Context API (内置)

import { createContext, useContext, useReducer } from 'react'; const AppContext = createContext(); const initialState = { user: null, theme: 'light' }; function appReducer(state, action) { switch (action.type) { case 'SET_USER': return { ...state, user: action.payload }; case 'SET_THEME': return { ...state, theme: action.payload }; default: return state; } } function AppProvider({ children }) { const [state, dispatch] = useReducer(appReducer, initialState); return ( <AppContext.Provider value={{ state, dispatch }}> {children} </AppContext.Provider> ); } function useApp() { const context = useContext(AppContext); if (!context) { throw new Error('useApp must be used within AppProvider'); } return context; }

第三方状态管理

  • Redux Toolkit: 官方推荐的状态管理方案
  • Zustand: 轻量级状态管理
  • Jotai: 原子化状态管理
  • Recoil: Facebook 开发的状态管理库

🛠️ 实用工具和库

路由管理

npm install react-router-dom
import { BrowserRouter, Routes, Route } from 'react-router-dom'; function App() { return ( <BrowserRouter> <Routes> <Route path="/" element={<Home />} /> <Route path="/about" element={<About />} /> <Route path="/users/:id" element={<UserProfile />} /> </Routes> </BrowserRouter> ); }

样式解决方案

  • Styled Components: CSS-in-JS
  • Emotion: 高性能 CSS-in-JS
  • Tailwind CSS: 实用优先的 CSS 框架
  • CSS Modules: 局部作用域 CSS

测试

npm install @testing-library/react @testing-library/jest-dom
import { render, screen, fireEvent } from '@testing-library/react'; import Counter from './Counter'; test('increments counter', () => { render(<Counter />); const button = screen.getByText('Increment'); const count = screen.getByText(/Count:/); fireEvent.click(button); expect(count).toHaveTextContent('Count: 1'); });

📖 学习资源

官方文档

🔍 调试工具

  • React DevTools: 浏览器扩展,用于调试 React 组件
  • Redux DevTools: Redux 状态调试
  • React Profiler: 性能分析工具

最后更新: 2024年

最近更新:12/9/2025, 2:17:55 AM