React讀書筆記-組件

本文僅作為個(gè)人學(xué)習(xí)React的筆記默责,文中省略了基礎(chǔ)的知識(shí)點(diǎn)和術(shù)語(yǔ)何暇。在閱讀本文前但壮,默認(rèn)已經(jīng)準(zhǔn)備好了React的運(yùn)行環(huán)境冀泻。

本文重點(diǎn)記錄React的組件部分,且不使用ES6的特性蜡饵。

如何創(chuàng)建一個(gè)組件弹渔?

創(chuàng)建一個(gè)組件使用React.createClass(object)方法,作為組件溯祸,該方法返回的變量名稱必須以大寫字母開頭肢专。

示例:

var HelloMessage = React.createClass({
  render: function() {
    return <h1>Hello Message!</h1>;
  }
});

在React.createClass參數(shù)必須是一個(gè)JS對(duì)象,其必須實(shí)現(xiàn)一個(gè)名為render方法焦辅,該方法的返回值是一個(gè)只包含一個(gè)根節(jié)點(diǎn)的Dom對(duì)象(可以包含自定義組件)博杖。

組件的屬性 props

組件的屬性可以使用this.props來(lái)獲取,該屬性值來(lái)源于組件調(diào)用時(shí)的定義筷登,屬性在定義后就不能被修改剃根,除非重新生成組件。

屬性定義示例:

ReactDOM.render(
  <HelloMessage name="zsea.Message" />,
  document.getElementById('example')
);

其中前方,組件包含名稱為name屬性狈醉,可以能過(guò)this.props.name來(lái)獲取。

特殊屬性:props.children

該屬性為組件的子對(duì)象惠险,若子對(duì)象只有一個(gè)舔糖,該值為一個(gè)JS對(duì)象,若有多個(gè)莺匠,則為JS數(shù)組金吗。當(dāng)為JS數(shù)組時(shí),呈現(xiàn)的子對(duì)象必須包含key屬性。
為了簡(jiǎn)化操作摇庙,React提供了方法React.Children.map(children,function(){})用于遍歷子對(duì)象旱物,使用該方法遍歷時(shí),不需要區(qū)分是JS數(shù)組還是JS對(duì)象卫袒。

示例:

var NotesList = React.createClass({
  render: function() {
    return (
      <ol>
      {
        React.Children.map(this.props.children, function (child,_index) {
          return <li key={_index}>{child}</li>;
        })
      }
      </ol>
    );
  }
});
ReactDOM.render(
  <NotesList>
    <span>hello</span>
    <span>world</span>
  </NotesList>,
  document.body
);

屬性驗(yàn)證 PropTypes

為保證組件被正確使用宵呛,React引入了propTypes,用于對(duì)屬性進(jìn)行校驗(yàn)夕凝,同時(shí)宝穗,React.PropTypes提供了大量的驗(yàn)證器來(lái)驗(yàn)證傳入數(shù)據(jù)的有效性。當(dāng)向 props 傳入無(wú)效數(shù)據(jù)時(shí)码秉,JavaScript 控制臺(tái)會(huì)拋出警告逮矛。為了性能考慮,建議只在開發(fā)環(huán)境驗(yàn)證 propTypes转砖。

下面用例子來(lái)說(shuō)明不同驗(yàn)證器的區(qū)別:

