1. React 技术定位与核心价值
React 是由 Meta(前 Facebook)维护的用于构建用户界面的 JavaScript 库。它并非一个完整的 MVC 框架,而是专注于 View 层(视图层)的解决方案。
核心特性
- 声明式编程 (Declarative) :开发者仅需描述 UI 在不同状态下的表现,React 负责处理状态变化时的 DOM 更新。这不仅降低了代码复杂度,也使得代码更易于调试。
- 组件化架构 (Component-Based) :将 UI 拆分为独立、可复用的组件。组件内部维护自身状态(State),通过组合构建复杂的应用界面。
- 虚拟 DOM (Virtual DOM) :React 在内存中维护一棵虚拟 DOM 树。当数据变化时,通过 Diff 算法(Reconciliation 协调过程)计算出最小变更集,批量更新真实 DOM,从而保证性能。
- 单向数据流:数据通过 Props 自上而下流动,保证了应用状态的可预测性。
应用场景
- 单页面应用(SPA :React非常适合构建复杂的单页面应用,提供流畅的用户体验。
- 移动应用:通过React Native,可以使用React开发iOS和Android应用。
- 服务器渲染应用:结合Next.js等框架,可以实现服务器端渲染(SSR),提高首屏加载速度。
- 大型企业级应用:React的组件化和声明式编程使得大型应用的开发和维护更加高效。
优势
- 高性能:虚拟 DOM 和 Diff 算法减少了不必要的 DOM 操作,提高了应用性能。
- 可维护性:组件化开发使得代码结构清晰,易于维护和扩展。
- 生态系统:React 拥有丰富的生态系统和社区支持,提供了大量的工具和库。
2. 环境准备与工程化构建
在现代前端开发中,手动配置 Webpack 较为繁琐,推荐使用官方或社区主流的脚手架工具。
前置条件
确保本地环境已安装 Node.js (LTS 版本) 及 npm。
codeBash
node -v # 建议 v16+
npm -v
项目初始化方案
方案 A:Vite (现代推荐)
Vite 基于原生 ES Modules,在开发环境下实现了秒级冷启动和热更新(HMR),构建速度远超传统的 Webpack 方案。
codeBash
# 创建项目
npm create vite@latest my-react-app -- --template react
# 安装依赖并启动
cd my-react-app
npm install
npm run dev
方案 B:Create React App (CRA)
官方提供的经典脚手架,基于 Webpack,配置零散但开箱即用。适合教程学习,但在大型项目中构建速度较慢。
codeBash
npx create-react-app my-app
cd my-app
npm start
3. JSX:JavaScript 的语法扩展
JSX (JavaScript XML) 是 React 的核心语法糖,允许在 JS 中直接编写类 HTML 结构。JSX 最终会被编译器(如 Babel)转换为 React.createElement() 调用。
核心语法规则
- 单一根节点:组件必须返回一个根元素,或使用 Fragment (<>...</>) 包裹。
- 表达式插值:使用 {} 包裹 JavaScript 表达式(变量、函数调用、逻辑运算)。
- 属性命名:采用驼峰命名法(CamelCase),例如 className 代替 class,htmlFor 代替 for。
渲染模式示例
Jsx
const UserList = ({ users, isLoggedIn }) => {
// 1. 条件渲染:三元运算符与逻辑与
if (!isLoggedIn) return <div>请先登录</div>;
return (
<div className="user-container">
<h3>用户列表</h3>
<ul>
{/* 2. 列表渲染:Map 映射 */}
{users.map(user => (
// Key 属性对于 Diff 算法至关重要,必须保持唯一且稳定
<li key={user.id}>
{user.name}
{user.isAdmin && <span className="badge">管理员</span>}
</li>
))}
</ul>
</div>
);
};
4. 组件范式:函数组件与类组件
React 组件经历了从“类组件”到“函数组件 + Hooks”的演进。
4.1 函数组件 (Modern Pattern)
自 React 16.8 引入 Hooks 以来,函数组件已成为主流。它本质上是一个纯函数,接收 Props 并返回 JSX。
- 特点:无 this 上下文,代码简洁,逻辑复用性强。
- 状态管理:使用 useState、useEffect 等 Hook 管理状态和副作用。
Jsx
import { useState } from 'react';
const Counter = () => {
const [count, setCount] = useState(0);
return (
<button onClick={() => setCount(count + 1)}>
Count: {count}
</button>
);
};
4.2 类组件 (Legacy Pattern)
基于 ES6 Class 实现,继承自 React.Component。理解类组件对于维护旧项目及深入理解 React 生命周期原理至关重要。
Jsx
import React, { Component } from 'react';
class CounterClass extends Component {
constructor(props) {
super(props);
this.state = { count: 0 };
}
// 挂载阶段:组件插入 DOM 后调用
componentDidMount() {
console.log('Mounted');
}
// 更新阶段:Props 或 State 改变后调用
componentDidUpdate(prevProps, prevState) {
if (prevState.count !== this.state.count) {
console.log('Updated');
}
}
// 卸载阶段:组件从 DOM 移除前调用
componentWillUnmount() {
console.log('Unmounted'); // 清理定时器、取消订阅等
}
render() {
return (
<div onClick={() => this.setState({ count: this.state.count + 1 })}>
{this.state.count}
</div>
);
}
}
4.3 生命周期与 Hooks 对照表
| 类组件生命周期 | 函数组件 Hooks 等效实现 | 作用 |
|---|---|---|
| componentDidMount | useEffect(fn, []) | 初始化请求、订阅事件 |
| componentDidUpdate | useEffect(fn, [dep]) | 响应状态变化 |
| componentWillUnmount | useEffect(() => cleanupFn, []) | 清理资源(如清除定时器) |
5. 总结
React 通过声明式 UI 和虚拟 DOM 机制重塑了前端开发流程。对于初学者,建议遵循以下学习路径:
- 掌握 JSX 语法与 JavaScript 基础(尤其是数组方法、解构赋值、ES Modules)。
- 优先学习函数组件与 Hooks (useState, useEffect),这是目前的行业标准。
- 理解类组件的生命周期,作为底层原理的补充知识。
- 熟悉工程化工具,推荐使用 Vite 替代 Create React App 进行项目构建。