React簡(jiǎn)述

React簡(jiǎn)述

React是Facebook在2013年推出的前段框架。React不是一個(gè)MVC框架瘫絮,React是一個(gè)構(gòu)造可組合式用戶界面的庫嘱吗。它鼓勵(lì)創(chuàng)建可重用的UI組件會(huì)隨著時(shí)間而改變的數(shù)據(jù)勺像。React采用不同的方法凫乖,當(dāng)組件第一次初始化時(shí)确垫,render方法調(diào)用,為試圖生成一個(gè)輕量級(jí)的表現(xiàn)帽芽。通過這個(gè)表現(xiàn)删掀,產(chǎn)生一個(gè)標(biāo)簽字符串,然后插入文檔中导街。當(dāng)數(shù)據(jù)變化時(shí)披泪,render方法再次被調(diào)用。為了盡可能有效的完成更新搬瑰,我們比較之前調(diào)用的render返回的值與新的值款票,然后產(chǎn)生一個(gè)最小的變更去應(yīng)用DOM中。

問題出現(xiàn)的根源

  • 傳統(tǒng) UI 操作關(guān)注太多細(xì)節(jié)
  • 應(yīng)用程序狀態(tài)分散在各處難以追蹤和維護(hù)

Facebook認(rèn)為MVC無法滿足他們的擴(kuò)展需求泽论,由于他們非常巨大的代碼庫和龐大的組織艾少,使得MVC很快變得復(fù)雜,每當(dāng)需要添加一項(xiàng)新功能或者特性時(shí)翼悴,系統(tǒng)的復(fù)雜就成級(jí)數(shù)的增長(zhǎng)缚够,致使代碼變得脆弱而不可預(yù)測(cè),結(jié)果導(dǎo)致他們的MVC正在土崩瓦解鹦赎。認(rèn)為MVC不適合大規(guī)模的應(yīng)用谍椅。當(dāng)系統(tǒng)中有很多模型和相應(yīng)的視圖時(shí),其復(fù)雜度就會(huì)迅速擴(kuò)大钙姊,非常難以理解和調(diào)試毯辅,特別是模型和視圖可能存在雙向數(shù)據(jù)流動(dòng)。

React:始終整體"刷新"頁面煞额,無需關(guān)心細(xì)節(jié)。以組件的方式去描述UI沾谜,4個(gè)必須API膊毁,單向數(shù)據(jù)流,完善的錯(cuò)誤提示基跑。

數(shù)據(jù)模型如何解決

傳統(tǒng)MVC難以擴(kuò)展和維護(hù)婚温,Model和View之間的關(guān)系錯(cuò)綜復(fù)雜而且雙向綁定,如果業(yè)務(wù)復(fù)雜出現(xiàn)問題后很難去追蹤是Model的問題還是View的問題媳否。

傳統(tǒng)MVC難以擴(kuò)展和維護(hù)

針對(duì)這個(gè)問題栅螟,React提出Flux架構(gòu)荆秦,該設(shè)計(jì)模式的核心思想就是單向數(shù)據(jù)流。首先用戶操作產(chǎn)生Action力图,Action經(jīng)過Dispatcher再發(fā)送到Store步绸,Store根據(jù)Action來進(jìn)行處理,View是綁定到Store上的吃媒,此時(shí)View隨Store更新而更新瓤介。


Flux架構(gòu):?jiǎn)蜗驍?shù)據(jù)流

Flux架構(gòu)的衍生項(xiàng)目:Redux、Mobx赘那。

組件

React組件由props和state最終得到一個(gè)View刑桑。狀態(tài)有外部傳過來狀態(tài)和內(nèi)部維護(hù)狀態(tài),兩種狀態(tài)最終決定了View募舟。React一般不提供方法祠斧,而是某種狀態(tài)機(jī),可以理解React組件為一個(gè)純函數(shù)拱礁,React是單向數(shù)據(jù)綁定梁肿。
以組件的方式考慮UI的構(gòu)建,將UI組織成組件樹的形式觅彰。

下面的評(píng)論框由CommentBox吩蔑、CommentList和CommentForm三個(gè)組件共同完成,代碼部分除了div和h1標(biāo)準(zhǔn)的html的tag外還有CommentList和CommentForm兩個(gè)自定義組件共同完成填抬。

