React: React 简介
React 是一个用于构建用户界面的 JavaScript 库。如果把网页比作一间房子,HTML 是砖墙结构,CSS 是装修风格,JavaScript 是水电线路,那 React 就是一套预制装配系统——让你把每个房间(组件)独立设计好,再拼装成一整栋楼。
1. 你将学到
- React 是什么、为什么需要 React
- 声明式编程 vs 命令式编程
- 虚拟 DOM 的工作原理
- React vs Vue vs Angular 的差异
- React 生态全景图
2. 一个前端开发者的真实故事
(1) 痛点:一个页面,3 万行 jQuery
Alice 在一家中型电商公司做前端开发。公司有一个后台管理页面,用 jQuery 写了 3 年,累计 30,000+ 行代码。
▶ 示例:React 简介
JAVASCRIPT
// 一个商品列表页面的典型 jQuery 代码
function updateProductList(category) {
// 手动操作 DOM
$('#product-list').empty()
$('#loading-spinner').show()
$.get('/api/products?category=' + category, function(data) {
$('#loading-spinner').hide()
data.forEach(function(product) {
// 逐条拼接 HTML 字符串
var html = '<div class="product-card">' +
'<h3>' + product.name + '</h3>' +
'<p>' + product.price + '</p>' +
'<button onclick="addToCart(' + product.id + ')">加入购物车</button>' +
'</div>'
$('#product-list').append(html)
})
})
}
这个页面的问题是:
- 状态和 DOM 不同步:购物车数量变了,页面其他 3 处数字需要手动更新
- 可维护性差:修改一个功能,可能要改 5 个文件
- 性能问题:每次更新都直接操作真实 DOM,页面频繁重排重绘
(2) React 的解法:声明式 + 组件化
用 React 重写同一个逻辑:
JSX
function ProductList({ category }) {
const [products, setProducts] = React.useState([])
const [loading, setLoading] = React.useState(true)
React.useEffect(() => {
fetch('/api/products?category=' + category)
.then(res => res.json())
.then(data => {
setProducts(data)
setLoading(false)
})
}, [category])
if (loading) return <Spinner />
return (
<div className="product-grid">
{products.map(product => (
<ProductCard key={product.id} product={product} />
))}
</div>
)
}
收益:代码量减少 70%,状态自动同步,修改一个组件不影响其他组件,性能提升 5x(虚拟 DOM 批量更新)。
3. React 的核心概念
(1) 声明式编程 vs 命令式编程
| 维度 | 命令式(jQuery) | 声明式(React) |
|---|---|---|
| 关注点 | 如何做(一步步操作 DOM) | 做什么(描述最终状态) |
| 代码风格 | 步骤式操作 | 描述式声明 |
| 状态管理 | 手动维护状态 + 手动更新 DOM | 状态自动映射到 UI |
| 调试难度 | 需要跟踪每一步 DOM 操作 | 只需要关注状态变化 |
JAVASCRIPT
// 命令式:告诉浏览器每一步怎么做
const div = document.createElement('div')
div.className = 'alert'
div.textContent = 'Hello'
document.body.appendChild(div)
// 声明式:告诉 React 你想要什么结果
function Alert({ message }) {
return <div className="alert">{message}</div>
}
// React 会自动创建和更新 DOM
(2) 虚拟 DOM
虚拟 DOM 是 React 性能优化的核心技术。它不是一个真实的 DOM 树,而是一个轻量级的 JavaScript 对象树。
graph TB
A[State 变化] --> B[生成新虚拟 DOM 树]
B --> C[Diff 对比新旧虚拟 DOM]
C --> D[计算最小更新操作集]
D --> E[批量更新真实 DOM]
E --> F[页面更新完成]
style A fill:#ff6b6b,color:#fff
style C fill:#4ecdc4,color:#fff
style E fill:#45b7d1,color:#fff
| 概念 | 真实 DOM | 虚拟 DOM |
|---|---|---|
| 本质 | 浏览器原生对象 | 普通 JavaScript 对象 |
| 创建成本 | 高(需要浏览器布局计算) | 极低(纯 JS 操作) |
| 更新方式 | 直接操作,触发重排/重绘 | diff 后批量更新 |
| 更新粒度 | 单次操作 | 批量最小化更新 |
(3) 组件化开发
React 的核心思想是把页面拆分成独立、可复用的小组件,每个组件只负责自己的职责范围。
| 概念 | 类比 | 说明 |
|---|---|---|
| 组件 (Component) | 乐高积木 | 每个组件是一个独立的功能单元 |
| Props | 积木的颜色/尺寸 | 父组件传给子组件的参数 |
| State | 积木的状态(新/旧) | 组件内部管理的数据 |
| 组件树 | 搭好的乐高模型 | 组件嵌套组合形成页面 |
JSX
// 组件化:一个页面被拆分成独立组件
function Page() {
return (
<div>
<Header /> {/* 头部导航 */}
<Sidebar /> {/* 侧边栏 */}
<MainContent /> {/* 主内容区 */}
<Footer /> {/* 底部版权 */}
</div>
)
}
4. React vs 其他主流框架
| 维度 | React | Vue | Angular |
|---|---|---|---|
| 开发者 | Meta(Facebook) | 尤雨溪(个人) | |
| 首次发布 | 2013 年 | 2014 年 | 2010 年 |
| 类型 | UI 库 | 渐进式框架 | 完整框架 |
| 模板语法 | JSX(JavaScript 内写 HTML) | HTML 模板 + 指令 | TypeScript + 装饰器 |
| 数据流 | 单向(自上而下) | 双向绑定(v-model) | 双向绑定 |
| 状态管理 | 社区方案(Redux/Zustand) | 官方 Pinia/Vuex | 官方 RxJS + 服务 |
| 学习曲线 | 中等(需理解 JSX + Hooks) | 低(模板友好) | 高(TypeScript + 依赖注入) |
| SSR 方案 | Next.js | Nuxt | Angular Universal |
| 适用场景 | 大型 SPA、移动端(React Native) | 中小型项目、快速原型 | 企业级大型应用 |
| GitHub ⭐ | 230k+ | 220k+ | 100k+ |
| 国内招聘量 | 大(一线城市较多) | 大(中小企业居多) | 中(外企/大厂) |
小结:React 适合需要高度可控、组件复用率高、跨平台(Web + 移动端) 的项目。Vue 入门更简单,适合快速迭代。Angular 适合大型企业级团队。
5. React 生态概览
React 不是一个"全家桶"框架,而是一个灵活的 UI 库。它依赖社区生态来补充路由、状态管理、构建工具等功能。
| 领域 | 核心工具 | 说明 |
|---|---|---|
| 构建工具 | Vite (推荐) / Create React App | 项目脚手架和开发服务器 |
| 路由 | React Router v6 / TanStack Router | 页面导航和 URL 管理 |
| 状态管理 | Zustand / Redux Toolkit / Context API | 全局数据管理 |
| 数据获取 | TanStack Query (React Query) / SWR | 服务端数据缓存和同步 |
| 样式方案 | Tailwind CSS / CSS Modules / styled-components | 组件样式 |
| 测试 | Vitest + React Testing Library / Playwright | 单元测试和 E2E 测试 |
| SSR/SSG | Next.js | 服务端渲染和静态生成 |
| 移动端 | React Native | 用 React 写原生移动应用 |
| 动画 | Framer Motion / React Spring | UI 动画和过渡效果 |
| 组件库 | Ant Design / MUI / Shadcn/ui | 开箱即用的 UI 组件 |
graph LR
A[React] --> B[构建: Vite]
A --> C[路由: React Router]
A --> D[状态: Zustand/Redux]
A --> E[数据: TanStack Query]
A --> F[样式: Tailwind/CSS Modules]
A --> G[测试: Vitest + RTL]
A --> H[SSR: Next.js]
A --> I[移动端: React Native]
style A fill:#61dafb,color:#000
style H fill:#000,color:#fff
style I fill:#61dafb,color:#000
6. 完整示例:用 React 构建一个简单的点赞按钮
JSX
// ============================================
// 示例:用 React 构建一个点赞按钮
// 功能:展示声明式编程 + 组件化 + 状态管理的核心概念
// ============================================
import React from 'react'
import { createRoot } from 'react-dom/client'
// 1. 定义一个点赞按钮组件
function LikeButton() {
// 使用 useState 管理点赞状态
const [liked, setLiked] = React.useState(false)
const [count, setCount] = React.useState(0)
// 处理点击事件
function handleClick() {
if (liked) {
setLiked(false)
setCount(count - 1)
} else {
setLiked(true)
setCount(count + 1)
}
}
// 声明式 UI:根据状态渲染不同外观
return (
<button
onClick={handleClick}
style={{
padding: '10px 20px',
fontSize: '16px',
backgroundColor: liked ? '#ff4757' : '#f1f2f6',
color: liked ? '#fff' : '#333',
border: 'none',
borderRadius: '5px',
cursor: 'pointer'
}}
>
{liked ? '❤️ 已点赞' : '🤍 点赞'} ({count})
</button>
)
}
// 2. 组合组件到页面
function App() {
return (
<div style={{ textAlign: 'center', padding: '50px' }}>
<h1>React 点赞示例</h1>
<p>点击按钮体验声明式 UI:只需关注状态,不用操作 DOM</p>
<LikeButton />
<LikeButton /> {/* 组件可复用!*/}
</div>
)
}
// 3. 渲染到页面
const root = createRoot(document.getElementById('root'))
root.render(<App />)
这个示例展示了什么?
- 声明式:我们只描述"点赞状态变化时按钮应该长什么样",React 自动更新 DOM
- 组件化:
LikeButton是一个独立组件,可以多次复用- 状态管理:
liked和count由 React 自动追踪,不需要手动操作 DOM
▶ 示例 2:React 组件树的可视化展示
JSX
📖 仅展示
// ============================================
// 示例:用 React 组件树展示页面结构
// 功能:模拟一个博客首页的组件树,展示组件化思维
// ============================================
// 叶子组件:文章卡片
function ArticleCard({ title, excerpt }) {
return (
<div style={{ border: '1px solid #eee', borderRadius: '8px', padding: '12px', marginBottom: '12px' }}>
<h3 style={{ margin: '0 0 8px 0' }}>{title}</h3>
<p style={{ color: '#666', margin: 0, fontSize: '14px' }}>{excerpt}</p>
</div>
)
}
// 组合组件:文章列表
function ArticleList({ articles }) {
return (
<div>
<h2>最新文章</h2>
{articles.map(article => (
<ArticleCard key={article.id} title={article.title} excerpt={article.excerpt} />
))}
</div>
)
}
// 组合组件:侧边栏
function Sidebar() {
return (
<div style={{ backgroundColor: '#fafafa', padding: '16px', borderRadius: '8px' }}>
<h3>分类</h3>
<ul style={{ listStyle: 'none', padding: 0 }}>
<li>React 教程 (12)</li>
<li>TypeScript (8)</li>
<li>Node.js (5)</li>
</ul>
</div>
)
}
// 根组件:博客首页
function BlogHome() {
const articles = [
{ id: 1, title: 'React 入门指南', excerpt: '学习 React 的核心概念和最佳实践...' },
{ id: 2, title: '理解虚拟 DOM', excerpt: '虚拟 DOM 如何提升 React 应用性能...' },
{ id: 3, title: '组件设计模式', excerpt: '掌握 React 组件的组合与复用技巧...' }
]
return (
<div style={{ maxWidth: '960px', margin: '0 auto', padding: '20px' }}>
<header style={{ textAlign: 'center', marginBottom: '24px' }}>
<h1>📝 我的技术博客</h1>
<nav>
<a href="#" style={{ margin: '0 12px' }}>首页</a>
<a href="#" style={{ margin: '0 12px' }}>关于</a>
<a href="#" style={{ margin: '0 12px' }}>联系</a>
</nav>
</header>
<div style={{ display: 'grid', gridTemplateColumns: '2fr 1fr', gap: '24px' }}>
<ArticleList articles={articles} />
<Sidebar />
</div>
<footer style={{ textAlign: 'center', marginTop: '24px', color: '#999', fontSize: '13px' }}>
<p>© 2026 web-tutorial.com</p>
</footer>
</div>
)
}
// 组件树结构:
// BlogHome
// ├── header (导航栏)
// └── div.grid
// ├── ArticleList
// │ ├── ArticleCard × 3
// └── Sidebar
// └── 分类列表
❓ 常见问题
Q React 是框架还是库?
A React 官方定位为"UI 库",不是一个完整框架。它只负责"视图层"(View),路由、状态管理、HTTP 请求等功能需要配合社区库使用。这也是 React 灵活的原因——你可以自由选择搭配的工具。
Q 学 React 需要先学什么?
A 需要 JavaScript 基础(ES6+:箭头函数、解构赋值、模块导入导出、Promise、async/await)。如果还不会 TypeScript,可以先学 JavaScript 再过渡到 TypeScript,或者直接学 TypeScript 也可以(本教程第 23 课会专门讲 React + TypeScript)。HTML 和 CSS 基础也是必要的。
Q React 18 和 React 19 选哪个?
A 本教程基于 React 18.3(当前 LTS 稳定版),在 Phase 5 会介绍 React 19 的新特性(use() Hook、Server Components、Actions 等)。生产环境建议先用 React 18,等 React 19 生态成熟后再升级。
Q 创建 React 项目用 Vite 还是 Create React App(CRA)?
A 推荐 Vite。CRA 已经基本停止维护(2023 年起不再有重大更新),Vite 启动速度(<1s vs CRA 的 10-30s)和构建速度都远优于 CRA。从第 2 课开始,我们将全程使用 Vite。
Q React 现在已经过时了吗?要不要直接学 Next.js?
A 完全不过时。React 仍然是最流行的前端库,GitHub 230k+ ⭐,npm 周下载量 4000 万+。Next.js 基于 React,不理解 React 的核心概念(组件、Hooks、状态管理)直接学 Next.js 会很吃力。建议先学 React 基础,再学 Next.js(本教程 Phase 5 会教)。
📖 小节
- React 是一个 UI 库,采用声明式编程——你描述想要的结果,React 负责更新 DOM
- 虚拟 DOM 是 React 性能的核心:通过 JS 对象树对比,批量更新真实 DOM
- 组件化 是 React 最基本的设计思想——每个组件独立、可复用、只负责自己的逻辑
- React 适合大型 SPA、跨平台开发,学习曲线中等(需要 JS 基础)
- React 生态丰富但不强制,你可以自由选择路由/状态管理/构建工具
📝 作业
- 基础题(难度⭐):打开 react.dev,找到首页的 "Learn React" 部分,浏览前 3 个教程页面,记下你认为最重要的 3 个概念。
- 思考题(难度⭐):用你自己的话解释"声明式编程"和"命令式编程"的区别,并举一个日常生活中的例子(不限于编程)。
- 对比题(难度⭐⭐):如果你想做一个博客网站,你觉得用 React 还是 Vue 更合适?列出至少 2 个理由支持你的选择。