可復(fù)用組件而不是可復(fù)用函數(shù)

在剛開始寫js的時(shí)候孽亲,如果某個(gè)js函數(shù)代碼量很大,我們會進(jìn)行拆分展父,將其劃分成多個(gè)細(xì)化的功能塊返劲。

就像這樣

button[0].onclick = function () {
    cleanInputValue()
    // ...
}

button[1].onclick = function () {
    cleanInputValue()
    // ...
}

function cleanInputValue() {
    //....
}

細(xì)分功能塊可以避免代碼重復(fù),也能夠讓代碼邏輯更加清晰栖茉,更加容易擴(kuò)展篮绿,修改錯(cuò)誤更容易。

把代碼細(xì)分之后也可以省去很多注釋吕漂,將來代碼需要更改亲配,也可以減少代碼更改量

在react的開發(fā)中,我們會引入組件的概念惶凝。組件允許我們將用戶界面拆分為獨(dú)立的吼虎、可重用的一部分,組件其實(shí)有些像js中的function苍鲜。我們通過對組件進(jìn)行拆分思灰,實(shí)現(xiàn)組件化開發(fā)。針對不同的業(yè)務(wù)場景我們可以引用相應(yīng)的組件混滔,減少了開發(fā)量洒疚。

微票電影票房分析

我們把微票電影票房分析的首頁進(jìn)行組件化拆分后如上圖所示。其中DateChoose組件和Footer組件在很多頁面都會用到遍坟,我們可以把這兩個(gè)組件放到單獨(dú)的common文件夾中拳亿。供其他頁面調(diào)用

公用組件

而Movie組件在本頁面會被用到很多次晴股,我們也會把Movie組件單獨(dú)拆分出來愿伴,作為一個(gè)可復(fù)用組件。

但是在如何定義一個(gè)組件時(shí)电湘,我們經(jīng)常會寫出不太好的代碼

就像這樣

export default class Home extends Page {
    // ...
   renderMovie(movieName) {
      //...
     return (
        <div>{movieName}</div>
     )
   }
   render() {
      let movieName1 = '奇異博士'
      let movieName2 = '蠟筆小新'
      return(
        <div>...</div>
        <div>{renderMovie(this, movieName1)}</div>
        <div>{renderMovie(this, movieName2)}</div>
        <div>...</div>
      )
  }
}

這樣當(dāng)然也沒什么問題隔节,但我們很難把renderMovie稱為一個(gè)組件鹅经,他更像一個(gè)復(fù)用函數(shù)而不是一個(gè)復(fù)用組件。實(shí)際上怎诫,這個(gè)復(fù)用函數(shù)只是在jsx語法的幫助下瘾晃,實(shí)現(xiàn)了組件的作用。

這種方法不符合組件化思想幻妓,而且renderMovie沒辦法進(jìn)行參數(shù)校驗(yàn)蹦误,我們無法保證傳入數(shù)據(jù)的有效性。

Functional

在react中定義組件最簡單的做法是使用Functional肉津。

export default class Home extends Page {
    // ...
   render() {
      return(
        <div>...</div>
        <Movie name='奇異博士' />
        <Movie name='蠟筆小新' />
        <div>...</div>
      )
  }
}

funtion Movie(props) {
    //...
   return (
      <div>{props.name}</div>
   )
}

Movie.propTypes = {
    name: React.PropTypes.string.isRequired,
}

為了保證組件被正確使用强胰,為此我們引入 propTypes。React.PropTypes 提供很多驗(yàn)證器 (validator) 來驗(yàn)證傳入數(shù)據(jù)的有效性妹沙。當(dāng)向 props 傳入無效數(shù)據(jù)時(shí)偶洋,JavaScript 控制臺會拋出警告。

另外根據(jù)條件渲染組件的時(shí)距糖,我們可以把條件值通過props傳入組件內(nèi)部玄窝。

export default class Home extends Page {
    // ...
   render() {
      let status = xxx
      return(
        <div>...</div>
        <Movie name='奇異博士' />
        <Movie name='蠟筆小新' status={status} />
        }
        <div>...</div>
      )
  }
}

funtion Movie(props) {
    //...
   if (!props.status) {
     return null
   }

   return (
      <div>{props.name}</div>
   )
}

Movie.propTypes = {
    name: React.PropTypes.string.isRequired,
}

使用這種方法代碼會更優(yōu)雅一些。

至于把組件拆分到什么情況下才可以悍引,react的建議是越小越好恩脂,每個(gè)小組件都保證獨(dú)立與可重用。就像拼積木一樣吗铐,在業(yè)務(wù)變更時(shí)东亦,我們可以很快的迭代和開發(fā)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末唬渗,一起剝皮案震驚了整個(gè)濱河市典阵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌镊逝,老刑警劉巖壮啊,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異撑蒜,居然都是意外死亡歹啼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門座菠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狸眼,“玉大人,你說我怎么就攤上這事浴滴⊥孛龋” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵升略,是天一觀的道長微王。 經(jīng)常有香客問我屡限,道長,這世上最難降的妖魔是什么炕倘? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任钧大,我火速辦了婚禮,結(jié)果婚禮上罩旋,老公的妹妹穿的比我還像新娘啊央。我一直安慰自己,他們只是感情好涨醋,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布劣挫。 她就那樣靜靜地躺著,像睡著了一般东帅。 火紅的嫁衣襯著肌膚如雪压固。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天靠闭,我揣著相機(jī)與錄音帐我,去河邊找鬼。 笑死愧膀,一個(gè)胖子當(dāng)著我的面吹牛拦键,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播檩淋,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼芬为,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蟀悦?” 一聲冷哼從身側(cè)響起媚朦,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎日戈,沒想到半個(gè)月后询张,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浙炼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年份氧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弯屈。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蜗帜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出资厉,到底是詐尸還是另有隱情厅缺,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站店归,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏酪我。R本人自食惡果不足惜消痛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望都哭。 院中可真熱鬧秩伞,春花似錦、人聲如沸欺矫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽穆趴。三九已至脸爱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間未妹,已是汗流浹背簿废。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留络它,地道東北人族檬。 一個(gè)月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像化戳,于是被迫代替她去往敵國和親单料。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 原教程內(nèi)容詳見精益 React 學(xué)習(xí)指南点楼,這只是我在學(xué)習(xí)過程中的一些閱讀筆記扫尖,個(gè)人覺得該教程講解深入淺出,比目前大...
    leonaxiong閱讀 2,813評論 1 18
  • 做React需要會什么? react的功能其實(shí)很單一却盘,主要負(fù)責(zé)渲染的功能狰域,現(xiàn)有的框架,比如angular是一個(gè)大而...
    蒼都閱讀 14,747評論 1 139
  • GUIDS 第一章 為什么使用React黄橘? React 一個(gè)提供了用戶接口的JavaScript庫兆览。 誕生于Fac...
    jplyue閱讀 3,525評論 1 11
  • ?還記得幾年前網(wǎng)絡(luò)上出現(xiàn)的各大破解軟件嗎?那時(shí)的我們天天對著電腦塞关,在網(wǎng)上使勁搜索各種免費(fèi)資源抬探,只要看到“免費(fèi)”字樣...
    joysera閱讀 191評論 0 0
  • 【別讓“關(guān)系秀”扭曲了孩子的價(jià)值觀】 “我工作于全球某投行,研究股市大數(shù)據(jù),如果誰欺負(fù)我家孩子小压,孩子他爸會把你的股...
    自由拍客V閱讀 374評論 0 2