React.js 小書 Lesson24 - PropTypes 和組件參數(shù)驗(yàn)證


React.js 小書 Lesson24 - PropTypes 和組件參數(shù)驗(yàn)證

本文作者:胡子大哈
本文原文:http://huziketang.com/books/react/lesson24

轉(zhuǎn)載請(qǐng)注明出處疚顷,保留原文鏈接以及作者信息

在線閱讀:http://huziketang.com/books/react


我們來了到了一個(gè)非常尷尬的章節(jié)菠净,很多初學(xué)的朋友可能對(duì)這一章的知識(shí)點(diǎn)不屑一顧亥揖,覺得用不用對(duì)程序功能也沒什么影響淤击。但其實(shí)這一章節(jié)的知識(shí)在你構(gòu)建多人協(xié)作程奠、大型的應(yīng)用程序的時(shí)候也是非常重要的宣脉,不可忽視宁昭。

都說 JavaScript 是一門靈活的語言 —— 這就是像是說“你是個(gè)好人”一樣喷市,凡事都有背后沒有說出來的話相种。JavaScript 的靈活性體現(xiàn)在弱類型、高階函數(shù)等語言特性上品姓。而語言的弱類型一般來說確實(shí)讓我們寫代碼很爽寝并,但是也很容易出 bug。

變量沒有固定類型可以隨意賦值腹备,在我們構(gòu)建大型應(yīng)用程序的時(shí)候并不是什么好的事情衬潦。你寫下了 let a = {} ,如果這是個(gè)共享的狀態(tài)并且在某個(gè)地方把 a = 3植酥,那么 a.xxx 就會(huì)讓程序崩潰了镀岛。而這種非常隱晦但是低級(jí)的錯(cuò)誤在強(qiáng)類型的語言例如 C/C++、Java 中是不可能發(fā)生的友驮,這些代碼連編譯都不可能通過漂羊,也別妄圖運(yùn)行。

大型應(yīng)用程序的構(gòu)建其實(shí)更適合用強(qiáng)類型的語言來構(gòu)建卸留,它有更多的規(guī)則走越,可以幫助我們?cè)诰帉懘a階段、編譯階段規(guī)避掉很多問題耻瑟,讓我們的應(yīng)用程序更加的安全旨指。JavaScript 早就脫離了玩具語言的領(lǐng)域并且投入到大型的應(yīng)用程序的生產(chǎn)活動(dòng)中捻悯,因?yàn)樗娜躅愋停3R馕吨皇呛馨踩倜K越陙沓霈F(xiàn)了類似 TypeScript 和 Flow 等技術(shù),來彌補(bǔ) JavaScript 這方面的缺陷算柳。

React.js 的組件其實(shí)是為了構(gòu)建大型應(yīng)用程序而生低淡。但是因?yàn)?JavaScript 這樣的特性,你在編寫了一個(gè)組件以后瞬项,根本不知道別人會(huì)怎么使用你的組件蔗蹋,往里傳什么亂七八糟的參數(shù),例如評(píng)論組件:

class Comment extends Component {
  const { comment } = this.props
  render () {
    return (
      <div className='comment'>
        <div className='comment-user'>
          <span>{comment.username} </span>:
        </div>
        <p>{comment.content}</p>
      </div>
    )
  }
}

但是別人往里面?zhèn)饕粋€(gè)數(shù)字你拿他一點(diǎn)辦法都沒有:

<Comment comment={1} />

JavaScript 在這種情況下是不會(huì)報(bào)任何錯(cuò)誤的囱淋,但是頁面就是顯示不正常猪杭,然后我們踏上了漫漫 debug 的路程。這里的例子還是過于簡(jiǎn)單妥衣,容易 debug皂吮,但是對(duì)于比較復(fù)雜的成因和情況是比較難處理的。

于是 React.js 就提供了一種機(jī)制税手,讓你可以給組件的配置參數(shù)加上類型驗(yàn)證蜂筹,就用上述的評(píng)論組件例子,你可以配置 Comment 只能接受對(duì)象類型的 comment 參數(shù)芦倒,你傳個(gè)數(shù)字進(jìn)來組件就強(qiáng)制報(bào)錯(cuò)艺挪。

import React, { Component, PropTypes } from 'react'

class Comment extends Component {
  static propTypes = {
    comment: PropTypes.object
  }

  render () {
    const { comment } = this.props
    return (
      <div className='comment'>
        <div className='comment-user'>
          <span>{comment.username} </span>:
        </div>
        <p>{comment.content}</p>
      </div>
    )
  }
}

注意我們?cè)谖募^部引入了 PropTypes,并且給 Comment 組件類添加了類屬性 propTypes兵扬,里面的內(nèi)容的意思就是你傳入的 comment 類型必須為 object(對(duì)象)麻裳。

這時(shí)候如果再往里面?zhèn)魅霐?shù)字,瀏覽器就會(huì)報(bào)錯(cuò):

[圖片上傳失敗...(image-f2c9a7-1510227000171)]

出錯(cuò)信息明確告訴我們:你給 Comment 組件傳了一個(gè)數(shù)字類型的 comment器钟,而它應(yīng)該是 object津坑。你就清晰知道問題出在哪里了。

