我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何写出漂亮的React组件

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何写出漂亮的React组件

如何写出漂亮的React组件,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。


在Walmart Labs的产品开发中,我们进行了大量的Code  Review工作,这也保证了我有机会从很多优秀的工程师的代码中学习他们的代码风格与样式。在这篇博文里我会分享出我最欣赏的五种组件模式与代码片。不过我首先还是要谈谈为什么我们需要执着于提高代码的阅读体验。就好像你有很多种方式去装扮一只猫,如果你把你的爱猫装扮成了如下这样子:

如何写出漂亮的React组件

你或许可以认为萝卜青菜各有所爱,但是代码本身是应当保证其可读性,特别是在一个团队中,你的代码是注定要被其他人阅读的。电脑是不会在意这些的,不管你朝它们扔过去什么,它们都会老老实实的解释,但是你的队友们可不会这样,他们会把丑陋的代码扔回到你的脸上。而所谓的Pretty  Components,应该包含如下的特性:

  • 即使没有任何注释的情况下也易于理解

  • 比乱麻般的代码有更好的性能表现

  • 更易于进行Bug追溯

  • 简洁明了,一句顶一万句

如何写出漂亮的React组件

SFC:Stateless Functional Component

我觉得我们在开发中经常忽略掉的一个模式就是所谓的Stateless Functional  Component,不过这是我个人***的React组件优化模式,没有之一。我喜爱这种模式不仅仅因为它们能够减少大量的模板代码,而且因为它们能够有效地提高组件的性能表现。总而言之,SFC能够让你的应用跑的更快,长的更帅。

如何写出漂亮的React组件

直观来看,SFC就是指那些仅有一个渲染函数的组件,不过这简单的改变就可以避免很多的无意义的检测与内存分配。下面我们来看一个实践的例子来看下SFC的具体作用,譬如:

如何写出漂亮的React组件

如果我们用正统的React组件的写法,可以得出如下代码:

export default class RelatedSearch extends React.Component {    constructor(props) {      super(props);      this._handleClick = this._handleClick.bind(this);    }    _handleClick(suggestedUrl, event) {      event.preventDefault();      this.props.onClick(suggestedUrl);    }    render() {      return (        <section className="related-search-container">          <h2 className="related-search-title">Related Searches:</h2>          <Layout x-small={2} small={3} medium={4} padded={true}>            {this.props.relatedQueries.map((query, index) =>              <Link                className="related-search-link"                onClick={(event) =>                  this._handleClick(query.searchQuery, event)}                key={index}>                {query.searchText}              </Link>            )}          </Layout>        </section>      );    }  }

而使用SFC模式的话,大概可以省下29%的代码:

const _handleClick(suggestedUrl, onClick, event) => {    event.preventDefault();    onClick(suggestedUrl);  };  const RelatedSearch = ({ relatedQueries, onClick }) =>    <section className="related-search-container">      <h2 className="related-search-title">Related Searches:</h2>      <Layout x-small={2} small={3} medium={4} padded={true}>        {relatedQueries.map((query, index) =>          <Link            className="related-search-link"            onClick={(event) =>              _handleClick(query.searchQuery, onClick, event)}            key={index}>            {query.searchText}          </Link>        )}      </Layout>    </section>  export default RelatedSearch;

代码量的减少主要来源两个方面:

  • 没有构造函数(5行)

  • 以Arrow Function的方式替代Render语句(4行)

实际上,SFC最迷人的地方不仅仅是其代码量的减少,还有就是对于可读性的提高。SFC模式本身就是所谓纯组件的一种***实践范式,而移除了构造函数并且将_handleClick()这个点击事件回调函数提取出组件外,可以使JSX代码变得更加纯粹。另一个不错的地方就是SFC以Arrow  Function的方式来定义了输入的Props变量,即以Object Destructring语法来声明组件所依赖的Props:

const RelatedSearch = ({ relatedQueries, onClick }) =>

