React 入门实践:从安装到第一个应用
开篇:为什么会写这篇教程?

两年前,我在公司接手了一个项目,目标是重构一个旧的管理后台。当时前端是 jQuery 的一套老架构,代码结构混乱,维护成本高。我们团队决定采用 React 来进行重构,希望借此提升开发效率、降低 bug 率并实现更好的模块化开发。
说实话,我那时候对 React 了解得并不多,之前主要用 Vue,对 React 的生态、工作流和核心思想都不太熟悉。于是,我开始一边学一边做,在真实项目中边踩坑边成长。这篇文章就是基于那段经历写的,希望通过一个小而完整的案例,带你一步步走进 React 的世界。
文章不会只是贴几段代码或者讲讲语法,而是会结合我们在开发中的实际遇到的问题、踩过的坑,以及最终取得的效果来分享。如果你是一个想入门 React 的开发者,我相信你能从中获得不少实用的经验。
问题描述:我们的项目需求和挑战

我们要做的这个后台系统叫做“订单管理系统”。原本是一个老旧的 PHP+jQuery 的前后端混合项目,页面跳转频繁,用户体验差,数据处理逻辑也分散在各个地方,非常难维护。
所以这次重构的主要目标是:
- 前端完全使用 React 框架,后端只提供 RESTful API;
- 使用单页应用(SPA)模式,减少页面刷新;
- 实现基本的订单列表展示、筛选、查看详情等基础功能;
- 在有限时间内完成,并保证可扩展性。
听起来挺简单,但对我们这些刚接触 React 不久的人来说,其实挑战不小:
- 如何快速搭建一个 React 项目?
- 路由怎么配置?状态如何管理?
- 怎么让组件之间共享数据?
- 第一次写 React 组件时,感觉有点不知所措……
尤其是当我们把页面拆分成多个组件后,父子组件之间的通信、状态同步一下子变得复杂了起来。
解决方案:为什么选择 React?
React 是 Facebook 推出的前端库,它有几个特别吸引人的点:
- 声明式编程:比起命令式的操作 DOM,React 更像是告诉你“你想看到什么”,而不是“你怎么去改变”。
- 组件化结构:UI 可以像搭积木一样复用,方便维护和扩展。
- 虚拟 DOM 机制:提升性能,避免不必要的重绘。
- 庞大的生态系统:社区活跃,有无数优秀的第三方库可以节省开发时间。
这些特性对于构建复杂的管理后台来说是非常契合的。而且 React 学习曲线相对平缓,上手快,适合我们这种时间紧任务重的情况。
代码实践:搭建第一个 React 应用
为了帮助你更快上手,我会从零开始搭建一个 React 应用。下面是我们项目的起点 —— 搭建环境、创建目录、编写第一个组件。
第一步:环境准备
首先确保你已经安装了 Node.js 和 npm,可以通过以下命令检查:
node -v
npm -v
接下来,我们使用官方提供的 create-react-app 快速创建一个 React 项目:
npx create-react-app react-order-dashboard
cd react-order-dashboard
npm start
这个脚本会自动下载依赖并启动本地服务器,打开浏览器访问 http://localhost:3000,你会看到默认的欢迎页面。
小插曲:第一次运行时,我的电脑卡住了几分钟,以为出了问题。后来才发现是因为首次创建需要下载大量依赖包,特别是网络不好的时候更容易卡住。建议大家先换一个较快的 npm 镜像源,比如用
yarn或者淘宝镜像:npm install -g yarn yarn config set registry https://registry.npmmirror.com
第二步:项目结构分析
进入 react-order-dashboard 目录后,你会看到如下结构:
react-order-dashboard/
├── node_modules/
├── public/
│ ├── index.html
├── src/
│ ├── App.css
│ ├── App.js
│ ├── App.test.js
│ ├── index.css
│ ├── index.js
│ └── logo.svg
├── package.json
└── README.md
其中,src/index.js 是入口文件,App.js 是主组件。React 项目其实就是由一个个组件组成。
第三步:编写第一个组件 —— 订单列表页
我们将创建一个简单的订单列表组件,展示一些模拟数据。
创建组件文件
在 src/ 下新建一个目录 components,并在里面创建 OrderList.js 文件:
// src/components/OrderList.js
import React from 'react';
const OrderList = () => {
const orders = [
{ id: 1, customer: '张三', amount: 300 },
{ id: 2, customer: '李四', amount: 800 },
{ id: 3, customer: '王五', amount: 500 },
];
return (
<div>
<h2>订单列表</h2>
<table border="1" cellPadding="10">
<thead>
<tr>
<th>ID</th>
<th>客户名称</th>
<th>金额</th>
</tr>
</thead>
<tbody>
{orders.map(order => (
<tr key={order.id}>
<td>{order.id}</td>
<td>{order.customer}</td>
<td>{order.amount}元</td>
</tr>
))}
</tbody>
</table>
</div>
);
};
export default OrderList;
然后在 App.js 中引入并使用它:
// src/App.js
import React from 'react';
import './App.css';
import OrderList from './components/OrderList';
function App() {
return (
<div className="App">
<OrderList />
</div>
);
}
export default App;
现在重启服务或保存文件后,你应该就能看到渲染出来的订单表格。
踩坑经验:React 初学者容易遇到的那些事
尽管 create-react-app 把很多工具链都封装好了,但在刚开始学习的时候还是免不了踩坑。这里分享几个我在项目初期遇到的真实问题和解决方式。
问题一:渲染列表时报错 Key 缺失
上面的例子中我们在 map() 渲染每一行时加了 key={order.id},这是 React 对于列表元素的要求。如果不加 key 或者用了随机值,控制台会出现警告,甚至影响性能。
建议:给列表中的每个元素一个唯一且稳定的 key,通常是数据本身的 ID,不要随便用索引 index,否则在更新、排序时容易出问题。
问题二:组件间通信不知道怎么做
一开始我对 props 这个概念理解不够深入,经常出现组件传参失败的情况。比如父组件传了个函数给子组件,子组件调用之后,父组件的状态没更新。
后来才明白,一定要保持数据单向流动,状态尽量放在父组件里管理,必要时再通过回调函数传递下去。
举个例子,如果我们想点击某一行订单显示详情信息,可以在父组件维护一个 selectedId:
function App() {
const [selectedId, setSelectedId] = useState(null);
return (
<div>
<OrderList onSelect={(id) => setSelectedId(id)} />
<OrderDetail orderId={selectedId} />
</div>
);
}
这样数据流向就清晰了。
问题三:样式冲突和全局污染
虽然我们可以直接在 .css 文件中写样式,但如果多个组件共用某个类名,很容易发生样式覆盖的问题。
解决方案之一是使用 CSS Modules,它会把类名编译成唯一的标识符。比如我们创建 OrderList.module.css 文件:
.tableWrapper {
margin: 20px;
}
然后在组件中引入:
import styles from './OrderList.module.css';
// 使用时
<div className={styles.tableWrapper}>...</div>
这样每个类名都是局部的,避免了样式冲突。
当然,我们也可以考虑用一些 UI 库比如 Ant Design 来简化组件样式开发,后面我也会提到。
效果总结:改造后的收获
经过一个月的努力,我们成功将原有的后台改造成 React 架构。效果非常明显:
- 开发效率提高:组件复用率很高,新增功能更快;
- 代码结构更清晰:组件划分合理,逻辑分离明确;
- 状态管理更有条理:配合 Redux 工具,全局数据管理不再混乱;
- 用户体验更好:界面加载流畅,响应迅速。
另外,后续我们又接入了 React Router 来处理路由跳转,Axios 用于网络请求,Ant Design 提升 UI 表现力……整个系统逐渐完善起来。
经验分享:给初学者的一些建议
如果你正在学习 React,我有几点亲身经验想分享给你:
1. 不要一开始就追求高大上的技术栈
很多人刚上手就想着要用 Redux、MobX、React Query、SWR、TypeScript、微前端、Next.js 等等。结果还没搞懂组件怎么写就开始研究工具链,反而适得其反。
✅ 推荐路线:
- 先学会函数组件 + hooks(useState, useEffect)
- 理解 props 与父子组件通信
- 知道生命周期对应到 hooks 的写法
- 掌握条件渲染、列表渲染、表单绑定等基础操作
- 了解受控组件 vs 非受控组件的区别
- 再进阶学习路由、状态管理、性能优化等内容
2. 多写小例子,别光看文档
很多时候你看完一遍文档,好像都懂了,但一上手就卡壳。这时候不如自己写个小 demo,动手敲一遍印象更深。
比如你可以尝试写一个 Todo List、一个搜索框带过滤、一个数字计数器等。这些都是练习 state 和 props 的好素材。
3. 合理使用调试工具
Chrome 浏览器装一个 React Developer Tools,能帮你直接查看组件树、props 和 state。
同时,用 console.log() 打印是个不错的方法,特别是在 hooks 中调试副作用和依赖项的变化。
4. 关注用户体验和性能优化
有时候我们会专注于功能实现,忽略了用户的感知。例如,渲染数据量大的时候要不要分页?加载数据时有没有 loading 提示?这些细节往往会影响整体的用户体验。
此外,React 提供了很多优化手段,比如:
- 使用
React.memo()避免不必要的组件重新渲染; - 对大数据列表使用虚拟滚动(如 react-window);
- 合理使用懒加载(React.lazy + Suspense);
- 配置 Webpack 分包优化首屏加载速度。
这些都是在实战中会逐步接触到的内容。
5. 不怕犯错,持续迭代
我到现在还在不断学习新的 React 特性和最佳实践。有时候你以为掌握了,换个业务场景又会发现新问题。
记住一句话:没有完美的代码,只有不断演进的架构。
结语:从零开始,也能做出漂亮的 React 应用

这篇文章记录了我从 Vue 转 React 的过程,也是我们团队完成第一个 React 项目的心路历程。通过真实的项目背景、具体的技术实现和踩坑经验,我希望能让你少走弯路,快速上手 React。
不管你是刚开始学习前端,还是想转型使用 React 做全栈开发,都可以从这篇文章起步。只要你坚持多写、多练、多思考,很快就能写出属于自己的 React 应用。
最后送大家一句话共勉:
“不是因为看见才相信,而是因为相信才看得见。”
React 的世界很精彩,愿你在学习的路上越走越远!
📌 如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、转发,也欢迎留言交流 React 学习路上的困惑。

评论 0