React: React 简介

React 是一个用于构建用户界面的 JavaScript 库。如果把网页比作一间房子,HTML 是砖墙结构,CSS 是装修风格,JavaScript 是水电线路,那 React 就是一套预制装配系统——让你把每个房间(组件)独立设计好,再拼装成一整栋楼。


1. 你将学到



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)
    })
  })
}

这个页面的问题是:

(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 对象树。

100%
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) 尤雨溪(个人) Google
首次发布 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 组件
100%
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 是一个独立组件,可以多次复用
  • 状态管理likedcount 由 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
//         └── 分类列表
逻辑代码 56 行(超过 40 行限制,仅展示)

❓ 常见问题

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 会教)。

📖 小节


📝 作业

  1. 基础题(难度⭐):打开 react.dev,找到首页的 "Learn React" 部分,浏览前 3 个教程页面,记下你认为最重要的 3 个概念。
  2. 思考题(难度⭐):用你自己的话解释"声明式编程"和"命令式编程"的区别,并举一个日常生活中的例子(不限于编程)。
  3. 对比题(难度⭐⭐):如果你想做一个博客网站,你觉得用 React 还是 Vue 更合适?列出至少 2 个理由支持你的选择。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