React學(xué)習(xí)筆記

寫在前面

React入門學(xué)習(xí)筆記。

教程可參考:
React 教程 | 菜鳥(niǎo)教程
阮一峰的網(wǎng)絡(luò)日志 > React 入門實(shí)例教程

自己用React寫了一個(gè)to-do-list的小demo:
react-todolist

歡迎評(píng)論指出問(wèn)題败砂,一起學(xué)習(xí)昌犹。

01 React簡(jiǎn)介

React 是一個(gè)用于構(gòu)建用戶界面的 JAVASCRIPT 庫(kù)。

React主要用于構(gòu)建UI鸿竖,很多人認(rèn)為 React 是 MVC 中的 V(視圖)铸敏。

React 起源于 Facebook 的內(nèi)部項(xiàng)目杈笔,用來(lái)架設(shè) Instagram 的網(wǎng)站,并于 2013 年 5 月開(kāi)源球榆。

React 擁有較高的性能禁筏,代碼邏輯非常簡(jiǎn)單篱昔,越來(lái)越多的人已開(kāi)始關(guān)注和使用它。

02 React特點(diǎn)

  1. 聲明式設(shè)計(jì) ?React采用聲明范式舀射,可以輕松描述應(yīng)用脆烟。

  2. 高效 ?React通過(guò)對(duì)DOM的模擬房待,最大限度地減少與DOM的交互。

  3. 靈活 ?React可以與已知的庫(kù)或框架很好地配合拜鹤。

  4. JSX ? JSX 是 JavaScript 語(yǔ)法的擴(kuò)展敏簿。React 開(kāi)發(fā)不一定使用 JSX ,但我們建議使用它温数。

  5. 組件 ? 通過(guò) React 構(gòu)建組件蜻势,使得代碼更加容易得到復(fù)用握玛,能夠很好的應(yīng)用在大項(xiàng)目的開(kāi)發(fā)中。

  6. 單向響應(yīng)的數(shù)據(jù)流 ? React 實(shí)現(xiàn)了單向響應(yīng)的數(shù)據(jù)流冕屯,從而減少了重復(fù)代碼愕撰,這也是它為什么比傳統(tǒng)數(shù)據(jù)綁定更簡(jiǎn)單醋寝。

03 React安裝與使用

實(shí)例中我們引入了三個(gè)庫(kù): react.min.js 音羞、react-dom.min.js 和 babel.min.js:

  1. react.min.js - React 的核心庫(kù)

  2. react-dom.min.js - 提供與 DOM 相關(guān)的功能

  3. babel.min.js - Babel 可以將 ES6 代碼轉(zhuǎn)為 ES5 代碼仓犬,這樣我們就能在目前不支持 ES6 瀏覽器上執(zhí)行 React 代碼搀继。Babel 內(nèi)嵌了對(duì) JSX 的支持。通過(guò)將 Babel 和 babel-sublime 包(package)一同使用可以讓源碼的語(yǔ)法渲染上升到一個(gè)全新的水平财边。

也可以用npm來(lái)安裝并創(chuàng)建項(xiàng)目:

$ cnpm install -g create-react-app
$ create-react-app my-app
$ cd my-app/
$ npm start

04 React JSX

簡(jiǎn)介

React 使用 JSX 來(lái)替代常規(guī)的 JavaScript酣难。

JSX 是一個(gè)看起來(lái)很像 XML 的 JavaScript 語(yǔ)法擴(kuò)展黑滴。

我們不需要一定使用 JSX袁辈,但它有以下優(yōu)點(diǎn):

  1. JSX 執(zhí)行更快,因?yàn)樗诰幾g為 JavaScript 代碼后進(jìn)行了優(yōu)化尾膊。
  2. 它是類型安全的,在編譯過(guò)程中就能發(fā)現(xiàn)錯(cuò)誤济舆。
  3. 使用 JSX 編寫模板更加簡(jiǎn)單快速莺债。

使用JSX

JSX 看起來(lái)類似 HTML 齐邦,我們可以看下實(shí)例:

ReactDOM.render(
    <h1>Hello, world!</h1>,
    document.getElementById('example')
);

我們可以在以上代碼中嵌套多個(gè) HTML 標(biāo)簽,需要使用一個(gè) div 元素包裹它我纪,實(shí)例中的 p 元素添加了自定義屬性 data-myattribute浅悉,添加自定義屬性需要使用 data- 前綴券犁。

JSX可以放在一個(gè)獨(dú)立文件中粘衬,在HTML文件中引入JSX時(shí)需要將type="text/babel"。

在JSX中使用javascript表達(dá)式

我們可以在 JSX 中使用 JavaScript 表達(dá)式勘伺。表達(dá)式寫在花括號(hào) {} 中褂删。實(shí)例如下:

ReactDOM.render(
    <div>
        <h1>{1+1}</h1>
    </div>
    document.getElementById('example')
);

不能使用if語(yǔ)句飞醉,可以用三元表達(dá)式代替。

React內(nèi)聯(lián)樣式

