React入門-002

+++
Categories = ["React",]
Tags = ["React","入門",]
date = "2015-09-24T22:20:19+00:80"
titile = "React入門-002"

+++

1膳凝,PropTypes

組件的屬性可以接受任意值防泵,字符串、對象掉分、函數(shù)等等都可以百拓。
組件類的PropTypes屬性是用來驗證組件實例的屬性是否符合要求:

var MyTitle = React.createClass({
  propTypes: {
title: React.PropTypes.string.isRequired,
  },

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

var title = "hello";

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

getDefaultProps 方法可以用來設(shè)置組件屬性的默認值:

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

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

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

2渠鸽,獲取真實的DOM節(jié)點

組件并不是真實的 DOM 節(jié)點嫂粟,而是存在于內(nèi)存之中的一種數(shù)據(jù)結(jié)構(gòu)读虏,叫做虛擬 DOM (virtual DOM)责静。只有當它插入文檔以后,才會變成真實的 DOM 盖桥。根據(jù) React 的設(shè)計灾螃,所有的 DOM 變動,都先在虛擬 DOM 上發(fā)生揩徊,然后再將實際發(fā)生變動的部分腰鬼,反映在真實 DOM上,這種算法叫做 DOM diff 塑荒,它可以極大提高網(wǎng)頁的性能表現(xiàn)熄赡。
但是,有時需要從組件獲取真實 DOM 的節(jié)點齿税,這時就要用到 ref 屬性:

var MyComponent = React.createClass({
  handleClick: function() {
this.refs.myTextInput.focus();
  },
  render: function() {
return (
  <div>
<input type="text" ref="myTextInput" />
<input type="button" value="Focus the text input" onClick={this.handleClick} />
  </div>
);
  }
});

ReactDOM.render(
  <MyComponent />,
  document.getElementById('example')
);

組件 MyComponent 的子節(jié)點有一個文本輸入框彼硫,用于獲取用戶的輸入。這時就必須獲取真實的 DOM 節(jié)點凌箕,虛擬 DOM 是拿不到用戶輸入的拧篮。為了做到這一點,文本輸入框必須有一個 ref 屬性牵舱,然后 this.refs.[refName] 就會返回這個真實的 DOM 節(jié)點他托。
需要注意的是,由于 this.refs.[refName] 屬性獲取的是真實 DOM 仆葡,所以必須等到虛擬 DOM 插入文檔以后赏参,才能使用這個屬性,否則會報錯沿盅。上面代碼中把篓,通過為組件指定 Click 事件的回調(diào)函數(shù),確保了只有等到真實 DOM 發(fā)生 Click 事件之后腰涧,才會讀取 this.refs.[refName] 屬性韧掩。
React 組件支持很多事件,除了 Click 事件以外窖铡,還有 KeyDown 疗锐、Copy坊谁、Scroll 等;

3,this.state

React 的一大創(chuàng)新滑臊,就是將組件看成是一個狀態(tài)機口芍,一開始有一個初始狀態(tài),然后用戶互動雇卷,導(dǎo)致狀態(tài)變化鬓椭,從而觸發(fā)重新渲染 UI:

var LikeButton = React.createClass({
  getInitialState: function() {
return {liked: false};
  },
  handleClick: function(event) {
this.setState({liked: !this.state.liked});
  },
  render: function() {
var text = this.state.liked ? 'like' : 'haven\'t liked';
return (
  <p onClick={this.handleClick}>
You {text} this. Click to toggle.
  </p>
);
  }
});

ReactDOM.render(
  <LikeButton />,
  document.getElementById('example')
);

一個 LikeButton 組件,它的 getInitialState 方法用于定義初始狀態(tài)关划,也就是一個對象小染,這個對象可以通過 this.state 屬性讀取。當用戶點擊組件贮折,導(dǎo)致狀態(tài)變化裤翩,this.setState 方法就修改狀態(tài)值,每次修改以后调榄,自動調(diào)用 this.render 方法岛都,再次渲染組件。

this.props 表示那些一旦定義振峻,就不再改變的特性,而 this.state 是會隨著用戶互動而產(chǎn)生變化的特性;

4, 表單

用戶在表單填入的內(nèi)容择份,屬于用戶跟組件的互動扣孟,所以不能用 this.props 讀取:

var Input = React.createClass({
  getInitialState: function() {
return {value: 'Hello!'};
  },
  handleChange: function(event) {
this.setState({value: event.target.value});
  },
  render: function () {
var value = this.state.value;
return (
  <div>
<input type="text" value={value} onChange={this.handleChange} />
<p>{value}</p>
  </div>
);
  }
});

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

文本輸入框的值,不能用 this.props.value 讀取荣赶,而要定義一個 onChange 事件的回調(diào)函數(shù)凤价,通過 event.target.value 讀取用戶輸入的值。textarea 元素拔创、select元素利诺、radio元素都屬于這種情況;

5,組件的生命周期

組件的生命周期分成三個狀態(tài):

* Mounting:已插入真實 DOM
* Updating:正在被重新渲染
* Unmounting:已移出真實 DOM

React 為每個狀態(tài)都提供了兩種處理函數(shù)剩燥,will 函數(shù)在進入狀態(tài)之前調(diào)用慢逾,did 函數(shù)在進入狀態(tài)之后調(diào)用,三種狀態(tài)共計五種處理函數(shù):

- componentWillMount()
- componentDidMount()
- componentWillUpdate(object nextProps, object nextState)
- componentDidUpdate(object prevProps, object prevState)
- componentWillUnmount()

此外灭红,React 還提供兩種特殊狀態(tài)的處理函數(shù):

- componentWillReceiveProps(object nextProps):已加載組件收到新的參數(shù)時調(diào)用
- shouldComponentUpdate(object nextProps, object nextState):組件判斷是否重新渲染時調(diào)用

例子:

var Hello = React.createClass({
  getInitialState: function () {
return {
  opacity: 1.0
};
  },

  componentDidMount: function () {
this.timer = setInterval(function () {
  var opacity = this.state.opacity;
  opacity -= .05;
  if (opacity < 0.1) {
opacity = 1.0;
  }
  this.setState({
opacity: opacity
  });
}.bind(this), 100);
  },

  render: function () {
return (
  <div style={{opacity: this.state.opacity}}>
Hello {this.props.name}
  </div>
);
  }
});

ReactDOM.render(
  <Hello name="world"/>,
  document.body
);

組件的style屬性的設(shè)置方式侣滩,這是因為 React 組件樣式是一個對象,所以第一重大括號表示這是 JavaScript 語法变擒,第二重大括號表示樣式對象君珠。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市娇斑,隨后出現(xiàn)的幾起案子策添,更是在濱河造成了極大的恐慌材部,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唯竹,死亡現(xiàn)場離奇詭異乐导,居然都是意外死亡,警方通過查閱死者的電腦和手機摩窃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門兽叮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人猾愿,你說我怎么就攤上這事鹦聪。” “怎么了蒂秘?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵泽本,是天一觀的道長。 經(jīng)常有香客問我姻僧,道長规丽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任撇贺,我火速辦了婚禮赌莺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘松嘶。我一直安慰自己艘狭,他們只是感情好,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布翠订。 她就那樣靜靜地躺著巢音,像睡著了一般。 火紅的嫁衣襯著肌膚如雪尽超。 梳的紋絲不亂的頭發(fā)上官撼,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音似谁,去河邊找鬼傲绣。 笑死,一個胖子當著我的面吹牛巩踏,可吹牛的內(nèi)容都是我干的斜筐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蛀缝,長吁一口氣:“原來是場噩夢啊……” “哼顷链!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起屈梁,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嗤练,失蹤者是張志新(化名)和其女友劉穎榛了,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體煞抬,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡霜大,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了革答。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片战坤。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖残拐,靈堂內(nèi)的尸體忽然破棺而出途茫,到底是詐尸還是另有隱情,我是刑警寧澤溪食,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布囊卜,位于F島的核電站,受9級特大地震影響错沃,放射性物質(zhì)發(fā)生泄漏栅组。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一枢析、第九天 我趴在偏房一處隱蔽的房頂上張望玉掸。 院中可真熱鬧,春花似錦醒叁、人聲如沸司浪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至脱吱,卻和暖如春智政,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背箱蝠。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工续捂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宦搬。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓牙瓢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親间校。 傳聞我的和親對象是個殘疾皇子矾克,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

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

  • HTML模版 之后出現(xiàn)的React代碼嵌套入模版中。 1. Hello world 這段代碼將一個一級標題插入到指...
    ryanho84閱讀 6,235評論 0 9
  • 現(xiàn)在最熱門的前端框架憔足,毫無疑問是React胁附。在基于React的React Native發(fā)布一天之內(nèi)酒繁,就獲得了 50...
    Mycro閱讀 1,013評論 3 6
  • 作者:阮一峰原文地址:http://www.ruanyifeng.com/blog/2015/03/react.h...
    IT程序獅閱讀 1,094評論 0 16
  • 之前不常寫作,偶爾寫東西也是記錄日晨仄蓿瑣事和心緒變動州袒,不在意表達的精準和邏輯的順暢,碩士畢業(yè)論文又是非常具體...
    管豹閱讀 363評論 0 0
  • 今天是9月10日教師節(jié)弓候,是所有老師們的節(jié)日郎哭,所以我祝福老師們身體健康,每天都快快樂樂的菇存。 從一年級到四年級夸研,有不少...
    祁魯閱讀 118評論 0 0