ReactJS初步認識和看法


現(xiàn)在最熱門的前端框架有AngularJS、React彬伦、Bootstrap等验烧。自從接觸了ReactJS,ReactJs的虛擬DOM(Virtual DOM)和組件化的開發(fā)深深的吸引了我样勃,下面來跟我一起領(lǐng)略

ReactJS的風采吧~~ 章有點長,耐心讀完性芬,你會有很大收獲哦~

一峡眶、ReactJS簡介

React 起源于 Facebook 的內(nèi)部項目,因為該公司對市場上所有 JavaScript MVC 框架植锉,都不滿意辫樱,就決定自己寫一套,用來架設(shè) Instagram 的網(wǎng)站俊庇。做出來以后狮暑,發(fā)現(xiàn)這套東西很好用鸡挠,就在2013年5月開源了。由于 React 的設(shè)計思想極其獨特心例,屬于革命性創(chuàng)新宵凌,性能出眾,代碼邏輯卻非常簡單止后。所以瞎惫,越來越多的人開始關(guān)注和使用,認為它可能是將來 Web 開發(fā)的主流工具译株。

ReactJS官網(wǎng)地址:http://facebook.github.io/react/

Github地址:https://github.com/facebook/react

二瓜喇、對ReactJS的認識及ReactJS的優(yōu)點

首先,對于React歉糜,有一些認識誤區(qū)乘寒,這里先總結(jié)一下:

React不是一個完整的MVC框架,最多可以認為是MVC中的V(View)匪补,甚至React并不非常認可MVC開發(fā)模式伞辛;

React的服務(wù)器端Render能力只能算是一個錦上添花的功能,并不是其核心出發(fā)點夯缺,事實上React官方站點幾乎沒有提及其在服務(wù)器端的應用蚤氏;

有人拿React和Web Component相提并論,但兩者并不是完全的競爭關(guān)系踊兜,你完全可以用React去開發(fā)一個真正的Web Component竿滨;

React不是一個新的模板語言,JSX只是一個表象捏境,沒有JSX的React也能工作于游。

1、ReactJS的背景和原理

在Web開發(fā)中垫言,我們總需要將變化的數(shù)據(jù)實時反應到UI上贰剥,這時就需要對DOM進行操作。而復雜或頻繁的DOM操作通常是性能瓶頸產(chǎn)生的原因(如何進行高性能的復雜DOM操作通常是衡量一個前端開發(fā)人員技能的重要指標)筷频。React為此引入了虛擬DOM(Virtual DOM)的機制:在瀏覽器端用Javascript實現(xiàn)了一套DOM API鸠澈。基于React進行開發(fā)時所有的DOM構(gòu)造都是通過虛擬DOM進行截驮,每當數(shù)據(jù)變化時,React都會重新構(gòu)建整個DOM樹际度,然后React將當前整個DOM樹和上一次的DOM樹進行對比葵袭,得到DOM結(jié)構(gòu)的區(qū)別,然后僅僅將需要變化的部分進行實際的瀏覽器DOM更新乖菱。而且React能夠批處理虛擬DOM的刷新坡锡,在一個事件循環(huán)(Event Loop)內(nèi)的兩次數(shù)據(jù)變化會被合并蓬网,例如你連續(xù)的先將節(jié)點內(nèi)容從A變成B,然后又從B變成A鹉勒,React會認為UI不發(fā)生任何變化帆锋,而如果通過手動控制,這種邏輯通常是極其復雜的禽额。盡管每一次都需要構(gòu)造完整的虛擬DOM樹锯厢,但是因為虛擬DOM是內(nèi)存數(shù)據(jù),性能是極高的脯倒,而對實際DOM進行操作的僅僅是Diff部分实辑,因而能達到提高性能的目的。這樣藻丢,在保證性能的同時剪撬,開發(fā)者將不再需要關(guān)注某個數(shù)據(jù)的變化如何更新到一個或多個具體的DOM元素,而只需要關(guān)心在任意一個數(shù)據(jù)狀態(tài)下悠反,整個界面是如何Render的残黑。

如果你像在90年代那樣寫過服務(wù)器端Render的純Web頁面那么應該知道,服務(wù)器端所要做的就是根據(jù)數(shù)據(jù)Render出HTML送到瀏覽器端斋否。如果這時因為用戶的一個點擊需要改變某個狀態(tài)文字梨水,那么也是通過刷新整個頁面來完成的。服務(wù)器端并不需要知道是哪一小段HTML發(fā)生了變化如叼,而只需要根據(jù)數(shù)據(jù)刷新整個頁面冰木。換句話說,任何UI的變化都是通過整體刷新來完成的笼恰。而React將這種開發(fā)模式以高性能的方式帶到了前端踊沸,每做一點界面的更新,你都可以認為刷新了整個頁面社证。至于如何進行局部更新以保證性能逼龟,則是React框架要完成的事情。