React推薦使用內(nèi)聯(lián)樣式笤妙,使用駝峰寫法冒掌,自動(dòng)補(bǔ)全px。

var myStyle = {
    fontSize: 100,
    color: '#FF0000'
};
ReactDOM.render(
    <h1 style = {myStyle}>菜鳥(niǎo)教程</h1>,
    document.getElementById('example')
);

其他

標(biāo)簽內(nèi)部的注釋需要花括號(hào)蹲盘。

允許在模板中插入數(shù)組股毫。

React 的 JSX 使用大、小寫的約定來(lái)區(qū)分本地組件的類和 HTML 標(biāo)簽召衔。

05 React組件

注意铃诬,原生 HTML 元素名以小寫字母開(kāi)頭,而自定義的 React 類名以大寫字母開(kāi)頭趣席,比如 HelloMessage 不能寫成 helloMessage兵志。除此之外還需要注意組件類只能包含一個(gè)頂層標(biāo)簽,否則也會(huì)報(bào)錯(cuò)宣肚。

var HelloMessage = React.createClass({
  render: function() {
    return <h1>Hello World想罕!</h1>;
  }
});
 
ReactDOM.render(
  <HelloMessage />,
  document.getElementById('example')
);

如果我們需要向組件傳遞參數(shù),可以使用 this.props 對(duì)象霉涨。

注意按价,在添加屬性時(shí), class 屬性需要寫成 className 笙瑟,for 屬性需要寫成 htmlFor 楼镐,這是因?yàn)?class 和 for 是 JavaScript 的保留字。

06 React State

React 把組件看成是一個(gè)狀態(tài)機(jī)(State Machines)往枷。通過(guò)與用戶的交互框产,實(shí)現(xiàn)不同狀態(tài),然后渲染 UI错洁,讓用戶界面和數(shù)據(jù)保持一致秉宿。

React 里,只需更新組件的 state墓臭,然后根據(jù)新的 state 重新渲染用戶界面(不要操作 DOM)蘸鲸。

以下實(shí)例中創(chuàng)建了 LikeButton 組件,getInitialState 方法用于定義初始狀態(tài)窿锉,也就是一個(gè)對(duì)象,這個(gè)對(duì)象可以通過(guò) this.state 屬性讀取膝舅。當(dāng)用戶點(diǎn)擊組件嗡载,導(dǎo)致?tīng)顟B(tài)變化,this.setState 方法就修改狀態(tài)值仍稀,每次修改以后洼滚,自動(dòng)調(diào)用 this.render 方法,再次渲染組件技潘。

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 ? '喜歡' : '不喜歡';
      return (
        <p onClick={this.handleClick}>
          你<b>{text}</b>我遥巴。點(diǎn)我切換狀態(tài)。
        </p>
      );
    }
});

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

07 React Props

state 和 props 主要的區(qū)別在于 props 是不可變的享幽,而 state 可以根據(jù)與用戶交互來(lái)改變铲掐。這就是為什么有些容器組件需要定義 state 來(lái)更新和修改數(shù)據(jù)。 而子組件只能通過(guò) props 來(lái)傳遞數(shù)據(jù)值桩。

可以通過(guò) getDefaultProps() 方法為 props 設(shè)置默認(rèn)值摆霉。

Props 驗(yàn)證使用 propTypes,它可以保證我們的應(yīng)用組件被正確使用,React.PropTypes 提供很多驗(yàn)證器 (validator) 來(lái)驗(yàn)證傳入數(shù)據(jù)是否有效携栋。當(dāng)向 props 傳入無(wú)效數(shù)據(jù)時(shí)搭盾,JavaScript 控制臺(tái)會(huì)拋出警告。

08 React組件API

  • 設(shè)置狀態(tài):setState
  • 替換狀態(tài):replaceState
  • 設(shè)置屬性:setProps
  • 替換屬性:replaceProps
  • 強(qiáng)制更新:forceUpdate
  • 獲取DOM節(jié)點(diǎn):findDOMNode
  • 判斷組件掛載狀態(tài):isMounted

replaceState()方法與setState()類似婉支,但是方法只會(huì)保留nextState中狀態(tài)鸯隅,原state不在nextState中的狀態(tài)都會(huì)被刪除。

props相當(dāng)于組件的數(shù)據(jù)流向挖,它總是會(huì)從父組件向下傳遞至所有的子組件中蝌以。當(dāng)和一個(gè)外部的JavaScript應(yīng)用集成時(shí),我們可能會(huì)需要向組件傳遞數(shù)據(jù)或通知React.render()組件需要重新渲染户誓,可以使用setProps()饼灿。

replaceProps()方法與setProps類似,但它會(huì)刪除原有帝美。

forceUpdate()方法適用于this.props和this.state之外的組件重繪(如:修改了this.state后)碍彭,通過(guò)該方法通知React需要調(diào)用render(),一般來(lái)說(shuō)悼潭,應(yīng)該盡量避免使用forceUpdate()庇忌,而僅從this.props和this.state中讀取狀態(tài)并由React觸發(fā)render()調(diào)用。

