react官網(wǎng)閱讀筆記

React react支持IE9+

組建的生命周期

react組件生命周期圖例

掛載

  • getInitialState es5中使用的初始化狀態(tài)componentWillMount() - 組件實(shí)例即將掛接(初次渲染)時(shí)被調(diào)用佑吝,這個(gè)方法在整個(gè)生命周期中只會(huì)被調(diào)用一次芥丧。

render()-這里說(shuō)一下,組件的中render函數(shù)返回的是支撐實(shí)例(vercialDOM)氛赐,reactDOM.render()返回組件的支撐實(shí)例(backing instance)——組建的描述筷登。無(wú)狀態(tài)組件沒(méi)有支撐實(shí)例返回null剃根。

  • componentDidMount() - 組件實(shí)例掛接(初次渲染)后被調(diào)用 ,這個(gè)方法在整個(gè)生命周期中只會(huì)被調(diào)用一次前方。
    更新
  • componentWillReceiveProps(nextProps) - 組件實(shí)例即將設(shè)置新屬性時(shí)被調(diào)用狈醉,參數(shù)nextProps表示即將應(yīng)用到組件實(shí)例上的新屬性值。這個(gè)方法在初次渲染時(shí)不會(huì)被調(diào)用惠险。在此方法內(nèi)調(diào)用setState()不會(huì)引起重新渲染苗傅。
  • shouldComponentUpdate(nextProps, nextState) - 組件實(shí)例即將重新渲染時(shí)被調(diào)用,參數(shù)nextProps傳入即將應(yīng)用到組件實(shí)例上的新屬性值班巩,參數(shù)nextState傳入組件實(shí)例即將被設(shè)置的狀態(tài)值渣慕。如果這個(gè)方法返回false,那么組件實(shí)例就不會(huì)被重新渲染趣竣。除非我們明確地 知道摇庙,新的屬性和狀態(tài)不需要進(jìn)行重新渲染,否則這個(gè)方法都應(yīng)該返回true遥缕。這個(gè)方法在初次渲染時(shí)或通過(guò)forceUpdate()方法進(jìn)行渲染時(shí)不會(huì)被調(diào)用卫袒。
  • componentWillUpdate(nextProps, nextState) - 組件實(shí)例即將重新渲染時(shí)被調(diào)用 這個(gè)方法在初次渲染時(shí)不會(huì)被調(diào)用。注意:不能在此方法內(nèi)調(diào)用setState()单匣。
    銷毀
  • componentDidUpdate(prevProps, prevState) - 組件實(shí)例重新渲染后被調(diào)用夕凝,這個(gè)方法在初次渲染時(shí)不會(huì)被調(diào)用宝穗。銷毀componentWillUnmount() - 組件實(shí)例即將從DOM樹移除時(shí)被調(diào)用,這個(gè)方法在整個(gè)生命周期中只會(huì)被調(diào)用一次码秉。
    可調(diào)用的方法
    component.forceUpdate()-在任何生命周期階段調(diào)用逮矛,當(dāng)你知道一些底層方面組件狀態(tài)的改動(dòng)且不適用于this.setState的時(shí)候。

state 與 props使用場(chǎng)景

  • 事件處理后值發(fā)生變化反映到UI界面上變化的转砖,使用state
  • 使用props作為唯一的數(shù)據(jù)來(lái)源
  • 減少把props的值賦值給state
  • 把對(duì)于state 和 props 計(jì)算用于展示的邏輯放在render中

es6 寫法不同于 es5的地方以及最佳實(shí)踐

//es6寫法
export class Counter extends React.Component { constructor(props) { super(props); this.state = {count: props.initialCount}; this.tick = this.tick.bind(this); } tick() { this.setState({count: this.state.count + 1}); } render() { return ( <div onClick={this.tick}> Clicks: {this.state.count} </div> ); }}Counter.propTypes = { initialCount: React.PropTypes.number };Counter.defaultProps = { initialCount: 0 };
  • 沒(méi)有g(shù)etIntialState 方法须鼎,state的初始化在構(gòu)造函數(shù)中進(jìn)行
  • propTypes 與defaultProps被定義為屬性
  • 沒(méi)有為事件自動(dòng)綁定,需要如下手動(dòng)綁定或使用箭頭函數(shù)綁定
// You can use bind() to preserve `this`<div onClick={this.tick.bind(this)}>// Or you can use arrow functions<div onClick={() => this.tick()}>

最佳實(shí)踐在這里

···
constructor(props) { super(props); this.state = {count: props.initialCount}; this.tick = this.tick.bind(this);}···<div onClick={this.tick}>
  • 不再支持mixin+ 無(wú)狀態(tài)組件寫法

盡可能使用無(wú)狀態(tài)組件寫法府蔗,盡管他不能通過(guò)ref引用到

JSX 中使用

...
傳遞列出當(dāng)前使用不需要繼續(xù)傳遞下去的

javascript render(){ var {checked, ...other} = this.props; fancyClass = checked ? 'FancyCheckd' : 'FancyUnchecked'; return(<div {...other} className={fancyClass}</div>)  }

checkboxes 與 Radio 潛在問(wèn)題

Be aware that, in an attempt to normalize change handling for checkbox and radio inputs, React uses a click event in place of a change event. For the most part this behaves as expected, except when calling preventDefault in a change handler. preventDefault stops the browser from visually updating the input, even if checked gets toggled. This can be worked around either by removing the call to preventDefault, or putting the toggle of checked in a setTimeout.

ref