这样不仅能够使组件的Props更加清晰明确,还能够避免冗余的this.props表达式,从而使代码的可读性更好。

我还想要强调下虽然我很推崇SFC,不过也不能滥用它。最合适使用SFC的地方就是之前你用纯组件的地方。在Walmart  Labs中,我们使用Redux来管理应用的状态,也就意味着我们绝大部分的组件都是纯组件,也就给了SFC广阔的应用空间。一般来说,有以下特征的组件式绝对不适合使用SFC的:

  • 需要自定义整个组件的生命周期管理

  • 需要使用到refs

Conditional Components

JSX本身不支持if表达式,不过我们可以使用逻辑表达式的方式来避免将代码切分到不同的子模块中,大概是如下样子:

render() {    <div class="search-results-container">      {this.props.isGrid        ? <SearchResultsGrid />        : <SearchResultsList />}    </div>  }

这种表达式在二选一渲染的时候很有效果,不过对于选择性渲染一个的情况很不友好,譬如如下的情况:

render() {    <div class="search-results-list">      {this.props.isSoftSort        ? <SoftSortBanner />        : null      }    </div>  }

这样子确实能起作用,不过看上去感觉怪怪的。我们可以选用另一种更加语义化与友好的方式来实现这个功能,即使用逻辑与表达式然后返回组件:

render() {    <div class="search-results-list">      {!!this.props.isSoftSort && <SoftSortBanner />}    </div>  }

不过这一点也是见仁见智,每个人按照自己的喜好来就行了。

Arrow Syntax In React And Redux

ES2015里包含了不少可口的语法糖,我***的就是那个Arrow Notation。这个特性在编写组件时很有作用:

const SoftSort = ({ hardSortUrl, sortByName, onClick }) => {    return (      <div className="SearchInfoMessage">        Showing results sorted by both Relevance and {sortByName}.        <Link          href={`?${hardSortUrl}`}          onClick={(ev) => onClick(ev, hardSortUrl)}>          Sort results by {sortByName} only        </Link>      </div>    );  };

该函数的功能就是返回JSX对象,我们也可以忽略return语句:

const SoftSort = ({ hardSortUrl, sortByName, onClick }) =>    <div className="SearchInfoMessage">      Showing results sorted by both Relevance and {sortByName}.      <Link        href={`?${hardSortUrl}`}        onClick={(ev) => onClick(ev, hardSortUrl)}>        Sort results by {sortByName} only      </Link>    </div>

代码行数又少了不少咯!

另一块我觉得非常适用Arrow Function的地方就是Redux的mapStateToProps函数:

const mapStateToProps = ({isLoading}) => {    return ({      loading: isLoading,    });  };

需要注意的是,如果你返回的是Object,你需要包裹在大括号内:

const mapStateToProps = ({isLoading}) => ({    loading: isLoading  });

使用Arrow Function优化的核心点在于其能够通过专注于函数的重要部分而提升代码的整体可读性,并且避免过多的模板代码带来的噪音。

合理使用Object Destructing与Spread Attributes

大的组件往往受困于this.props过长的窘境,典型的如下所示:

render() {    return (      <ProductPrice        hidePriceFulfillmentDisplay=         {this.props.hidePriceFulfillmentDisplay}        primaryOffer={this.props.primaryOffer}        productType={this.props.productType}        productPageUrl={this.props.productPageUrl}        inventory={this.props.inventory}        submapType={this.props.submapType}        ppu={this.props.ppu}        isLoggedIn={this.props.isLoggedIn}        gridView={this.props.isGridView}      />    );  }

这么多的Props估计看着都头疼,如果我们要将这些Props继续传入下一层,大概就要变成下面这个样子了:

render() {    const {      hidePriceFulfillmentDisplay,      primaryOffer,      productType,      productPageUrl,      inventory,      submapType,      ppu,      isLoggedIn,      gridView    } = this.props;    return (      <ProductPrice        hidePriceFulfillmentDisplay={hidePriceFulfillmentDisplay}        primaryOffer={primaryOffer}        productType={productType}        productPageUrl={productPageUrl}        inventory={inventory}        submapType={submapType}        ppu={ppu}        isLoggedIn={isLoggedIn}        gridView={isGridView}      />    );  }

暂时不考虑unKnown Props,我们可以使用解构赋值来实现这个功能:

render() {    const props = this.props;    return <ProductPrice {...props} />  }

Method Definition Shorthand

***这个方法不一定多有用,不过还是能让你的代码变得更加漂亮。如果你希望在Object中添加函数,你可以使用ES2015 Method Definition  Shorthand来代替传统的ES5的表达式,譬如:

如果你想设置一个默认的空方法,也可以利用这种方式:

ProductRating.defaultProps = {    onStarsClick() {}  };

关于如何写出漂亮的React组件问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网行业资讯频道了解更多相关知识。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何写出漂亮的React组件

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python如何使用tabulate打印出漂亮的2D列表

这篇文章主要介绍了python如何使用tabulate打印出漂亮的2D列表,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。使用tabulate打印出漂亮的2D列表很多时候,用P
2023-06-27

Win7如何把一组漂亮的图设置成桌面背景?

发现一组非常漂亮的图,如何把它们设置成我的电脑桌面背景呢,www.cppcns.com下面跟作者一起来鼓捣一下吧。方法/步骤 1、下载好\或者制作好你想要设置为编程桌面背景的组图,统一js放到一个文件里(文件夹名字最好为英文或者拼音,汉字也
2023-06-10

推荐一个地图可视化神器:pyecharts,python如何画出漂亮的地图?

pyecharts是什么?是一个用于生成 Echarts 图表的类库,Echarts 是百度开源的一个数据可视化 JS 库。用 Echarts 生成的图可视化效果非常棒,pyecharts 是为了与 Python 进行对接,方便在 Python 中直接使用数据生成图。推荐一个地图可视化神器:pyecharts,python如何画出漂亮的地图?
推荐一个地图可视化神器:pyecharts,python如何画出漂亮的地图?
2024-04-23

如何编写vue的组件库

随着Vue框架的不断发展和普及,越来越多的开发者开始使用Vue编写Web应用程序。在Vue开发中,组件是Vue的核心概念之一,可以让开发者更加灵活和高效地组织代码和交互逻辑。因此,编写Vue的组件库就成为了许多开发者关注和探索的领域。本文将介绍如何编写Vue的组件库,包括组件库的设计和架构,组件的开发和测试,以及组件库的发布和使用。一、组件库的设计和架构1.1 组件库的设计在开
2023-05-25

如何解决vue组件路由高亮的问题

这篇文章给大家分享的是有关如何解决vue组件路由高亮的问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。vue是什么Vue是一套用于构建用户界面的渐进式JavaScript框架,Vue与其它大型框架的区别是,使用
2023-06-15

React组件中的state和setState如何使用

本篇内容主要讲解“React组件中的state和setState如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“React组件中的state和setState如何使用”吧!state的基本
2023-06-29

react中如何对自己的组件使用setFieldsValue

react中如何对自己的组件使用setFieldsValue问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-03-11

python如何导出自己写的文件

要导出自己写的Python文件,可以使用以下步骤:1. 在Python脚本中编写你的代码,并将其保存为一个以`.py`为扩展名的文件。例如,你可以创建一个名为`my_script.py`的文件。2. 在需要导出的文件中,使用`import`
2023-09-26

React父子组件间的通信是如何进行的

本篇内容介绍了“React父子组件间的通信是如何进行的”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!父子组件通信方式(1)传递数据(父传子)
2023-07-05

React在组件中如何监听redux中state状态的改变

这篇文章主要介绍了React在组件中如何监听redux中state状态的改变,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

编程热搜

目录