雖然 propTypes 幫我們指定了參數(shù)類型傲霸,但是并沒有說這個(gè)參數(shù)一定要傳入国瓮,事實(shí)上,這些參數(shù)默認(rèn)都是可選的狞谱∧四。可選參數(shù)我們可以通過配置 defaultProps,讓它在不傳入的時(shí)候有默認(rèn)值跟衅。但是我們這里并沒有配置 defaultProps孵睬,所以如果直接用 <Comment /> 而不傳入任何參數(shù)的話,comment 就會(huì)是 undefined伶跷,comment.username 會(huì)導(dǎo)致程序報(bào)錯(cuò):

[圖片上傳失敗...(image-3c0073-1510227000171)]

這個(gè)出錯(cuò)信息并不夠友好掰读。我們可以通過 isRequired 關(guān)鍵字來強(qiáng)制組件某個(gè)參數(shù)必須傳入:

...
static propTypes = {
  comment: PropTypes.object.isRequired
}
...

那么會(huì)獲得一個(gè)更加友好的出錯(cuò)信息秘狞,查錯(cuò)會(huì)更方便:

[圖片上傳失敗...(image-12c395-1510227000171)]

React.js 提供的 PropTypes 提供了一些列的數(shù)據(jù)類型可以用來配置組件的參數(shù):

PropTypes.array
PropTypes.bool
PropTypes.func
PropTypes.number
PropTypes.object
PropTypes.string
PropTypes.node
PropTypes.element
...

更多類型及其用法可以參看官方文檔: Typechecking With PropTypes - React

組件參數(shù)驗(yàn)證在構(gòu)建大型的組件庫(kù)的時(shí)候相當(dāng)有用蹈集,可以幫助我們迅速定位這種類型錯(cuò)誤烁试,讓我們組件開發(fā)更加規(guī)范。另外也起到了一個(gè)說明文檔的作用拢肆,如果大家都約定都寫 propTypes 减响,那你在使用別人寫的組件的時(shí)候,只要看到組件的 propTypes 就清晰地知道這個(gè)組件到底能夠接受什么參數(shù)郭怪,什么參數(shù)是可選的支示,什么參數(shù)是必選的。

總結(jié)

通過 PropTypes 給組件的參數(shù)做類型限制鄙才,可以在幫助我們迅速定位錯(cuò)誤颂鸿,這在構(gòu)建大型應(yīng)用程序的時(shí)候特別有用;另外攒庵,給組件加上 propTypes嘴纺,也讓組件的開發(fā)、使用更加規(guī)范清晰浓冒。

這里建議大家寫組件的時(shí)候盡量都寫 propTypes颖医,有時(shí)候有點(diǎn)麻煩,但是是值得的裆蒸。

下一節(jié)中我們將介紹《React.js 小書 Lesson25 - 實(shí)戰(zhàn)分析:評(píng)論功能(四)》熔萧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市僚祷,隨后出現(xiàn)的幾起案子佛致,更是在濱河造成了極大的恐慌,老刑警劉巖辙谜,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俺榆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡装哆,警方通過查閱死者的電腦和手機(jī)罐脊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜕琴,“玉大人萍桌,你說我怎么就攤上這事×杓颍” “怎么了上炎?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)雏搂。 經(jīng)常有香客問我藕施,道長(zhǎng)寇损,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任裳食,我火速辦了婚禮矛市,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘诲祸。我一直安慰自己浊吏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布烦绳。 她就那樣靜靜地躺著,像睡著了一般配紫。 火紅的嫁衣襯著肌膚如雪径密。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天躺孝,我揣著相機(jī)與錄音享扔,去河邊找鬼。 笑死植袍,一個(gè)胖子當(dāng)著我的面吹牛惧眠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播于个,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼氛魁,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了厅篓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎窿吩,沒想到半個(gè)月后秽誊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡档押,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年澳盐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片令宿。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡叼耙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出粒没,到底是詐尸還是另有隱情旬蟋,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布革娄,位于F島的核電站倾贰,受9級(jí)特大地震影響冕碟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜匆浙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一安寺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧首尼,春花似錦挑庶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至查排,卻和暖如春凳枝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背跋核。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工岖瑰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人砂代。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓蹋订,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親刻伊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子露戒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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

  • 原教程內(nèi)容詳見精益 React 學(xué)習(xí)指南,這只是我在學(xué)習(xí)過程中的一些閱讀筆記捶箱,個(gè)人覺得該教程講解深入淺出玫锋,比目前大...
    leonaxiong閱讀 2,833評(píng)論 1 18
  • GUIDS 第一章 為什么使用React? React 一個(gè)提供了用戶接口的JavaScript庫(kù)讼呢。 誕生于Fac...
    jplyue閱讀 3,532評(píng)論 1 11
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,071評(píng)論 25 707
  • 深入JSX date:20170412筆記原文其實(shí)JSX是React.createElement(componen...
    gaoer1938閱讀 8,061評(píng)論 2 35
  • 同樣的工作撩鹿,在西安70/天,在蘭州65/天悦屏;同樣的工作节沦,西安市電腦打電話只管說話,在蘭州要人撥電話础爬,哎……瞬間感覺...
    lililililili閱讀 215評(píng)論 0 0