React.createClass({
  propTypes: {
    // 可以聲明 prop 為指定的 JS 基本類型须鼎。默認(rèn)
    // 情況下,這些 prop 都是可傳可不傳的府蔗。
    optionalArray: React.PropTypes.array,
    optionalBool: React.PropTypes.bool,
    optionalFunc: React.PropTypes.func,
    optionalNumber: React.PropTypes.number,
    optionalObject: React.PropTypes.object,
    optionalString: React.PropTypes.string,
    optionalSymbol: React.PropTypes.symbol,

    // 所有可以被渲染的對(duì)象:數(shù)字晋控,
    // 字符串,DOM 元素或包含這些類型的數(shù)組(or fragment) 姓赤。
    optionalNode: React.PropTypes.node,

    // React 元素
    optionalElement: React.PropTypes.element,

    // 你同樣可以斷言一個(gè) prop 是一個(gè)類的實(shí)例赡译。
    // 用 JS 的 instanceof 操作符聲明 prop 為類的實(shí)例。
    optionalMessage: React.PropTypes.instanceOf(Message),

    // 你可以用 enum 的方式
    // 確保你的 prop 被限定為指定值不铆。
    optionalEnum: React.PropTypes.oneOf(['News', 'Photos']),

    // 指定的多個(gè)對(duì)象類型中的一個(gè)
    optionalUnion: React.PropTypes.oneOfType([
      React.PropTypes.string,
      React.PropTypes.number,
      React.PropTypes.instanceOf(Message)
    ]),

    // 指定類型組成的數(shù)組
    optionalArrayOf: React.PropTypes.arrayOf(React.PropTypes.number),

    // 指定類型的屬性構(gòu)成的對(duì)象
    optionalObjectOf: React.PropTypes.objectOf(React.PropTypes.number),

    // 特定形狀參數(shù)的對(duì)象
    optionalObjectWithShape: React.PropTypes.shape({
      color: React.PropTypes.string,
      fontSize: React.PropTypes.number
    }),

    // 你可以在任意東西后面加上 `isRequired`
    // 來(lái)確保 如果 prop 沒(méi)有提供 就會(huì)顯示一個(gè)警告蝌焚。
    requiredFunc: React.PropTypes.func.isRequired,

    // 不可空的任意類型
    requiredAny: React.PropTypes.any.isRequired,

    // 你可以自定義一個(gè)驗(yàn)證器。如果驗(yàn)證失敗需要返回一個(gè) Error 對(duì)象狂男。
    // 不要直接使用 `console.warn` 或拋異常综看,
    // 因?yàn)檫@在 `oneOfType` 里不起作用品腹。
    customProp: function(props, propName, componentName) {
      if (!/matchme/.test(props[propName])) {
        return new Error('Validation failed!');
      }
    }
  },
  /* ... */
});

React也提供了針對(duì)子對(duì)象的驗(yàn)證器

React.PropTypes.element 你可以指定僅有一個(gè)子級(jí)能被傳送給組件岖食。

var MyComponent = React.createClass({
  propTypes: {
    children: React.PropTypes.element.isRequired
  },
  render: function() {
    return (
      <div>
        {this.props.children} // 這里必須是一個(gè)元素否則就會(huì)警告
      </div>
    );
  }
});

默認(rèn)屬性 getDefaultProps

當(dāng)父級(jí)沒(méi)有傳入 props 時(shí),getDefaultProps() 可以保證 this.props.value 有默認(rèn)值舞吭,注意 getDefaultProps 的結(jié)果會(huì)被緩存泡垃。得益于此,你可以直接使用 props羡鸥,而不必寫手動(dòng)編寫一些重復(fù)或無(wú)意義的代碼蔑穴。
該接口要求返回一個(gè)JS對(duì)象。

示例:

var ComponentWithDefaultProps = React.createClass({
  getDefaultProps: function() {
    return {
      value: 'default value'
    };
  }
});

組件的狀態(tài) state

組件的屬性在被定義后惧浴,是不允放被修改的存和。但是,React同時(shí)也提供了組件的狀態(tài),狀態(tài)是允許被在內(nèi)部修改的捐腿。
獲取組件狀態(tài)使用this.state纵朋,this.state是一個(gè)JS對(duì)象。

示例:

var HelloMessage = React.createClass({
  render: function() {
    return <h1>Hello Message {this.state.time}!</h1>;
  }
});

其中茄袖,time為組件的一個(gè)狀態(tài)操软。

狀態(tài)的修改 setState

在語(yǔ)言層面,我們可以直接使用'='來(lái)修改組件的狀態(tài)(this.state)宪祥,但是聂薪,這種方法的修改并不能使組件觸發(fā)render,修改后的狀態(tài)并不能反映在WEB界面上蝗羊。
Reace為我們提供了統(tǒng)一的狀態(tài)修改方法:this.setState(state)藏澳,參數(shù)state是一個(gè)JS對(duì)象,其中只需要標(biāo)識(shí)需要被修改的對(duì)象肘交,而this.state中已經(jīng)存在的非同名對(duì)象不會(huì)被覆蓋笆载。該方法僅能在組件內(nèi)部調(diào)用。

初始狀態(tài) getInitialState

狀態(tài)是由組件內(nèi)部進(jìn)行控制涯呻,在沒(méi)有任何方法調(diào)用前凉驻,React提供了一個(gè)接口用于組件狀態(tài)的初始化:getInitialState,該接口要求返回一個(gè)JS對(duì)象复罐。

示例:

var HelloMessage = React.createClass({
  getInitialState:function(){
      return {time:'2016-12-23'};
  },
  render: function() {
    return <h1>Hello Message {this.state.time}!</h1>;
  }
});

在getInitialState接口中涝登,可以使用組件的屬性值做為組件的狀態(tài)。

示例:

var HelloMessage = React.createClass({
  getInitialState:function(){
      return {time:this.props.time};//time屬性作為組件的time的狀態(tài)值
  },
  render: function() {
    return <h1>Hello Message {this.state.time}!</h1>;
  }
});

總結(jié)

一個(gè)React組件效诅,提供了兩個(gè)接口胀滚、一個(gè)方法、三個(gè)對(duì)象乱投。

兩個(gè)接口

  • render
  • getInitialState

其中render用于組件的呈現(xiàn)咽笼,在調(diào)用方法this.setState(state)時(shí)會(huì)被自動(dòng)調(diào)用。getInitialState用于返回組件內(nèi)部的初始狀態(tài)戚炫,可以使用屬性值作為組件狀態(tài)剑刑。

一個(gè)方法

  • setState(state)

該方法用于重新設(shè)置組件的狀態(tài)值,并且根據(jù)需要觸發(fā)render双肤。

三個(gè)對(duì)象

  • state
  • props
  • propTypes

其中state存儲(chǔ)的組件狀態(tài)施掏,可以能過(guò)setState進(jìn)行修改;

props存儲(chǔ)的組件屬性茅糜,不能被修改七芭;同時(shí),props包含一個(gè)特列對(duì)象:props.children蔑赘,該對(duì)象中包含的時(shí)子對(duì)象狸驳。

propTypes為一個(gè)JS對(duì)象预明,該對(duì)象用于校驗(yàn)組件的屬性是否正在確。

參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末耙箍,一起剝皮案震驚了整個(gè)濱河市贮庞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌究西,老刑警劉巖窗慎,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異卤材,居然都是意外死亡遮斥,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門扇丛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)术吗,“玉大人,你說(shuō)我怎么就攤上這事帆精〗嫌欤” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵卓练,是天一觀的道長(zhǎng)隘蝎。 經(jīng)常有香客問(wèn)我,道長(zhǎng)襟企,這世上最難降的妖魔是什么嘱么? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮顽悼,結(jié)果婚禮上曼振,老公的妹妹穿的比我還像新娘。我一直安慰自己蔚龙,他們只是感情好冰评,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著木羹,像睡著了一般甲雅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上汇跨,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天务荆,我揣著相機(jī)與錄音妆距,去河邊找鬼穷遂。 笑死,一個(gè)胖子當(dāng)著我的面吹牛娱据,可吹牛的內(nèi)容都是我干的蚪黑。 我是一名探鬼主播盅惜,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼忌穿!你這毒婦竟也來(lái)了抒寂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤掠剑,失蹤者是張志新(化名)和其女友劉穎屈芜,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體朴译,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡井佑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了眠寿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片躬翁。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖盯拱,靈堂內(nèi)的尸體忽然破棺而出盒发,到底是詐尸還是另有隱情,我是刑警寧澤狡逢,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布宁舰,位于F島的核電站,受9級(jí)特大地震影響奢浑,放射性物質(zhì)發(fā)生泄漏明吩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一殷费、第九天 我趴在偏房一處隱蔽的房頂上張望印荔。 院中可真熱鬧,春花似錦详羡、人聲如沸仍律。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)水泉。三九已至,卻和暖如春窒盐,著一層夾襖步出監(jiān)牢的瞬間草则,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工蟹漓, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炕横,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓葡粒,卻偏偏與公主長(zhǎng)得像份殿,于是被迫代替她去往敵國(guó)和親膜钓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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

  • 原教程內(nèi)容詳見精益 React 學(xué)習(xí)指南卿嘲,這只是我在學(xué)習(xí)過(guò)程中的一些閱讀筆記颂斜,個(gè)人覺得該教程講解深入淺出,比目前大...
    leonaxiong閱讀 2,833評(píng)論 1 18
  • 目前拾枣,react組件有三種寫法沃疮,分別是es5的createClass寫法,es6的class寫法梅肤,以及statel...
    ZoomFunc閱讀 1,647評(píng)論 0 1
  • 深入JSX date:20170412筆記原文其實(shí)JSX是React.createElement(componen...
    gaoer1938閱讀 8,061評(píng)論 2 35
  • 自己最近的項(xiàng)目是基于react的忿磅,于是讀了一遍react的文檔,做了一些記錄(除了REFERENCE部分還沒(méi)開始讀...
    潘逸飛閱讀 3,373評(píng)論 1 10
  • 文/鴻運(yùn) 我是一片浮云 漂浮在天地萬(wàn)物之間 隨季節(jié)的變遷 去抒發(fā)自己的情感 春風(fēng)化雨 我便滋潤(rùn)萬(wàn)物的心田 去萌發(fā)它...
    HONGYUNDANGTOU閱讀 545評(píng)論 21 16