本文翻译自:blog.bitsrc.io/how-to-writ…javascript
9个有用的小技巧帮助您在React中编写更好的代码:使用Linting,propTypes,PureComponent等。java
React使得建立交互式UI变得垂手可得。为应用程序中的每一个状态设计简单的视图,当数据发生变化时,React将有效地更新和呈现正确的组件。react
在这篇文章中,我将向您展现一些有助于您成为更好的React Developer的技巧。git
我将介绍从工具到实际代码风格的一系列内容,它能够帮助您提升React的技能。github
对于编写更好的代码而言,一件很是重要的事情就是良好的linting。npm
由于若是咱们设置了一套良好的linting规则,你的代码编辑器将可以捕获任何可能致使代码出现问题的内容。数组
并且不只仅是捕捉问题,您的ES Lint设置将不断让您了解React最佳实践。浏览器
import react from 'react';
/* Other imports */
/* Code */
export default class App extends React.Component {
render() {
const {userIsLoaded, user} = this.props;
if (!userIsLoaded) return <Loader />; return ( /* Code */ ) } } 复制代码
就拿上面的代码片断来讲,假设您要在render()
函数中引用一个名为this.props.hello
的新属性。你的 linter 会当即变红并提示:bash
'hello' is missing in props validation (react/prop-types)
复制代码
Linting将帮助您了解React中的最佳实践并修正您对代码的理解。很快,您将在编写代码时避免犯错。编辑器
您可使用ESLint来为JavaScript设置一个linting工具,也可使用Airbnb的JavaScript样式指南。您还能够安装React ESLint包。
在前面的部分中,我谈到了当我尝试传递未经验证的prop
时个人linter是如何起做用的。
static propTypes = {
userIsLoaded: PropTypes.boolean.isRequired,
user: PropTypes.shape({
_id: PropTypes.string,
)}.isRequired,
}
复制代码
在这里,若是咱们不须要userIsLoaded
,那么咱们须要将如下代码添加到咱们的代码中:
static defaultProps = {
userIsLoaded: false,
}
复制代码
所以,只要是在组件中使用的PropType
,咱们就须要为它设置一个propType
。就如在上述示例中,咱们须要告诉 React,userIsLoaded
老是一个布尔值。
再次,若是咱们不传userIsLoaded
这个参数,那么咱们将须要一个默认的Prop
。若是咱们传userIsLoaded
,那么咱们没必要为它定义默认Prop
。可是,该规则还规定您不该该有像object
或array
这样的模糊propType
。
这就是为何咱们使用shape
来验证user
,其中包含另外一个id
,它的propType
为string
,而且整个user
对象是必传的参数。
确保在每一个使用prop
的组件上设置propTypes
和defaultProps
将会有很长的路要走。
那些prop
没有获得他们指望的数据的那一刻,你的错误日志会让你知道你要么传递了错误的东西,要么没有传递必需要传的prop
,这使得错误更容易被定位,特别是若是你是编写了大量可重用的组件。propTypes
和defaultProps
还使这些组件更加self-documenting。
与早期版本的React不一样(译者注:react V15.5之前内置proptypes
),React 中再也不内置proptypes
,您必须将它们做为依赖项单独添加到项目中。 点击prop-types的npm文档了解更多。
export default class Profile extends PureComponent {
static propTypes = {
userIsLoaded: PropTypes.bool,
user: PropTypes.shape({
_id: PropTypes.string,
}).isRequired,
}
static defaultProps = {
userIsLoaded: false,
}
render() {
const { userIsLoaded, user } = this.props;
if (!userIsLoaded) return <Loaded />;
return (
<div>
<div className="two-col">
<section>
<MyOrders userId={user.id} />
<My Downloads userId={user._id} />
</section>
<aside>
<MySubscriptions user={user} />
<MyVotes user={user} />
</aside>
</div>
<div className="one-col">
{isRole('affiliate', user={user._id} &&
<MyAffiliateInfo userId={user._id} />
}
</div>
</div>
)
}
}
复制代码
在上面代码中我有一个名为Profile
的组件。在此组件中有其余组件,如MyOrder
和MyDownloads
。如今我能够在这里内联编写全部这些组件,由于我只是从同一个地方(user
)提取数据,将全部这些较小的组件转换为一个巨大的组件。
虽然没有关于什么时候将代码移动到组件中的任何硬性规定,但你须要问问你本身: * 您的代码功能是否变得笨拙? * 它只表示了本身的东西吗? * 你的代码须要被复用吗?
若是这些问题的答案中的任何一个是确定的,那么您须要将代码移动到组件中。
请记住,没有人但愿在您的代码中看到一个巨大的200-300行的组件。
对于React开发人员来讲,知道什么时候在代码中使用Component
,PureComponent
和无状态函数组件是很是重要的。
您可能已经注意到在上面的代码片断中,我没有将Profile
声明为Component
,而是将其称为PureComponent
。
首先,让咱们来了解一下无状态函数组件。
const Billboard = () => (
<ZoneBlack>
<Heading>React</Heading>
<div className="billboard_product">
<Link className="billboard_product-image" to="/">
<img alt="#" src="#">
</Link>
<div className="billboard_product-details">
<h3 className="sub">React</h3>
<p>Lorem Ipsum</p>
</div>
</div>
</ZoneBlack>
);
复制代码
无状态函数组件是您的武器库中最多见的组件类型之一。 它们为咱们提供了一种简洁明了的方法来建立一个不使用任何state
、refs
和生命周期方法的组件。
无状态函数组件的思想是它是没有state
的,只是一个函数。 因此最重要的是你将组件定义为一个返回一些数据的常量函数。
简而言之,无状态函数组件仅仅是一个返回JSX的函数。
一般,当组件得到新的 prop 时,React 将从新渲染该组件。 但有时候,一个组件得到一些还没有真正改变的新 prop,但 React 仍会触发从新渲染。
使用 PureComponent 将帮助您防止这种没必要要的从新渲染。若是prop是字符串或布尔值,当它发生变化时,PureComponent 将识别出这一点。可是若是是对象中的属性发生变化,PureComponent将不会触发从新渲染。
那么你怎么知道React什么时候触发没必要要的从新渲染? 你能够查看这个使人惊喜的React包,叫作Why You You Update。 当发生可能没必要要的从新渲染时,此包将在控制台中通知您。
一旦识别出没必要要的从新渲染,就可使用 PureComponent 而不是 Component 来防止没必要要的从新渲染。
Bit是一个很棒的工具,能够将 UI 组件转换为可在不一样应用程序中共享,开发和同步的构建块。
您能够利用 Bit 在共享集合中组织团队的组件,使其被团队成员共享,利用她的实时playground,单独测试等特性来让您共享的组件更好用。
经过隔离和共享组件,您能够加快应用程序的开发速度和团队的速度,同时减小重复的代码。它是OSS,OSS是免费的,因此请随意尝试一下。
若是您真的想成为专业的React Developer,那么您应该已经常常在开发过程当中使用React Dev Tools。
若是您使用过React,那么您可能很须要React Dev Tools。
React Dev Tools适用于全部主流浏览器,例如Chrome和Firefox。
经过React Dev Tools,您能够访问React应用程序的整个结构,并容许您查看应用程序中使用的全部 state 和 props。
React Dev Tools是探索React组件并帮助诊断应用程序中任何问题的绝佳方式。
这个 tip 可能会引发一些争议,但我发现使用内联条件语句可让个人React代码清爽不少。
看看这段代码:
<div className="one-col">
{isRole('affiliate', user._id) &&
<MyAffiliateInfo userId={user._id} />
}
</div>
复制代码
上面代码中,isRole
是一个基本函数,用于检查一我的是不是“affiliate”,而后还有一个名为<MyAffiliateInfo />
的组件。
这样写有什么好处:
编写内联条件语句很是简单。首先编写条件语句,若是条件语句的结果是true
,组件将渲染<MyAffiliateInfo />
组件。
接下来,咱们使用&&
将此条件语句与<MyAffiliateInfo />
连接。 这样,只有在条件语句返回true
时才会呈现该组件。
打开代码编辑器(我使用 VS Code),并建立一个.js文件。键入rc
时,在此文件中,您将看到以下内容:
点击enter
键,你会当即获得这个:
这些代码片断的优势在于它们不只能够潜在地帮助您规避 bug,还能够帮助您识别最新和最好的语法。
您能够在代码编辑器中安装许多不一样的代码片断。我用于VS Code的那个叫作ES7 React / Redux / React-Native / JS Snippets。
React Internals 分五部分讲解了React的基础知识,并最终帮助我成为一个更好的React Developer!
若是您遇到可能没法彻底理解的问题,或者您想要了解React的工做原理,那么React Internals将帮助您了解什么时候以及如何在React中作正确的事情。
这对那些有想法但又不知道在哪里执行代码的人特别有用。了解React如何工做的基础知识将帮助您成为更好的React开发人员。