React進(jìn)階(二)

React 起源于 Facebook 的內(nèi)部項(xiàng)目,因?yàn)樵摴緦κ袌錾纤?JavaScript MVC 框架,都不滿意,就決定自己寫一套融欧,用來架設(shè) Instagram 的網(wǎng)站咏连。做出來以后盯孙,發(fā)現(xiàn)這套東西很好用,就在2013年5月開源了祟滴。


由于 React 的設(shè)計(jì)思想極其獨(dú)特振惰,屬于革命性創(chuàng)新,性能出眾垄懂,代碼邏輯卻非常簡單骑晶。所以,越來越多的人開始關(guān)注和使用草慧,認(rèn)為它可能是將來 Web 開發(fā)的主流工具桶蛔。

一、this.props.children詳解

this.props 對象的屬性與組件的屬性一一對應(yīng)漫谷,但是有一個(gè)例外仔雷,就是 this.props.children 屬性。它表示組件的所有子節(jié)點(diǎn)舔示。示例代碼如下:

<!DOCTYPE html>
<html>
  <head>
    <script src="../build/react.js"></script>
    <script src="../build/react-dom.js"></script>
    <script src="../build/browser.min.js"></script>
  </head>
  <body>
    <div id="example"></div>
    <script type="text/babel">
      var NotesList = React.createClass({
        render: function() {
          return (
            <ol>
              {
                React.Children.map(this.props.children, function (child) {
                  return <li>{child}</li>;
                })
              }
            </ol>
          );
        }
      });
      ReactDOM.render(
        <NotesList>
          <span>hello</span>
          <span>world</span>
        </NotesList>,
        document.getElementById('example')
      );
    </script>
  </body>
</html>

代碼運(yùn)行結(jié)果如下圖所示:

運(yùn)行結(jié)果顯示
var NotesList = React.createClass({
  render: function() {
    return (
      <ol>
      {
        React.Children.map(this.props.children, function (child) {
          return <li>{child}</li>;
        })
      }
      </ol>
    );
  }
});

ReactDOM.render(
  <NotesList>
    <span>hello</span>
    <span>world</span>
  </NotesList>,
  document.body
);

上面代碼的 NoteList 組件有兩個(gè) span 子節(jié)點(diǎn)碟婆,它們都可以通過 this.props.children 讀取。

注意:

this.props.children 的值有三種可能:如果當(dāng)前組件沒有子節(jié)點(diǎn)惕稻,它就是 undefined ;如果有一個(gè)子節(jié)點(diǎn)脑融,數(shù)據(jù)類型是 object;如果有多個(gè)子節(jié)點(diǎn)缩宜,數(shù)據(jù)類型就是 array。所以甥温,處理 this.props.children 的時(shí)候要小心锻煌。

React 提供一個(gè)工具方法 React.Children 來處理 this.props.children 。我們可以用 React.Children.map 來遍歷子節(jié)點(diǎn)姻蚓,而不用擔(dān)心 this.props.children 的數(shù)據(jù)類型是 undefined還是 object宋梧。更多的 React.Children 的方法,請參考官方文檔狰挡。

二捂龄、PropTypes

組件的屬性可以接受任意值,字符串加叁、對象倦沧、函數(shù)等等都可以。有時(shí)它匕,我們需要一種機(jī)制展融,驗(yàn)證別人使用組件時(shí),提供的參數(shù)是否符合要求豫柬。組件類的PropTypes屬性告希,就是用來驗(yàn)證組件實(shí)例的屬性是否符合要求扑浸,示例代碼如下:

<!DOCTYPE html>
<html>
  <head>
    <script src="../build/react.js"></script>
    <script src="../build/react-dom.js"></script>
    <script src="../build/browser.min.js"></script>
  </head>
  <body>
    <div id="example"></div>
    <script type="text/babel">
      var data = 123;
      var MyTitle = React.createClass({
        propTypes: {
          title: React.PropTypes.string.isRequired,
        },
        render: function() {
          return <h1> {this.props.title} </h1>;
        }
      });
      ReactDOM.render(
        <MyTitle title={data} />,
        document.getElementById('example')
      );
    </script>
  </body>
</html>

運(yùn)行結(jié)果顯示如下:

運(yùn)行結(jié)果顯示
var MyTitle = React.createClass({
  propTypes: {
    title: React.PropTypes.string.isRequired,
  },

  render: function() {
     return <h1> {this.props.title} </h1>;
   }
});