借用Facebook介紹React的視頻中聊天應用的例子追葡,當一條新的消息過來時腺律,傳統(tǒng)開發(fā)的思路如上圖,你的開發(fā)過程需要知道哪條數(shù)據(jù)過來了宜肉,如何將新的DOM結(jié)點添加到當前DOM樹上匀钧;而基于React的開發(fā)思路如下圖,你永遠只需要關(guān)心數(shù)據(jù)整體谬返,兩次數(shù)據(jù)之間的UI如何變化之斯,則完全交給框架去做∏猜粒可以看到佑刷,使用React大大降低了邏輯復雜性莉擒,意味著開發(fā)難度降低,可能產(chǎn)生Bug的機會也更少瘫絮。

2涨冀、組件化

虛擬DOM(virtual-dom)不僅帶來了簡單的UI開發(fā)邏輯,同時也帶來了組件化開發(fā)的思想麦萤,所謂組件鹿鳖,即封裝起來的具有獨立功能的UI部件括袒。React推薦以組件的方式去重新思考UI構(gòu)成拣凹,將UI上每一個功能相對獨立的模塊定義成組件,然后將小的組件通過組合或者嵌套的方式構(gòu)成大的組件隧土,最終完成整體UI的構(gòu)建垛孔。例如藕甩,F(xiàn)acebook的instagram.com整站都采用了React來開發(fā),整個頁面就是一個大的組件周荐,其中包含了嵌套的大量其它組件狭莱,大家有興趣可以看下它背后的代碼。

如果說MVC的思想讓你做到視圖-數(shù)據(jù)-控制器的分離概作,那么組件化的思考方式則是帶來了UI功能模塊之間的分離腋妙。我們通過一個典型的Blog評論界面來看MVC和組件化開發(fā)思路的區(qū)別。

對于MVC開發(fā)模式來說讯榕,開發(fā)者將三者定義成不同的類骤素,實現(xiàn)了表現(xiàn),數(shù)據(jù)愚屁,控制的分離济竹。開發(fā)者更多的是從技術(shù)的角度來對UI進行拆分,實現(xiàn)松耦合霎槐。

對于React而言送浊,則完全是一個新的思路,開發(fā)者從功能的角度出發(fā)丘跌,將UI分成不同的組件袭景,每個組件都獨立封裝。

在React中闭树,你按照界面模塊自然劃分的方式來組織和編寫你的代碼耸棒,對于評論界面而言,整個UI是一個通過小組件構(gòu)成的大組件报辱,每個組件只關(guān)心自己部分的邏輯榆纽,彼此獨立。

React認為一個組件應該具有如下特征:

(1)可組合(Composeable):一個組件易于和其它組件一起使用,或者嵌套在另一個組件內(nèi)部奈籽。如果一個組件內(nèi)部創(chuàng)建了另一個組件,那么說父組件擁有(own)它創(chuàng)建的子組件鸵赫,通過這個特性衣屏,一個復雜的UI可以拆分成多個簡單的UI組件;

(2)可重用(Reusable):每個組件都是具有獨立功能的辩棒,它可以被使用在多個UI場景狼忱;

(3)可維護(Maintainable):每個小的組件僅僅包含自身的邏輯,更容易被理解和維護一睁;

三钻弄、下載ReactJS,編寫Hello者吁,world

ReactJs下載非常簡單窘俺,為了方便大家下載,這里再一次給出下載地址(鏈接),下載完成后复凳,我么看到的是一個壓縮包瘤泪。解壓后,我們新建一個html文件育八,引用react.js和JSXTransformer.js這兩個js文件对途。html模板如下(js路徑改成自己的):

這里大家可能會奇怪,為什么script的type是text/jsx,這是因為 React 獨有的 JSX 語法髓棋,跟 JavaScript 不兼容实檀。凡是使用 JSX 的地方,都要加上 type="text/jsx" 按声。 其次膳犹,React 提供兩個庫: react.js 和 JSXTransformer.js ,它們必須首先加載儒喊。其中镣奋,JSXTransformer.js 的作用是將 JSX 語法轉(zhuǎn)為 JavaScript 語法。這一步很消耗時間怀愧,實際上線的時候侨颈,應該將它放到服務(wù)器完成。

到這里我們就可以開始編寫代碼了芯义,首先我們先來認識一下ReactJs里面的React.render方法:

React.render 是 React 的最基本方法哈垢,用于將模板轉(zhuǎn)為 HTML 語言,并插入指定的 DOM 節(jié)點扛拨。

下面我們在script標簽里面編寫代碼耘分,來輸出Hello,world,代碼如下:

這里需要注意的是求泰,react并不依賴jQuery央渣,當然我們可以使用jQuery,但是render里面第二個參數(shù)必須使用JavaScript原生的getElementByID方法渴频,不能使用jQuery來選取DOM節(jié)點芽丹。

然后,在瀏覽器打開這個頁面卜朗,就可以看到瀏覽器顯示一個大大的Hello拔第,world,因為我們用了

標簽。

到這里场钉,恭喜蚊俺,你已經(jīng)步入了ReactJS的大門~~下面,讓我們來進一步學習ReactJs吧~~

四逛万、Jsx語法

HTML 語言直接寫在 JavaScript 語言之中泳猬,不加任何引號,這就是 JSX 的語法泣港,它允許 HTML 與 JavaScript 的混寫暂殖,了解過AngularJs的看到下面的代碼一定會感覺很熟悉的,我們來看代碼:

這里我們聲明了一個names數(shù)組当纱,然后遍歷在前面加上Hello,輸出到DOM中呛每,輸出結(jié)果如下:

JSX 允許直接在模板插入 JavaScript 變量。如果這個變量是一個數(shù)組坡氯,則會展開這個數(shù)組的所有成員晨横,代碼如下:

顯示結(jié)果如下:

這里的星號只是做標識用的,大家不要被迷惑了~~

你看到這里箫柳,說明你對React還是蠻感興趣的手形,恭喜你,堅持下來了悯恍,那么下面库糠,我們開始學習React里面的"真功夫"了~~ Are you ready?

五、ReactJS組件

1涮毫、組件屬性

前面說了瞬欧,ReactJS是基于組件化的開發(fā),下面我們開始來學習ReactJS里面的組件罢防,React 允許將代碼封裝成組件(component)艘虎,然后像插入普通 HTML 標簽一樣,在網(wǎng)頁中插入這個組件咒吐。React.createClass 方法就用于生成一個組件類野建。

下面属划,我們來編寫第一個組件Greet,有一個name屬性候生,然后輸出hello + name的值同眯,代碼如下:

看到這段代碼,接觸過AngularJS的朋友們是不是有一種熟悉的感覺唯鸭,不過這里有幾點需要注意:

1)獲取屬性的值用的是this.props.屬性名

2)創(chuàng)建的組件名稱首字母必須大寫嗽测。

3)為元素添加css的class時,要用className肿孵。

4)組件的style屬性的設(shè)置方式也值得注意,要寫成style={{width: this.state.witdh}}疏魏。

2停做、組件狀態(tài)

組件免不了要與用戶互動,React 的一大創(chuàng)新大莫,就是將組件看成是一個狀態(tài)機蛉腌,一開始有一個初始狀態(tài),然后用戶互動只厘,導致狀態(tài)變化烙丛,從而觸發(fā)重新渲染 UI 。下面我們來編寫一個小例子羔味,一個文本框和一個button河咽,通過點擊button可以改變文本框的編輯狀態(tài),禁止編輯和允許編輯赋元。通過這個例子來理解ReactJS的狀態(tài)機制忘蟹。先看代碼:

這里,我們又使用到了一個方法getInitialState,這個函數(shù)在組件初始化的時候執(zhí)行搁凸,必需返回NULL或者一個對象媚值。這里我們可以通過this.state.屬性名來訪問屬性值,這里我們將enable這個值跟input的disabled綁定护糖,當要修改這個屬性值時褥芒,要使用setState方法。我們聲明handleClick方法嫡良,來綁定到button上面锰扶,實現(xiàn)改變state.enable的值。效果如下:

原理分析:

當用戶點擊組件皆刺,導致狀態(tài)變化少辣,this.setState 方法就修改狀態(tài)值,每次修改以后羡蛾,自動調(diào)用 this.render 方法漓帅,再次渲染組件。

這里值得注意的幾點如下:

1)getInitialState函數(shù)必須有返回值,可以是NULL或者一個對象忙干。

2)訪問state的方法是this.state.屬性名器予。

3)變量用{}包裹,不需要再加雙引號捐迫。

3乾翔、組件的生命周期

組件的生命周期分成三個狀態(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)用

下面來看一個例子:

上面代碼在hello組件加載以后,通過 componentDidMount 方法設(shè)置一個定時器肪笋,每隔100毫秒月劈,就重新設(shè)置組件的透明度,從而引發(fā)重新渲染藤乙。

4猜揪、組件的嵌套

React是基于組件化的開發(fā),那么組件化開發(fā)最大的優(yōu)點是什么坛梁?毫無疑問而姐,當然是復用,下面我們來看看React中到底是如何實現(xiàn)組件的復用的罚勾,這里我們還寫一個例子來說吧毅人,代碼如下:

這里我們創(chuàng)建了一個Search組件,然后又創(chuàng)建了一個Page組件尖殃,然后我們在Page組件中調(diào)用Search組件丈莺,并且調(diào)用了兩次,這里我們通過屬性searchType傳入值送丰,最終顯示結(jié)果如圖:

六缔俄、ReactJS小結(jié)

關(guān)于ReactJS今天就先學習到這里了,下面來總結(jié)一下器躏,主要有以下幾點:

1俐载、ReactJs是基于組件化的開發(fā),所以最終你的頁面應該是由若干個小組件組成的大組件登失。

2遏佣、可以通過屬性,將值傳遞到組件內(nèi)部揽浙,同理也可以通過屬性將內(nèi)部的結(jié)果傳遞到父級組件(留給大家研究)状婶;要對某些值的變化做DOM操作的意敛,要把這些值放到state中。

3膛虫、為組件添加外部css樣式時草姻,類名應該寫成className而不是class;添加內(nèi)部樣式時,應該是style={{opacity: this.state.opacity}}而不是style="opacity:{this.state.opacity};"稍刀。

4撩独、組件名稱首字母必須大寫。

5账月、變量名用{}包裹综膀,且不能加雙引號。

七局齿、參考資料

React中文文檔

React入門實例教程

顛覆式前端UI開發(fā)框架:React

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末僧须,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子项炼,更是在濱河造成了極大的恐慌,老刑警劉巖示绊,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锭部,死亡現(xiàn)場離奇詭異,居然都是意外死亡面褐,警方通過查閱死者的電腦和手機拌禾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來展哭,“玉大人湃窍,你說我怎么就攤上這事》税” “怎么了您市?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長役衡。 經(jīng)常有香客問我茵休,道長,這世上最難降的妖魔是什么手蝎? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任榕莺,我火速辦了婚禮,結(jié)果婚禮上棵介,老公的妹妹穿的比我還像新娘钉鸯。我一直安慰自己,他們只是感情好邮辽,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布唠雕。 她就那樣靜靜地躺著贸营,像睡著了一般。 火紅的嫁衣襯著肌膚如雪及塘。 梳的紋絲不亂的頭發(fā)上莽使,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音笙僚,去河邊找鬼芳肌。 笑死,一個胖子當著我的面吹牛肋层,可吹牛的內(nèi)容都是我干的亿笤。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼栋猖,長吁一口氣:“原來是場噩夢啊……” “哼净薛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蒲拉,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤肃拜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后雌团,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體燃领,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年锦援,在試婚紗的時候發(fā)現(xiàn)自己被綠了猛蔽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡灵寺,死狀恐怖曼库,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情略板,我是刑警寧澤毁枯,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站叮称,受9級特大地震影響后众,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜颅拦,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一蒂誉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧距帅,春花似錦右锨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悄窃。三九已至,卻和暖如春蹂窖,著一層夾襖步出監(jiān)牢的瞬間轧抗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工瞬测, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留横媚,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓月趟,卻偏偏與公主長得像灯蝴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子孝宗,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

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

  • React 入門實例教程 轉(zhuǎn)載(加入了自己的一些東西穷躁,推薦看原文):一看就懂的ReactJs入門教程(精華版) ...
    驀然之間的閱讀 396評論 0 0
  • JSX 知識準備 JSX 并不是一門全新的語言,僅僅是一個語法糖因妇,允許開發(fā)者在javascript中編寫XML語言...
    艾倫先生閱讀 4,494評論 4 20
  • 作者:雲(yún)霏霏原文地址:http://www.cnblogs.com/yunfeifei/ 現(xiàn)在最熱門的前端框架有A...
    IT程序獅閱讀 1,548評論 1 38
  • 原教程內(nèi)容詳見精益 React 學習指南问潭,這只是我在學習過程中的一些閱讀筆記,個人覺得該教程講解深入淺出婚被,比目前大...
    leonaxiong閱讀 2,810評論 1 18
  • 一睦授、why React? React是Facebook開發(fā)的一款JS庫摔寨。React一般被用來作為MVC中的V層,它...
    amm0117閱讀 11,083評論 0 1