React生态系统已经发展成为一个不断增长的开发工具和库的列表。大量的工具是React流行的真正证明。对于开发者来说,要在这个以惊人的速度变化的迷宫中导航,可能是一个令人头晕目眩的工作。为了帮助你导航,下面是一份2020年React基本工具、技术和技能的清单。
钩子
- 网站:reactjs.org/docs/hooks-…
- 存储库:github.com/facebook/re…
- GitHub星级:157,000+
- 开发者。Facebook
- 当前版本: 16.14.0
- 贡献者。1,500+
虽然不是严格意义上的工具,但任何在2020年使用React的开发者都需要熟悉钩子。这些钩子是React从16.8版本开始新增的功能,它可以解锁函数组件中的有用功能。例如,useState 钩子允许一个功能组件拥有自己的状态,而useEffect 允许你在初始渲染后执行副作用--例如,操作DOM或数据获取。钩子可以用来复制功能组件中的生命周期方法,并允许你在组件之间共享代码。
以下的基本钩子是可用的。
- useState:用于在一个没有生命周期方法的功能组件中突变状态
- useEffect:用于执行渲染后的函数,对发射Ajax请求很有用。
- useContext:用于访问组件的上下文数据,甚至在组件道具之外。
优点。
- 减轻了状态管理的复杂性
- 支持功能组件
- 鼓励关注点的分离
缺点。
- 上下文数据切换会增加认知负荷
如果你想了解更多关于钩子的信息,那么请看我们的教程,"React钩子。如何开始和建立你自己的钩子"。
功能组件
- 网站:reactjs.org/docs/compon…
- 存储库:github.com/facebook/re…
- GitHub星级:157,000+
- 开发者。Facebook
- 当前版本: 16.14.0
- 贡献者。1,500+
随着钩子的出现,函数组件--一种无需使用类就能创建JSX标记的声明性方式--正变得比以往任何时候都更受欢迎。它们拥护功能范式,因为它们不在生命周期方法中管理状态。这强调了对UI标记的关注,而没有太多的逻辑。因为组件依赖于道具,它变得更容易测试。Props与渲染的输出有一对一的关系。
这就是React中的功能性组件的样子。
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
优点。
- 专注于用户界面
- 可测试的组件
- 在思考组件的时候,认知负荷较小
缺点。
- 没有生命周期方法
创建React应用程序
- 网站:create-react-app.dev
- 存储库:github.com/facebook/cr…
- GitHub星级:82,000+
- 开发者。Facebook
- 当前版本: 3.4.1
- 贡献者。800+
Create React App是启动一个新的React项目的典型工具。它通过一个npm包管理所有的React依赖项。不再需要处理Babel、webpack和其他东西。只需要一个命令就可以建立一个本地开发环境,并支持React、JSX和ES6。但这还不是全部。Create React App还提供了热模块重载(开发时你的变化会立即反映在浏览器中)、自动代码提示、测试运行器和构建脚本,以捆绑JS、CSS和图像用于生产。
这很容易上手。
npx create-react-app my-killer-app
以后升级就更容易了。整个依赖性工具链会随着react-scripts ,在package.json 。
npm i react-scripts@latest
优点是。
- 容易上手
- 容易升级
- 单一的元依赖关系
缺点。
- 没有服务器端的渲染,但可以进行整合
如果你想了解更多关于使用Create React App的信息,请参考我们的教程,"Create React App - 快速准备好React项目"。
代理服务器
- 网站:Create-react-app.dev/docs/proxyi…
- 存储库:github.com/facebook/cr…
- GitHub星级:82,000+
- 开发者。Facebook
- 当前版本: 3.4.1
- 贡献者。800+
从react-scripts@0.2.3 或更高的版本开始,可以代理API请求。这允许后端API和本地创建React App项目共存。从客户端来看,向/my-killer-api/get-data 发出请求时,会通过代理服务器进行路由。这种无缝集成在本地开发和后期构建中都能发挥作用。如果本地开发运行在端口localhost:3000 ,那么API请求会通过代理服务器。一旦你部署了静态资产,它就会通过托管这些资产的任何后端。
要在package.json 中设置一个代理服务器。
"proxy": "http://localhost/my-killer-api-base-url"
如果后端API是用相对路径托管的,则设置主页。
"homepage": "/relative-path"
优点。
- 与后端API无缝集成
- 消除了CORS问题
- 容易设置
缺点
- 可能需要一个具有多个API的服务器端代理层
种类(PropTypes
- 网站:npmjs.com/package/pro…
- 存储库:github.com/facebook/pr…
- GitHub星级: 3,600+
- 开发者。Facebook
- 当前版本: 15.7.2
- 贡献者。45+
PropTypes声明了用于React组件的类型并记录了其意图。如果类型不匹配,会在本地开发中显示一个警告。它支持所有的JavaScript原语,如Boolean,Number, 和String 。它可以通过isRequired 来记录哪些道具是必需的。
比如说。
import PropTypes;
MyComponent.propTypes = {
boolProperty: PropTypes.bool,
numberProperty: PropTypes.number,
requiredProperty: PropTypes.string.isRequired
};
Pros:
- 记录组件的意图
- 显示本地开发中的警告
- 支持所有的JavaScript原语
缺点。
- 没有编译类型检查
TypeScript
- 网站:typecriptlang.org
- 存储库:github.com/Microsoft/T…
- GitHub星级:65,000+
- 开发者。微软
- 当前版本。4.0.3
- 贡献者。530+
为React项目扩展的JavaScript,具有编译类型检查功能。它支持所有具有类型声明的React库和工具。这是一个JavaScript的超集,所以可以选择不使用类型检查器。这既记录了意图,又在不匹配的情况下导致构建失败。在Create React App项目中,在创建你的应用程序时,通过传递--template typescript 来打开它。TypeScript支持从react-script@2.1.0 版本开始。
要声明一个道具类型。
interface MyComponentProps {
boolProp?: boolean; // optional
numberProp?: number; // optional
requiredProp: string;
}
Pros:
- 编译类型检查
- 支持所有 React 工具和库,包括 Create React App
- 提高你的JavaScript技能的好方法
缺点。
- 有一个学习曲线,但也可以选择退出
如果你想了解更多关于使用TypeScript与React的信息,请查看《React与TypeScript。最佳实践"。
Redux
- 网站:redux.js.org/
- 存储库:github.com/reduxjs/red…
- GitHub星级:54,000+
- 开发人员。Dan Abramov 和 Andrew Clark
- 当前版本。4.0.5
- 贡献者。800+
用于JavaScript应用程序的可预测的状态管理容器。这个工具自带一个管理状态数据的存储空间。状态突变只能通过调度消息来实现。消息对象包含一个类型,向还原器发出信号,以启动哪种突变。建议将应用中的所有东西都放在一个存储中。Redux支持单个存储中的多个还原器。还原器在输入参数和输出状态之间有一对一的关系。这使得还原器成为纯函数。
一个典型的变异状态的还原器可能看起来像这样。
const simpleReducer = (state = {}, action) => {
switch (action.type) {
case 'SIMPLE_UPDATE_DATA':
return {...state, data: action.payload};
default:
return state;
}
};
优点是。
- 可预测的状态管理
- 在一个商店里有多个还原器
- 减速器是纯函数
缺点。
- 从头开始设置可能有点痛苦
React-Redux
- 网站:react-redux.js.org
- 存储库:github.com/reduxjs/red…
- GitHub星级:18,500+
- 开发者。Redux团队
- 当前版本:7.2.1
- 贡献者。220+
如果你想在你的React应用程序中使用Redux,你会很快发现Redux的官方React绑定。这有两个主要模块:Provider 和connect 。Provider 是一个React组件,有一个store 的道具。这个道具是一个单一的商店如何与JSX标记挂钩的。connect 函数接收两个参数。mapStateToProps,和mapDispatchToProps 。这就是Redux的状态管理与组件道具的关系。当状态发生变化,或调度发生时,绑定会负责在React中设置状态。
这就是一个连接可能的样子。
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
const mapStateToProps = (state) => state.simple;
const mapDispatchToProps = (dispatch) =>
bindActionCreators({() => ({type: 'SIMPLE_UPDATE_DATA'})}, dispatch);
connect(mapStateToProps, mapDispatchToProps)(SimpleComponent);
优点。
- Redux的官方React绑定
- 用JSX标记进行绑定
- 将组件连接到一个单一的商店
缺点。
- 学习曲线有些陡峭
还应该注意的是,随着钩子和React的Context API的引入,有可能在一些React应用中取代Redux。你可以在 "如何用React钩子和Context API替换Redux"中了解更多信息。
React Router
- 网站:reactrouter.com
- 存储库:github.com/ReactTraini…
- GitHub星级:42,000+
- 开发者。React Training
- 当前版本: 5.2.0
- 贡献者。640+
React Router是React事实上的标准路由库。当你需要在一个有多个视图的React应用程序中进行导航时,你需要一个路由器来管理URLs。React Router负责处理这个问题,使你的应用UI和URL保持同步。
该库包括三个包:react-router、react-router-dom和react-router-native。路由器的核心包是react-router ,而其他两个包是特定环境的。如果你正在构建一个网站,你应该使用react-router-dom ,如果你正在构建一个React Native应用,你应该使用react-router-native 。
最近的React Router版本引入了钩子,让你可以访问路由器的状态,并从你的组件内部执行导航,以及一个更新的路由渲染模式。
<Route path="/">
<Home />
</Route>
如果你想了解更多关于React Router的功能,请看《React Router v5:完整指南》。
优点。
- 组件之间的路由是快速的
- 可以轻松实现动画和转换
- 将组件连接到一个单一的商店
缺点。
- 如果没有额外的配置,就会为用户可能不会访问的视图下载数据
- 客户端路由(JavaScript被转换为HTML)对SEO有影响。
继续阅读SitePoint上的20个基本React工具。