UI的構(gòu)建

受控組件的狀態(tài)來自外部烛芬,要傳遞value和onChange,非受控組件的狀態(tài)由內(nèi)部維護(hù)飒责,如果外部需要可以通過其他方式獲取赘娄,也就不需要傳遞value和onChange。


受控組件和非受控組件

在創(chuàng)建組件時(shí)要遵守單一職責(zé)原則宏蛉。每個(gè)組件只做一件事遣臼,組件是構(gòu)建UI的最小元素,每個(gè)組件都應(yīng)該盡量的小拾并,這樣才能夠讓復(fù)雜度分散出去揍堰,在以后的開發(fā)中如果組件變得復(fù)雜,應(yīng)該拆分成小組件嗅义。
數(shù)據(jù)狀態(tài)管理要遵守DRY原則屏歹。能計(jì)算得到的狀態(tài)就不要單獨(dú)存儲(chǔ);組件盡量無狀態(tài)之碗,所需數(shù)據(jù)通過props獲取以提高組件的性能蝙眶。

JSX的本質(zhì)

JSX:在JavaScript代碼中直接寫HTML標(biāo)記。JSX并不是模板語言褪那,只是一種語法糖幽纷。TIP:自定義組件以大寫字母開頭式塌,React認(rèn)為小寫的tag是原生DOM節(jié)點(diǎn),如div友浸;JSX標(biāo)記可以直接使用屬性語法峰尝,例如<menu.Item />

比如我們定義了一個(gè)變量name尾菇,又定義了一個(gè)HTML的element:

const name = 'Vincent Wang';
const element = <h1>Hello, {name}</h1>

實(shí)際上是動(dòng)態(tài)創(chuàng)建了一個(gè)組件境析,而且是用JavaScript語法。


image.png

JSX本身也是表達(dá)式派诬,element返回一個(gè)HTML的節(jié)點(diǎn):

const element = <h1>Hello, world!</h1>

在屬性中使用表達(dá)式劳淆,如果給一個(gè)組件傳遞屬性的值,這個(gè)屬性的值可以是JavaScript的表達(dá)式:

<MyComment foo={1 + 2} />

延展屬性默赂,如果給一個(gè)組件傳遞一組值沛鸵,此時(shí)我們不需要一個(gè)一個(gè)填寫,只需要...語法缆八,

const props = { name: "Red", value: "red" };
const greeting = <Greeting {...props} />;

表達(dá)式作為子元素曲掰,子元素是React的一個(gè)特殊屬性。只需要用大括號(hào)將JavaScript語法包起來奈辰。

const element = <li>{props.message}</li>

** JSX的優(yōu)點(diǎn)**

  • 有聲明式創(chuàng)建界面的直觀
  • 代碼動(dòng)態(tài)創(chuàng)建界面的靈活
  • 不需要學(xué)習(xí)新的模板語言

React生命周期及使用場(chǎng)景

React主要分三個(gè)階段:Render階段(計(jì)算當(dāng)前的狀態(tài))栏妖、Pre-commit階段(讀取DOM內(nèi)容)和Commit階段(React把當(dāng)前狀態(tài)映射到DOM節(jié)點(diǎn)時(shí)需要實(shí)際更新DOM節(jié)點(diǎn))。

生命周期

圖片來源:http://projects.wojtekmaj.pl/react-lifecycle-methods-diagram/

生命周期可以分為三個(gè)類型:掛載時(shí)奖恰、更新時(shí)和卸載時(shí)吊趾。