isMounted()方法用于判斷組件是否已掛載到DOM中舰褪〗哉睿可以使用該方法保證了setState()和forceUpdate()在異步場(chǎng)景下的調(diào)用不會(huì)出錯(cuò)。

09 React 組件生命周期

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

  • Mounting:已插入真實(shí) DOM
  • Updating:正在被重新渲染
  • Unmounting:已移出真實(shí) DOM

生命周期的方法有:

  • componentWillMount 在渲染前調(diào)用占拍,在客戶端也在服務(wù)端略就。
  • componentDidMount 在第一次渲染后調(diào)用,只在客戶端晃酒。
  • componentWillReceiveProps 在組件接收到一個(gè)新的prop時(shí)被調(diào)用表牢。
  • shouldComponentUpdate 在組件接收到新的props或者state時(shí)被調(diào)用。在初始化時(shí)或者使用forceUpdate時(shí)不被調(diào)用贝次。
  • componentWillUpdate 在組件接收到新的props或者state但還沒(méi)有render時(shí)被調(diào)用崔兴。
  • componentDidUpdate 在組件完成更新后立即調(diào)用。
  • componentWillUnmount 在組件從 DOM 中移除的時(shí)候立刻被調(diào)用蛔翅。
 componentDidMount: function () {}敲茄;

10 AJAX

React 組件的數(shù)據(jù)可以通過(guò) componentDidMount 方法中的 Ajax 來(lái)獲取,當(dāng)從服務(wù)端獲取數(shù)據(jù)庫(kù)可以將數(shù)據(jù)存儲(chǔ)在 state 中山析,再用 this.setState 方法重新渲染 UI堰燎。

11 表單與事件

當(dāng)你需要從父組件中更新子組件的 state 時(shí),你需要在父組件通過(guò)創(chuàng)建事件句柄 (handleChange) 盖腿,并作為 prop (updateStateProp) 傳遞到你的子組件上爽待。

當(dāng)你需要從子組件中更新父組件的 state 時(shí)损同,你需要在父組件通過(guò)創(chuàng)建事件句柄 (handleChange) ,并作為 prop (updateStateProp) 傳遞到你的子組件上鸟款。

12 React Refs

React 支持一種非常特殊的屬性 Ref 膏燃,你可以用來(lái)綁定到 render() 輸出的任何組件上。

這個(gè)特殊的屬性允許你引用 render() 返回的相應(yīng)的支撐實(shí)例( backing instance )何什。這樣就可以確保在任何時(shí)間總是拿到正確的實(shí)例组哩。

最后編輯于
?著作權(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)離奇詭異,居然都是意外死亡荠诬,警方通過(guò)查閱死者的電腦和手機(jī)琅翻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)柑贞,“玉大人方椎,你說(shuō)我怎么就攤上這事【唬” “怎么了棠众?”我有些...
    開(kāi)封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)有决。 經(jīng)常有香客問(wèn)我闸拿,道長(zhǎng),這世上最難降的妖魔是什么书幕? 我笑而不...
    開(kāi)封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任胸墙,我火速辦了婚禮,結(jié)果婚禮上按咒,老公的妹妹穿的比我還像新娘。我一直安慰自己但骨,他們只是感情好励七,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著奔缠,像睡著了一般掠抬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上校哎,一...
    開(kāi)封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天两波,我揣著相機(jī)與錄音瞳步,去河邊找鬼。 笑死腰奋,一個(gè)胖子當(dāng)著我的面吹牛单起,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播劣坊,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼嘀倒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤斗塘,失蹤者是張志新(化名)和其女友劉穎贱纠,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(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
  • 文/蒙蒙 一梨熙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧刀诬,春花似錦咽扇、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至糠馆,卻和暖如春嘶伟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背又碌。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工九昧, 沒(méi)想到剛下飛機(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)容

  • 安裝: 概述 React起源于FaceBook的內(nèi)部項(xiàng)目,因?yàn)樵摴緦?duì)市場(chǎng)上所有的JavaScript MVC框架...
    姒沝無(wú)痕閱讀 717評(píng)論 0 0
  • Learn from React 官方文檔 一规个、Rendering Elements 1. Rendering a...
    恰皮閱讀 2,664評(píng)論 2 3
  • 本筆記基于React官方文檔,當(dāng)前React版本號(hào)為15.4.0姓建。 1. 安裝 1.1 嘗試 開(kāi)始之前可以先去co...
    Awey閱讀 7,700評(píng)論 14 128
  • 摘要 React中的組件類似于狀態(tài)機(jī)诞仓,每個(gè)組件都被設(shè)計(jì)成為在其生命周期過(guò)程中輸出穩(wěn)定、語(yǔ)義化的標(biāo)簽速兔。React組件...
    桂圓_noble閱讀 2,521評(píng)論 2 11
  • 最近看了一本關(guān)于學(xué)習(xí)方法論的書墅拭,強(qiáng)調(diào)了記筆記和堅(jiān)持的重要性。這幾天也剛好在學(xué)習(xí)React涣狗,所以我打算每天堅(jiān)持一篇R...
    gaoer1938閱讀 1,673評(píng)論 0 5