前言
說起React,那也是近一年多時間火起來的前端框架拙毫,其在Facebook的影響力和大力推廣下依许,已然成為目前前端界的中流砥柱。在如今的前端框架界缀蹄,React峭跳、Vue、Angular三分天下的時代已經(jīng)到來缺前,而曾經(jīng)jQuery一統(tǒng)天下的局面已一去不復返蛀醉。
三分天下,前端雖亂衅码,但美其名曰“繁榮”拯刁。每一次突破性的革命必定會迎來成千上萬的追隨者,我們可以看一下一份來自NPM的統(tǒng)計數(shù)據(jù):

上圖統(tǒng)計的是全球范圍內React逝段、Vue垛玻、Angular在npm中的月下載次數(shù)割捅,統(tǒng)計地址可以訪問:npm-stat。從圖中我們不難發(fā)現(xiàn)React雖初出茅廬帚桩,但其影響力已經(jīng)奠定了在前端框架中的霸主地位亿驾。
而對于React的開發(fā)者來說,如何利用React構建現(xiàn)代化的前端項目账嚎,產出高質量的前端代碼才是學習React的重點莫瞬。所以本文就我自己平時利用React開發(fā)項目的經(jīng)驗和個人見解,來談談在React項目中需要了解和容易忽略的“小事”郭蕉。
那些小事
俗話說“千里之堤毀于蟻穴”疼邀,在React開發(fā)中我們不能忙于進度而忽視了細節(jié)。
1.使用容器組件與展示組件
容器組件和展示組件名詞來自于redux文檔恳不。如果你想讓自己的React項目變得清晰可維護檩小,那么你需要了解并使用它們开呐。
這里我們將組件分成兩類烟勋,一類叫“容器組件”,我一般將它們放在containers文件夾下筐付。這一類組件可以理解為最頂層的組件卵惦,其功能僅僅做數(shù)據(jù)提取,然后渲染對應的子組件瓦戚。
另一類叫“展示組件”沮尿,我一般將它們放在components文件夾下。這一類組件可以理解為只具有展示性的子組件较解,其功能僅僅是展示性的畜疾,所有數(shù)據(jù)都通過 props 傳入。
這樣分類的好處在于:關注分離印衔,更易復用及維護啡捶,數(shù)據(jù)集中處理等。具體可以參見:譯文《容器組件和展示組件》
2.組件劃分不宜過細奸焙,層次不宜過深
曾經(jīng)有人問我React組件的劃分應不應該太細瞎暑,比如是不是可以把一個輸入框劃分為一個組件?
我個人認為組件不應該按照DOM元素來劃分与帆,而是應該按照功能來劃分了赌。如果你的一個頁面中包含了兩個功能,比如表格搜索玄糟、彈框查看勿她,就可以將其劃分為兩個子組件。
同樣的組件層次也不宜過深阵翎。很多時候會存在組件中包含組件的情況逢并,這樣就出現(xiàn)了組件之間的嵌套層次播揪。我個人認為組件間的嵌套層次不宜超過3層,如果嵌套層次太深會直接導致功能及狀態(tài)的難以維護筒狠,就像if else語句嵌套太深一樣猪狈。
3.Redux和state并不沖突
很多開發(fā)者可能會認為用了Redux來管理數(shù)據(jù)狀態(tài)后,我們的組件中就不需要state了辩恼。其實我個人認為Redux和state并不沖突雇庙。
Redux主要用于管理那些公用及異步的狀態(tài),而state一般用于管理組件獨有的狀態(tài)灶伊。如果你的組件中存在其不必和其他組件公用及非異步的單一數(shù)據(jù)疆前,那么你直接可以寫在state中,比如一些loading的狀態(tài)和顯示隱藏的狀態(tài)等聘萨。
巧妙的使用Redux和state可以幫助我們更好的管理數(shù)據(jù)流竹椒。
4.不要渲染當前用不到的組件
在用戶操作中,有些組件可能不是一開始展示頁面的時候就需要用到的米辐,比如某些彈框等胸完。這樣的組件除了將其隱藏外,我們最好不要讓它渲染在頁面上翘贮,當用戶點擊觸發(fā)的時候再進行渲染赊窥,這樣一來便起到了優(yōu)化加載的作用。
5.除了劃分組件還應劃分reducer
相比組件的劃分狸页,reducer的劃分也同樣重要锨能。隨著應用的膨脹,我們可以將拆分后的 reducer 放到不同的文件中, 以保持其獨立性并用于專門處理不同的數(shù)據(jù)域芍耘。
如果一個中大型的項目不劃分reducer址遇,會導致單一的reducer文件代碼過于冗長而難以維護。我們可以使用Redux提供的 combineReducers()來將拆分的reducer進行合并斋竞。詳見:Redux中文文檔倔约。
結語
事無巨細,人無完人窃页。一個優(yōu)秀的React項目并不代表其沒有缺點跺株,代碼優(yōu)化是一個長期的過程,唯有發(fā)現(xiàn)問題總結問題才能給我們帶來新的突破口脖卖。