創(chuàng)建時(shí)
  1. constructor
    一個(gè)組件的構(gòu)造函數(shù)的創(chuàng)建,也是唯一可以直接修改state的地方瑟啃。
  2. getDerivedStateFromProps
    從外部的屬性初始化內(nèi)部的狀態(tài)论泛,在初始安裝和后續(xù)更新上,都在調(diào)用render方法之前立即調(diào)用getDerivedStateFromProps蛹屿。它返回一個(gè)對(duì)象以更新狀態(tài)屁奏,或者返回null則不更新任何內(nèi)容。這個(gè)方法一般不建議使用错负,如果state需要從props中獲取的時(shí)候坟瓢,可以通過props動(dòng)態(tài)計(jì)算等到,不需要單獨(dú)存儲(chǔ)這個(gè)狀態(tài)湿颅,否則要維護(hù)兩者狀態(tài)一致性载绿,這樣會(huì)增加復(fù)雜度,每次render都會(huì)調(diào)用油航。一般表單控件獲取默認(rèn)值。
    3.render
    描述UI DOM結(jié)構(gòu)怀浆,類組件中唯一需要的方法谊囚。
  3. componentDidMount
    掛載組件(插入樹中)后立即調(diào)用componentDidMount()怕享。我們可以在此處發(fā)起請(qǐng)求或者定義外部的資源等。只執(zhí)行一次镰踏,可以獲取外部資源函筋。
更新時(shí)

當(dāng)組件有新的屬性或者修改了state內(nèi)部狀態(tài),當(dāng)然如果強(qiáng)制刷新forceUpdate可以會(huì)觸發(fā)奠伪。

  1. getDerivedStateFromProps
    同樣是從外部屬性得到內(nèi)部的狀態(tài)
  2. shouldComponentUpdate
    使用shouldComponentUpdate()讓React知道組件的輸出是否不受當(dāng)前狀態(tài)或道具更改的影響跌帐。在這里可以做一些組件的性能優(yōu)化,比如props即使發(fā)生變化且UI不需要更新绊率,這時(shí)可以通知React組件直接返回false則不需要Update谨敛。一般可以由PureComponent自動(dòng)實(shí)現(xiàn),來判斷當(dāng)前state和props是否發(fā)生變化滤否。
  3. render
    計(jì)算虛擬的DOM脸狸,虛擬DOM維持內(nèi)部的UI狀態(tài),計(jì)算diff等藐俺。
  4. getSnapshotBeforeUpdate
    它使組件可以在DOM可能發(fā)生更改之前從DOM捕獲一些信息(例如炊甲,滾動(dòng)位置),返回的任何值都將作為參數(shù)傳遞給componentDidUpdate()欲芹,一般在獲取render之前的DOM狀態(tài)時(shí)使用卿啡。
  5. componentDidUpdate
    發(fā)生更新后,立即調(diào)用componentDidUpdate()菱父,初始渲染不調(diào)用此方法颈娜。React更新的事情做完后可以根據(jù)實(shí)際業(yè)務(wù)在此處做一些處理,然后更新到UI上滞伟。頁面根據(jù)props變化來重新獲取數(shù)據(jù)揭鳞。
卸載時(shí)
  • componentWillUnmount
    當(dāng)組件移除時(shí),需要銷毀組件來釋放資源梆奈。

該文章為記錄本人的學(xué)習(xí)路程野崇,也希望能夠幫助大家,知識(shí)共享亩钟,共同成長(zhǎng)乓梨,共同進(jìn)步!G逅帧扶镀!文章地址:http://www.reibang.com/p/b6f5547e0caa

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市焰轻,隨后出現(xiàn)的幾起案子臭觉,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝠筑,死亡現(xiàn)場(chǎng)離奇詭異狞膘,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)什乙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門挽封,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人臣镣,你說我怎么就攤上這事辅愿。” “怎么了忆某?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵点待,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我褒繁,道長(zhǎng)亦鳞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任棒坏,我火速辦了婚禮燕差,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坝冕。我一直安慰自己徒探,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布喂窟。 她就那樣靜靜地躺著测暗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪磨澡。 梳的紋絲不亂的頭發(fā)上碗啄,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天,我揣著相機(jī)與錄音稳摄,去河邊找鬼稚字。 笑死,一個(gè)胖子當(dāng)著我的面吹牛厦酬,可吹牛的內(nèi)容都是我干的胆描。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼仗阅,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼昌讲!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起减噪,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤短绸,失蹤者是張志新(化名)和其女友劉穎车吹,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸠按,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡礼搁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年饶碘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了目尖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡扎运,死狀恐怖瑟曲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情豪治,我是刑警寧澤洞拨,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站负拟,受9級(jí)特大地震影響烦衣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜掩浙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一花吟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧厨姚,春花似錦衅澈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拭抬,卻和暖如春部默,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背造虎。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國打工傅蹂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人累奈。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓贬派,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親澎媒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子搞乏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353