如何寫(xiě)出漂亮的React組件,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)貴德,十年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專(zhuān)業(yè),歡迎來(lái)電咨詢(xún)建站服務(wù):18980820575
在Walmart Labs的產(chǎn)品開(kāi)發(fā)中,我們進(jìn)行了大量的Code Review工作,這也保證了我有機(jī)會(huì)從很多優(yōu)秀的工程師的代碼中學(xué)習(xí)他們的代碼風(fēng)格與樣式。在這篇博文里我會(huì)分享出我最欣賞的五種組件模式與代碼片。不過(guò)我首先還是要談?wù)劄槭裁次覀冃枰獔?zhí)著于提高代碼的閱讀體驗(yàn)。就好像你有很多種方式去裝扮一只貓,如果你把你的愛(ài)貓裝扮成了如下這樣子:
你或許可以認(rèn)為蘿卜青菜各有所愛(ài),但是代碼本身是應(yīng)當(dāng)保證其可讀性,特別是在一個(gè)團(tuán)隊(duì)中,你的代碼是注定要被其他人閱讀的。電腦是不會(huì)在意這些的,不管你朝它們?nèi)舆^(guò)去什么,它們都會(huì)老老實(shí)實(shí)的解釋?zhuān)悄愕年?duì)友們可不會(huì)這樣,他們會(huì)把丑陋的代碼扔回到你的臉上。而所謂的Pretty Components,應(yīng)該包含如下的特性:
即使沒(méi)有任何注釋的情況下也易于理解
比亂麻般的代碼有更好的性能表現(xiàn)
更易于進(jìn)行Bug追溯
簡(jiǎn)潔明了,一句頂一萬(wàn)句
SFC:Stateless Functional Component
我覺(jué)得我們?cè)陂_(kāi)發(fā)中經(jīng)常忽略掉的一個(gè)模式就是所謂的Stateless Functional Component,不過(guò)這是我個(gè)人***的React組件優(yōu)化模式,沒(méi)有之一。我喜愛(ài)這種模式不僅僅因?yàn)樗鼈兡軌驕p少大量的模板代碼,而且因?yàn)樗鼈兡軌蛴行У靥岣呓M件的性能表現(xiàn)。總而言之,SFC能夠讓你的應(yīng)用跑的更快,長(zhǎng)的更帥。
直觀來(lái)看,SFC就是指那些僅有一個(gè)渲染函數(shù)的組件,不過(guò)這簡(jiǎn)單的改變就可以避免很多的無(wú)意義的檢測(cè)與內(nèi)存分配。下面我們來(lái)看一個(gè)實(shí)踐的例子來(lái)看下SFC的具體作用,譬如:
如果我們用正統(tǒng)的React組件的寫(xiě)法,可以得出如下代碼:
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 (); } } Related Searches:
{this.props.relatedQueries.map((query, index) => this._handleClick(query.searchQuery, event)} key={index}> {query.searchText} )}
而使用SFC模式的話,大概可以省下29%的代碼:
const _handleClick(suggestedUrl, onClick, event) => { event.preventDefault(); onClick(suggestedUrl); }; const RelatedSearch = ({ relatedQueries, onClick }) =>export default RelatedSearch; Related Searches:
{relatedQueries.map((query, index) => _handleClick(query.searchQuery, onClick, event)} key={index}> {query.searchText} )}
代碼量的減少主要來(lái)源兩個(gè)方面:
沒(méi)有構(gòu)造函數(shù)(5行)
以Arrow Function的方式替代Render語(yǔ)句(4行)
實(shí)際上,SFC最迷人的地方不僅僅是其代碼量的減少,還有就是對(duì)于可讀性的提高。SFC模式本身就是所謂純組件的一種***實(shí)踐范式,而移除了構(gòu)造函數(shù)并且將_handleClick()這個(gè)點(diǎn)擊事件回調(diào)函數(shù)提取出組件外,可以使JSX代碼變得更加純粹。另一個(gè)不錯(cuò)的地方就是SFC以Arrow Function的方式來(lái)定義了輸入的Props變量,即以O(shè)bject Destructring語(yǔ)法來(lái)聲明組件所依賴(lài)的Props:
const RelatedSearch = ({ relatedQueries, onClick }) =>
這樣不僅能夠使組件的Props更加清晰明確,還能夠避免冗余的this.props表達(dá)式,從而使代碼的可讀性更好。
我還想要強(qiáng)調(diào)下雖然我很推崇SFC,不過(guò)也不能濫用它。最合適使用SFC的地方就是之前你用純組件的地方。在Walmart Labs中,我們使用Redux來(lái)管理應(yīng)用的狀態(tài),也就意味著我們絕大部分的組件都是純組件,也就給了SFC廣闊的應(yīng)用空間。一般來(lái)說(shuō),有以下特征的組件式絕對(duì)不適合使用SFC的:
需要自定義整個(gè)組件的生命周期管理
需要使用到refs
Conditional Components
JSX本身不支持if表達(dá)式,不過(guò)我們可以使用邏輯表達(dá)式的方式來(lái)避免將代碼切分到不同的子模塊中,大概是如下樣子:
render() {{this.props.isGrid ?}: }
這種表達(dá)式在二選一渲染的時(shí)候很有效果,不過(guò)對(duì)于選擇性渲染一個(gè)的情況很不友好,譬如如下的情況:
render() {{this.props.isSoftSort ?}: null }
這樣子確實(shí)能起作用,不過(guò)看上去感覺(jué)怪怪的。我們可以選用另一種更加語(yǔ)義化與友好的方式來(lái)實(shí)現(xiàn)這個(gè)功能,即使用邏輯與表達(dá)式然后返回組件:
render() {{!!this.props.isSoftSort &&}}
不過(guò)這一點(diǎn)也是見(jiàn)仁見(jiàn)智,每個(gè)人按照自己的喜好來(lái)就行了。
Arrow Syntax In React And Redux
ES2015里包含了不少可口的語(yǔ)法糖,我***的就是那個(gè)Arrow Notation。這個(gè)特性在編寫(xiě)組件時(shí)很有作用:
const SoftSort = ({ hardSortUrl, sortByName, onClick }) => { return (Showing results sorted by both Relevance and {sortByName}. onClick(ev, hardSortUrl)}> Sort results by {sortByName} only); };
該函數(shù)的功能就是返回JSX對(duì)象,我們也可以忽略return語(yǔ)句:
const SoftSort = ({ hardSortUrl, sortByName, onClick }) =>Showing results sorted by both Relevance and {sortByName}. onClick(ev, hardSortUrl)}> Sort results by {sortByName} only
代碼行數(shù)又少了不少咯!
另一塊我覺(jué)得非常適用Arrow Function的地方就是Redux的mapStateToProps函數(shù):
const mapStateToProps = ({isLoading}) => { return ({ loading: isLoading, }); };
需要注意的是,如果你返回的是Object,你需要包裹在大括號(hào)內(nèi):
const mapStateToProps = ({isLoading}) => ({ loading: isLoading });
使用Arrow Function優(yōu)化的核心點(diǎn)在于其能夠通過(guò)專(zhuān)注于函數(shù)的重要部分而提升代碼的整體可讀性,并且避免過(guò)多的模板代碼帶來(lái)的噪音。
合理使用Object Destructing與Spread Attributes
大的組件往往受困于this.props過(guò)長(zhǎng)的窘境,典型的如下所示:
render() { return (); }
這么多的Props估計(jì)看著都頭疼,如果我們要將這些Props繼續(xù)傳入下一層,大概就要變成下面這個(gè)樣子了:
render() { const { hidePriceFulfillmentDisplay, primaryOffer, productType, productPageUrl, inventory, submapType, ppu, isLoggedIn, gridView } = this.props; return (); }
暫時(shí)不考慮unKnown Props,我們可以使用解構(gòu)賦值來(lái)實(shí)現(xiàn)這個(gè)功能:
render() { const props = this.props; return}
Method Definition Shorthand
***這個(gè)方法不一定多有用,不過(guò)還是能讓你的代碼變得更加漂亮。如果你希望在Object中添加函數(shù),你可以使用ES2015 Method Definition Shorthand來(lái)代替?zhèn)鹘y(tǒng)的ES5的表達(dá)式,譬如:
如果你想設(shè)置一個(gè)默認(rèn)的空方法,也可以利用這種方式:
ProductRating.defaultProps = { onStarsClick() {} };
關(guān)于如何寫(xiě)出漂亮的React組件問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。