成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何寫出漂亮的React組件

開發 后端
在Walmart Labs的產品開發中,我們進行了大量的Code Review工作,這也保證了我有機會從很多優秀的工程師的代碼中學習他們的代碼風格與樣式。在這篇博文里我會分享出我最欣賞的五種組件模式與代碼片。不過我首先還是要談談為什么我們需要執著于提高代碼的閱讀體驗。

在Walmart Labs的產品開發中,我們進行了大量的Code Review工作,這也保證了我有機會從很多優秀的工程師的代碼中學習他們的代碼風格與樣式。在這篇博文里我會分享出我最欣賞的五種組件模式與代碼片。不過我首先還是要談談為什么我們需要執著于提高代碼的閱讀體驗。就好像你有很多種方式去裝扮一只貓,如果你把你的愛貓裝扮成了如下這樣子:

[[177131]]

你或許可以認為蘿卜青菜各有所愛,但是代碼本身是應當保證其可讀性,特別是在一個團隊中,你的代碼是注定要被其他人閱讀的。電腦是不會在意這些的,不管你朝它們扔過去什么,它們都會老老實實的解釋,但是你的隊友們可不會這樣,他們會把丑陋的代碼扔回到你的臉上。而所謂的Pretty Components,應該包含如下的特性:

  • 即使沒有任何注釋的情況下也易于理解
  • 比亂麻般的代碼有更好的性能表現
  • 更易于進行Bug追溯
  • 簡潔明了,一句頂一萬句

SFC:Stateless Functional Component

我覺得我們在開發中經常忽略掉的一個模式就是所謂的Stateless Functional Component,不過這是我個人***的React組件優化模式,沒有之一。我喜愛這種模式不僅僅因為它們能夠減少大量的模板代碼,而且因為它們能夠有效地提高組件的性能表現。總而言之,SFC能夠讓你的應用跑的更快,長的更帥。

直觀來看,SFC就是指那些僅有一個渲染函數的組件,不過這簡單的改變就可以避免很多的無意義的檢測與內存分配。下面我們來看一個實踐的例子來看下SFC的具體作用,譬如:

如何寫出漂亮的 React 組件