ref —— 回調(diào)屬性當(dāng)組件創(chuàng)建完成后晋控,ref回調(diào)會(huì)被立即執(zhí)行。對(duì)應(yīng)的元素會(huì)作為參數(shù)傳入函數(shù)中姓赤,回調(diào)函數(shù)可以立即使用參數(shù)赡译,也可以將它保存起來(lái)。

render: function() { return <TextInput ref={(c) => this._input = c} />; }, componentDidMount: function() { this._input.focus(); },

如果ref綁定的元素是原生組件不铆,返回的是支撐實(shí)例蝌焚,如果是自定義組件,返回的是該組件的實(shí)例誓斥,可以調(diào)用該組件暴露的方法只洒。如果使用行內(nèi)函數(shù)表達(dá)式的方式寫的refs,react在組件更新的之后岖食,把它看作為不同的函數(shù)對(duì)象红碑,回調(diào)函數(shù)會(huì)被傳入null執(zhí)行。ref ——字符串屬性現(xiàn)階段被兼容處理泡垃,未來(lái)會(huì)被移除析珊,回調(diào)方式是被推薦的,(于是不看了)蔑穴。一個(gè)復(fù)雜的例子

MyComponent = React.createClass({ handleClick: function() { // Explicitly focus the text input using the raw DOM API. if (this.myTextInput !== null) { this.myTextInput.focus(); } }, render: function() { // The ref attribute is a callback that saves a reference to the // component to this.myTextInput when the component is mounted. return ( <div> <input type="text" ref={(ref) => this.myTextInput = ref} /> <input type="button" value="Focus the text input" onClick={this.handleClick} /> </div> ); }});ReactDOM.render( <MyComponent />, document.getElementById('example'));

例子中忠寻,我們或得支撐實(shí)例的引用,當(dāng)button點(diǎn)擊的時(shí)候input被focus存和。
小結(jié)
當(dāng)在使用常規(guī)數(shù)據(jù)流(改變子組件props)不方便的情況下奕剃,ref是一種很好的傳送信息給組件實(shí)例的方式。默認(rèn)情況下捐腿,使用react數(shù)據(jù)流保存ref備用纵朋。

便利
  • 子組件中定義的public方法,可以通過(guò)ref的方式被外部組件調(diào)用茄袖。(能使用數(shù)據(jù)流方式還是使用數(shù)據(jù)流方式操软,因?yàn)檫@樣更加清晰)
  • 對(duì)于測(cè)量dom節(jié)點(diǎn)樣式,這是唯一適用方法宪祥。
  • 當(dāng)內(nèi)容被銷毀聂薪,ref的引用一同被銷毀家乘,這里無(wú)須擔(dān)心銷毀的問(wèn)題。

注意:
永遠(yuǎn)不要再render方法中引用
第二條是關(guān)于字符串方式引用的不看了……
無(wú)狀態(tài)組件中不能使用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末藏澳,一起剝皮案震驚了整個(gè)濱河市仁锯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌翔悠,老刑警劉巖业崖,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蓄愁,居然都是意外死亡腻要,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門涝登,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人效诅,你說(shuō)我怎么就攤上這事胀滚。” “怎么了乱投?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵咽笼,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我戚炫,道長(zhǎng)剑刑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任双肤,我火速辦了婚禮施掏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘茅糜。我一直安慰自己七芭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布蔑赘。 她就那樣靜靜地躺著狸驳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缩赛。 梳的紋絲不亂的頭發(fā)上耙箍,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音酥馍,去河邊找鬼辩昆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛物喷,可吹牛的內(nèi)容都是我干的卤材。 我是一名探鬼主播遮斥,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼扇丛!你這毒婦竟也來(lái)了术吗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤帆精,失蹤者是張志新(化名)和其女友劉穎较屿,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卓练,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡隘蝎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了襟企。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嘱么。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖顽悼,靈堂內(nèi)的尸體忽然破棺而出曼振,到底是詐尸還是另有隱情,我是刑警寧澤蔚龙,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布冰评,位于F島的核電站,受9級(jí)特大地震影響木羹,放射性物質(zhì)發(fā)生泄漏甲雅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一坑填、第九天 我趴在偏房一處隱蔽的房頂上張望抛人。 院中可真熱鬧,春花似錦穷遂、人聲如沸函匕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)盅惜。三九已至,卻和暖如春忌穿,著一層夾襖步出監(jiān)牢的瞬間抒寂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工掠剑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留屈芜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像井佑,于是被迫代替她去往敵國(guó)和親属铁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

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

  • 深入JSX date:20170412筆記原文其實(shí)JSX是React.createElement(componen...
    gaoer1938閱讀 8,051評(píng)論 2 35
  • It's a common pattern in React to wrap a component in an ...
    jplyue閱讀 3,260評(píng)論 0 2
  • 原教程內(nèi)容詳見精益 React 學(xué)習(xí)指南躬翁,這只是我在學(xué)習(xí)過(guò)程中的一些閱讀筆記焦蘑,個(gè)人覺(jué)得該教程講解深入淺出,比目前大...
    leonaxiong閱讀 2,813評(píng)論 1 18
  • react 基本概念解析 react 的組件聲明周期 react 高階組件盒发,context, redux 等高級(jí)...
    南航閱讀 1,057評(píng)論 0 1
  • 有時(shí)候例嘱,我們會(huì)碰到這樣一個(gè)情況,自己的想要做一件事情宁舰,但是周圍的環(huán)境給你的行動(dòng)帶來(lái)了阻力拼卵,更多的可能是人的因素,你...
    馬不理饅頭閱讀 612評(píng)論 0 2