上面的Mytitle組件有一個(gè)title屬性。PropTypes 告訴 React燕偶,這個(gè) title 屬性是必須的喝噪,而且它的值必須是字符串。現(xiàn)在指么,我們設(shè)置 title 屬性的值是一個(gè)數(shù)值酝惧。

var data = 123;

ReactDOM.render(
  <MyTitle title={data} />,
  document.body
);

這樣一來,title屬性就通不過驗(yàn)證了涧尿∠捣睿控制臺會顯示一行錯(cuò)誤信息。

Warning: Failed propType: Invalid prop `title` of type `number` supplied to `MyTitle`, expected `string`.

如下圖所示:

錯(cuò)誤信息顯示

更多的PropTypes設(shè)置姑廉,可以查看官方文檔缺亮。此外,getDefaultProps方法可以用來設(shè)置組件屬性的默認(rèn)值桥言。示例代碼如下:

var MyTitle = React.createClass({
  getDefaultProps : function () {
    return {
      title : 'Hello World'
    };
  },

  render: function() {
     return <h1> {this.props.title} </h1>;
   }
});

ReactDOM.render(
  <MyTitle />,
  document.body
);

上面代碼會輸出"Hello World"萌踱。

學(xué)習(xí)是一件很快樂的事,這種快樂來自于你的思考号阿。完成一項(xiàng)學(xué)習(xí)任務(wù)固然重要并鸵,但更重要的是在完成的過程中學(xué)到了什么,掌握了什么扔涧,遇到一些什么問題园担,為什么會出現(xiàn)這種問題,根源是什么枯夜,都有哪些解決方案弯汰,什么樣的情況適合這個(gè)方案。只有在不斷的思考湖雹,你的能力才會有所提升咏闪!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市摔吏,隨后出現(xiàn)的幾起案子鸽嫂,更是在濱河造成了極大的恐慌,老刑警劉巖征讲,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件据某,死亡現(xiàn)場離奇詭異,居然都是意外死亡稳诚,警方通過查閱死者的電腦和手機(jī)哗脖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人才避,你說我怎么就攤上這事橱夭。” “怎么了桑逝?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵棘劣,是天一觀的道長。 經(jīng)常有香客問我楞遏,道長茬暇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任寡喝,我火速辦了婚禮糙俗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘预鬓。我一直安慰自己巧骚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布格二。 她就那樣靜靜地躺著劈彪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪顶猜。 梳的紋絲不亂的頭發(fā)上沧奴,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天,我揣著相機(jī)與錄音长窄,去河邊找鬼滔吠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛挠日,可吹牛的內(nèi)容都是我干的屠凶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼肆资,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了灶芝?” 一聲冷哼從身側(cè)響起郑原,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎夜涕,沒想到半個(gè)月后犯犁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡女器,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年酸役,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,567評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡涣澡,死狀恐怖贱呐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情入桂,我是刑警寧澤奄薇,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站抗愁,受9級特大地震影響馁蒂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蜘腌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一沫屡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧撮珠,春花似錦沮脖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至志于,卻和暖如春涮因,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伺绽。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工养泡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人奈应。 一個(gè)月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓澜掩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親杖挣。 傳聞我的和親對象是個(gè)殘疾皇子肩榕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評論 2 359

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

  • 現(xiàn)在最熱門的前端框架,毫無疑問是 React 惩妇。上周株汉,基于 React 的 React Native 發(fā)布,結(jié)果一...
    sakura_L閱讀 432評論 0 0
  • 原教程內(nèi)容詳見精益 React 學(xué)習(xí)指南歌殃,這只是我在學(xué)習(xí)過程中的一些閱讀筆記乔妈,個(gè)人覺得該教程講解深入淺出,比目前大...
    leonaxiong閱讀 2,843評論 1 18
  • JSX 知識準(zhǔn)備 JSX 并不是一門全新的語言氓皱,僅僅是一個(gè)語法糖路召,允許開發(fā)者在javascript中編寫XML語言...
    艾倫先生閱讀 4,513評論 4 20
  • 按照慣例勃刨,先給ReactJS背書 React是一個(gè)Facebook開發(fā)的UI庫,于2013年5月開源股淡,并迅速的從最...
    艾倫先生閱讀 3,238評論 1 12
  • 完全忘記要去做腹部呼吸了身隐,簡書也忘記寫了,定的鬧鐘都沒有起到作用揣非,一定要記得腹部呼吸抡医,加油加油加油。
    茜茜gaga閱讀 210評論 0 0