使用脚手架工具创建 React 应用
在实际的项目开发中,我们其实不仅需要把 React 作为UI层,还可能需要路由管理、状态管理等框架。与此同时,我们还需要使用最新的 JavaScript 语言特性、CSS 的预处理框架等等。所以一般需要结合Webpack 等打包工具来使用React。
完成这些配置本身就是一个比较繁琐的步骤,因此我们通常都不会从头开始创建一个项目,而是使用脚手架工具来创建一个项目。有两个工具可以使用:一个是codesandbox.io,主要用于学习React,能够快速试验一些React的特性;另一个则是Facebook 官方提供的 create-react-app 命令行工具,用来创建一个基础的 React 项目。
首先是 Codesandbox,它是一个在线的工具,可以通过访问使用。你可以在线写代码,并实时查看运行的效果。使用起来其实也非常简单,打开主页后就可以看到如下页面:点击 Create Sandbox,就可以创建一个前端的应用。需要说明的是,它不仅支持 React,还能够创建 Angular、Vue 等前端框架的应用。
第二个 create-react-app 则是开发时会使用的基本工具。它会提供一个完善的 Webpack 配置,让我们能够立刻开始使用 React、JavaScript 语言的最新特性和 CSS Module 等主流的技术方案。
创建的项目结构非常简单:
- public
- src
- App.css
- App.js
- index.js
- index.css
- package.json
这里的 src/index.js 是程序的入口,App.js 则是整个应用程序的根组件,主要做一些配置的事情。create-react-app 创建的项目作为一个基本的模板,为我们提供的便利主要是配置好开发环境、Webpack 等等,但是它不包含 Redux 或者 Router 等非必须的功能。
实战:在组件中发送请求并显示数据
设想这样一个场景:页面上有一个按钮,点击后,我们可以发起一个请求获取一个用户列表,并要求显示在页面上。在这个过程中,我们需要考虑数据状态,Loading 的状态,以及请求出错的处理。那么可以用下面的代码实现:
import React from "react";
export default function UserList() {
// 使用三个 state 分别保存用户列表,loading 状态和错误状态
const [users, setUsers] = React.useState([]);
const [loading, setLoading] = React.useState(false);
const [error, setError] = React.useState(null);
// 定义获取用户的回调函数
const fetchUsers = async () => {
setLoading(true);
try {
const res = await fetch("https://reqres.in/api/users/");
const json = await res.json();
// 请求成功后将用户数据放入 state
setUsers(json.data);
} catch (err) {
// 请求失败将错误状态放入 state
setError(err);
}
setLoading(false);
};
return (
<div className="user-list">
<button onClick={fetchUsers} disabled={loading}>
{loading ? "Loading..." : "Show Users"}
</button>
{error &&
<div style={{ color: "red" }}>Failed: {String(error)}</div>
}
<br />
<ul>
{users.length > 0 &&
users.map((user) => {
return <li key={user.id}>{user.first_name}</li>;
})}
</ul>
</div>
);
}
当点击 Show Users 按钮时,会显示 Loading 的文本,并将 button 设为 disabled。请求成功后,则显示获取的用户列表。如果请求失败,则显示一段错误信息的文本。
在 React 组件中,任何一个 state 发生变化时,整个函数组件其实是被完全执行一遍的,而且除了 state,多次的执行之间没有任何关系。所以在考虑这样一个场景的实现时,我们要首先考虑这个组件有哪些状态(state),这些状态的变化是由什么触发的,从而将整个功能串联起来。
React 本身其实是一个上手非常简单的 UI 框架,不过也正是因为 React 本身的这种纯粹和简单,让它的整个生态圈变得非常繁荣。针对每一个具体的问题,可能都存在特定的解决方案。所以在实际使用中,我们需要根据具体的需求,来寻求最合适的方案。