如果我們用正統的React組件的寫法,可以得出如下代碼:

 

  1. export default class RelatedSearch extends React.Component {  
  2. constructor(props) {  
  3. super(props);  
  4. this._handleClick = this._handleClick.bind(this);  
  5.  
  6. _handleClick(suggestedUrl, event) {  
  7. event.preventDefault();  
  8. this.props.onClick(suggestedUrl);  
  9.  
  10. render() {  
  11. return (  
  12. Related Searches:  
  13. {this.props.relatedQueries.map((query, index) =>  
  14. className="related-search-link"  
  15. onClick={(event) =>  
  16. this._handleClick(query.searchQuery, event)}  
  17. key={index}>  
  18. {query.searchText}  
  19. )}  
  20. );  
  21.  

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

 

  1. const _handleClick(suggestedUrl, onClick, event) => {  
  2. event.preventDefault();  
  3. onClick(suggestedUrl);  
  4. };  
  5. const RelatedSearch = ({ relatedQueries, onClick }) =>  
  6. Related Searches:  
  7. {relatedQueries.map((query, index) =>  
  8. className="related-search-link"  
  9. onClick={(event) =>  
  10. _handleClick(query.searchQuery, onClick, event)}  
  11. key={index}>  
  12. {query.searchText}  
  13. )}  
  14. export default RelatedSearch; 

代碼量的減少主要來源兩個方面:

  • 沒有構造函數(5行)
  • 以Arrow Function的方式替代Render語句(4行)

實際上,SFC最迷人的地方不僅僅是其代碼量的減少,還有就是對于可讀性的提高。SFC模式本身就是所謂純組件的一種***實踐范式,而移除了構造函數并且將_handleClick()這個點擊事件回調函數提取出組件外,可以使JSX代碼變得更加純粹。另一個不錯的地方就是SFC以Arrow Function的方式來定義了輸入的Props變量,即以Object Destructring語法來聲明組件所依賴的Props:

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

這樣不僅能夠使組件的Props更加清晰明確,還能夠避免冗余的this.props表達式,從而使代碼的可讀性更好。

***,我還想要強調下雖然我很推崇SFC,不過也不能濫用它。最合適使用SFC的地方就是之前你用純組件的地方。在Walmart Labs中,我們使用Redux來管理應用的狀態,也就意味著我們絕大部分的組件都是純組件,也就給了SFC廣闊的應用空間。一般來說,有以下特征的組件式絕對不適合使用SFC的:

  • 需要自定義整個組件的生命周期管理
  • 需要使用到refs

Conditional Components

JSX本身不支持if表達式,不過我們可以使用邏輯表達式的方式來避免將代碼切分到不同的子模塊中,大概是如下樣子:

 

  1. render() {  
  2. {this.props.isGrid  
  3.  
  4. : }  

這種表達式在二選一渲染的時候很有效果,不過對于選擇性渲染一個的情況很不友好,譬如如下的情況:

 

  1. render() {  
  2. {this.props.isSoftSort  
  3.  
  4. null  
  5.  

這樣子確實能起作用,不過看上去感覺怪怪的。我們可以選用另一種更加語義化與友好的方式來實現這個功能,即使用邏輯與表達式然后返回組件:

 

  1. render() {  
  2. {!!this.props.isSoftSort && }  

不過這一點也是見仁見智,每個人按照自己的喜好來就行了。

Arrow Syntax In React And Redux

ES2015里包含了不少可口的語法糖,我***的就是那個Arrow Notation。這個特性在編寫組件時很有作用:

 

  1. const SoftSort = ({ hardSortUrl, sortByName, onClick }) => {  
  2. return (  
  3. Showing results sorted by both Relevance and {sortByName}.  
  4. href={`?${hardSortUrl}`}  
  5. onClick={(ev) => onClick(ev, hardSortUrl)}>  
  6. Sort results by {sortByName} only  
  7. );  
  8. }; 

該函數的功能就是返回JSX對象,我們也可以忽略return語句:

 

  1. const SoftSort = ({ hardSortUrl, sortByName, onClick }) =>  
  2. Showing results sorted by both Relevance and {sortByName}.  
  3. href={`?${hardSortUrl}`}  
  4. onClick={(ev) => onClick(ev, hardSortUrl)}>  
  5. Sort results by {sortByName} only 

代碼行數又少了不少咯!

另一塊我覺得非常適用Arrow Function的地方就是Redux的mapStateToProps函數:

 

  1. const mapStateToProps = ({isLoading}) => {  
  2. return ({  
  3. loading: isLoading,  
  4. });  
  5. }; 

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

 

  1. const mapStateToProps = ({isLoading}) => ({  
  2. loading: isLoading  
  3. }); 

使用Arrow Function優化的核心點在于其能夠通過專注于函數的重要部分而提升代碼的整體可讀性,并且避免過多的模板代碼帶來的噪音。

合理使用Object Destructing與Spread Attributes

大的組件往往受困于this.props過長的窘境,典型的如下所示:

 

  1. render() {  
  2. return (  
  3. hidePriceFulfillmentDisplay=  
  4. {this.props.hidePriceFulfillmentDisplay}  
  5. primaryOffer={this.props.primaryOffer}  
  6. productType={this.props.productType}  
  7. productPageUrl={this.props.productPageUrl}  
  8. inventory={this.props.inventory}  
  9. submapType={this.props.submapType}  
  10. ppu={this.props.ppu}  
  11. isLoggedIn={this.props.isLoggedIn}  
  12. gridView={this.props.isGridView}  
  13. />  
  14. );  

這么多的Props估計看著都頭疼,如果我們要將這些Props繼續傳入下一層,大概就要變成下面這個樣子了:

 

  1. render() {  
  2. const {  
  3. hidePriceFulfillmentDisplay,  
  4. primaryOffer,  
  5. productType,  
  6. productPageUrl,  
  7. inventory,  
  8. submapType,  
  9. ppu,  
  10. isLoggedIn,  
  11. gridView  
  12. } = this.props;  
  13. return (  
  14. hidePriceFulfillmentDisplay={hidePriceFulfillmentDisplay}  
  15. primaryOffer={primaryOffer}  
  16. productType={productType}  
  17. productPageUrl={productPageUrl}  
  18. inventory={inventory}  
  19. submapType={submapType}  
  20. ppu={ppu}  
  21. isLoggedIn={isLoggedIn}  
  22. gridView={isGridView}  
  23. />  
  24. );  

暫時不考慮unKnown Props,我們可以使用解構賦值來實現這個功能:

 

  1. render() {  
  2. const props = this.props;  
  3. return  
  4.  
  5. Method Definition Shorthand 

***這個方法不一定多有用,不過還是能讓你的代碼變得更加漂亮。如果你希望在Object中添加函數,你可以使用ES2015 Method Definition Shorthand來代替傳統的ES5的表達式,譬如:

 

  1. Link.defaultProps = {  
  2. onClick(event) {  
  3. event.preventDefault();  
  4. Logger.log(event);  
  5.  
  6. };  
  7. 如果你想設置一個默認的空方法,也可以利用這種方式:  
  8. ProductRating.defaultProps = {  
  9. onStarsClick() {}  
  10. }; 

 

責任編輯:未麗燕 來源: segmentfault
相關推薦

2017-09-01 14:18:50

前端React組件

2021-12-13 14:37:37

React組件前端

2021-12-07 08:16:34

React 前端 組件

2022-08-09 13:22:26

Hooksreactvue

2011-05-26 09:39:53

程序

2020-07-15 08:17:16

代碼

2020-05-11 15:23:58

CQRS代碼命令

2013-06-07 14:00:23

代碼維護

2021-09-01 08:55:20

JavaScript代碼開發

2017-03-15 13:41:16

數據庫SQL調試

2021-11-30 10:20:24

JavaScript代碼前端

2022-02-08 19:33:13

技巧代碼格式

2021-01-04 07:57:07

C++工具代碼

2022-02-17 10:05:21

CSS代碼前端

2020-12-19 10:45:08

Python代碼開發

2019-09-20 15:47:24

代碼JavaScript副作用

2022-03-11 12:14:43

CSS代碼前端

2020-05-19 15:00:26

Bug代碼語言

2016-12-21 11:55:55

兼容性頁面

2022-10-24 08:10:21

SQL代碼業務
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文av字幕 | 欧美一区视频在线 | 91av在线影院 | 国产精品99久久久久久宅男 | 成人亚洲视频 | 农村黄性色生活片 | 成人乱人乱一区二区三区软件 | 欧美成人精品激情在线观看 | 亚洲精品福利在线 | 99在线国产 | 天天操天天摸天天干 | 久久精品亚洲一区二区三区浴池 | 婷婷免费视频 | 久久亚洲精品久久国产一区二区 | 韩日一区二区 | 高清人人天天夜夜曰狠狠狠狠 | 日韩在线视频一区二区三区 | 一区二区三区在线播放 | 欧美成人一区二区 | 亚洲自拍一区在线观看 | 国产极品粉嫩美女呻吟在线看人 | www久久爱 | 免费观看一级毛片视频 | 性一区| av色站| 一二三四在线视频观看社区 | 欧美一二三四成人免费视频 | 国产一区二区三区在线看 | 一级片在线观看 | 国产精品永久在线观看 | www.天天操.com | 日本久久久久久久久 | 色免费在线视频 | 久久草在线视频 | 国产精品久久久久久久久久三级 | av在线影院 | 九九热免费看 | 一区二区三区在线播放视频 | 九九久久国产 | 欧美激情啪啪 | 日韩图区 |