React

現(xiàn)在最熱門的前端技術(shù)米绕,毫無疑問就是React。
React起源于Facebook公司的內(nèi)部項目锌畸,他們認(rèn)為現(xiàn)在的MVC不能滿足他們的擴展需求讯嫂,由于他們的代碼庫非常龐大,組織也非常復(fù)雜,所以每當(dāng)添加一個新的功能時就變得異常的復(fù)雜,所以他們?yōu)榱私鉀Q這個問題,提出了React衔沼。

那么React是什么呢?

其官網(wǎng)上說的是A JAVASCRIPT LIBRARY FOR BUILDING USER INTERFACES昔瞧。一個Javascript庫指蚁,用于構(gòu)建用戶界面。

React主要解決什么問題呢硬爆?

他們的官網(wǎng)上有這么一句話:We built React to solve one problem: building large applications with data that changes over time.
構(gòu)建那些會隨時間變化的大型應(yīng)用欣舵。

在整個web的MVC架構(gòu)中,你可以認(rèn)為React是整個視圖層缀磕,并且是一個高效的視圖層缘圈。React提供了和以往不一樣的看待視圖層的方式劣光,它以組件開發(fā)為基礎(chǔ)。對于React而言糟把,你的頁面都是由一個個組件構(gòu)成的绢涡,你可以通過分割組件的方式去實現(xiàn)復(fù)雜的頁面或者某個功能模塊。并且這些組件是可以被復(fù)用的遣疯。
React的另一大特點是:虛擬DOM節(jié)點雄可。它讓頁面的渲染更加的高效,并且比直接操作真實DOM更加的可控缠犀。這兩大特點使得React有了強大的渲染頁面的能力数苫。

Virtual DOM 虛擬DOM

傳統(tǒng)的web應(yīng)用,操作DOM一般是直接更新操作的辨液,但是我們知道DOM更新通常是比較昂貴的虐急。而React為了盡可能減少對DOM的操作,提供了一種不同的而又強大的方式來更新DOM滔迈,代替直接的DOM操作止吁。就是Virtual DOM,一個輕量級的虛擬的DOM,就是React抽象出來的一個對象燎悍,描述dom應(yīng)該什么樣子的敬惦,應(yīng)該如何呈現(xiàn)。通過這個
Virtual DOM去更新真實的DOM谈山,由這個Virtual DOM管理真實DOM的更新俄删。

為什么通過這多一層的Virtual DOM操作就能更快呢? 這是因為React有個diff算法勾哩,更新Virtual DOM并不保證馬上影響真實的DOM抗蠢,React會等到事件循環(huán)結(jié)束举哟,然后利用這個diff算法思劳,通過當(dāng)前新的dom表述與之前的作比較,計算出最小的步驟更新真實的DOM妨猩。

Components 組件

在DOM樹上的節(jié)點被稱為元素潜叛,在這里則不同,Virtual DOM上稱為commponent壶硅。Virtual DOM的節(jié)點就是一個完整抽象的組件威兜,它是由commponents組成。

State 和 Render

React是如何呈現(xiàn)真實的DOM庐椒,如何渲染組件椒舵,什么時候渲染,怎么同步更新的约谈,這就需要簡單了解下State和Render了笔宿。state屬性包含定義組件所需要的一些數(shù)據(jù)犁钟,當(dāng)數(shù)據(jù)發(fā)生變化時,將會調(diào)用Render重現(xiàn)渲染泼橘,這里只能通過提供的setState方法更新數(shù)據(jù)涝动。

組件的生命周期

一個React組件的生命周期分為三個部分:實例化、存在期和銷毀時炬灭。
實例化
當(dāng)組件在客戶端被實例化醋粟,第一次被創(chuàng)建時,以下方法依次被調(diào)用:

  • getDefaultProps
  • getInitialState
  • componentWillMount
  • render
  • componentDidMount
    getDefaultProps

對于每個組件實例來講重归,這個方法只會調(diào)用一次米愿,該組件類的所有后續(xù)應(yīng)用,getDefaultPops 將不會再被調(diào)用鼻吮,其返回的對象可以用于設(shè)置默認(rèn)的 props(properties的縮寫) 值吗货。

getInitialState

對于組件的每個實例來說,這個方法的調(diào)用有且只有一次狈网,用來初始化每個實例的 state宙搬,在這個方法里,可以訪問組件的 props拓哺。
getInitialState 和 getDefaultPops 的調(diào)用是有區(qū)別的勇垛,getDefaultPops 是對于組件類來說只調(diào)用一次,后續(xù)該類的應(yīng)用都不會被調(diào)用士鸥,而 getInitialState 是對于每個組件實例來講都會調(diào)用闲孤,并且只調(diào)一次。

componentWillMount

該方法在首次渲染之前調(diào)用烤礁,也是再 render 方法調(diào)用之前修改 state 的最后一次機會讼积。

render

該方法會創(chuàng)建一個虛擬DOM,用來表示組件的輸出脚仔。對于一個組件來講勤众,render方法是唯一一個必需的方法。
注意:render方法返回的結(jié)果并不是真正的DOM元素鲤脏,而是一個虛擬的DOM.

componentDidMount

該方法不會在服務(wù)端被渲染的過程中調(diào)用们颜。該方法被調(diào)用時,已經(jīng)渲染出真實的 DOM猎醇,可以再該方法中通過this.getDOMNode()訪問到真實的 DOM窥突。

存在期

此時組件已經(jīng)渲染好并且用戶可以與它進行交互,比如鼠標(biāo)點擊硫嘶,手指點按阻问,或者其它的一些事件,導(dǎo)致應(yīng)用狀態(tài)的改變沦疾,你將會看到下面的方法依次被調(diào)用

  • componentWillReceiveProps
  • shouldComponentUpdate
  • componentWillUpdate
  • render
  • componentDidUpdate

componentWillReceiveProps

組件的 props 屬性可以通過父組件來更改称近,這時贡蓖,componentWillReceiveProps 將來被調(diào)用』筒纾可以在這個方法里更新 state,以觸發(fā) render 方法重新渲染組件斥铺。

shouldComponentUpdate

如果你確定組件的 props 或者 state 的改變不需要重新渲染,可以通過在這個方法里通過返回 false 來阻止組件的重新渲染坛善,返回 `false 則不會執(zhí)行 render 以及后面的 componentWillUpdate晾蜘,componentDidUpdate 方法。

componentWillUpdate

這個方法和 componentWillMount 類似眠屎,在組件接收到了新的 props 或者 state 即將進行重新渲染前剔交,componentWillUpdate(object nextProps, object nextState) 會被調(diào)用,注意不要在此方法中再去更新 props 或者 state改衩。

componentDidUpdate

這個方法和 componentDidMount 類似岖常,在組件重新被渲染之后,componentDidUpdate(object prevProps, object prevState) 會被調(diào)用葫督〗甙埃可以在這里訪問并修改 DOM。

銷毀時

componentWillUnmount

每當(dāng)React使用完一個組件橄镜,這個組件必須從 DOM 中卸載后被銷毀偎快,此時 componentWillUnmout 會被執(zhí)行,完成所有的清理和銷毀工作洽胶,在 conponentDidMount 中添加的任務(wù)都需要再該方法中撤銷晒夹,如創(chuàng)建的定時器或事件監(jiān)聽器。
當(dāng)再次裝載組件時姊氓,以下方法會被依次調(diào)用:

  • getInitialState
  • componentWillMount
  • render
  • componentDidMount
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末丐怯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子翔横,更是在濱河造成了極大的恐慌读跷,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棕孙,死亡現(xiàn)場離奇詭異舔亭,居然都是意外死亡,警方通過查閱死者的電腦和手機蟀俊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來订雾,“玉大人肢预,你說我怎么就攤上這事⊥莅ィ” “怎么了烫映?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵沼本,是天一觀的道長。 經(jīng)常有香客問我锭沟,道長抽兆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任族淮,我火速辦了婚禮辫红,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘祝辣。我一直安慰自己贴妻,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布蝙斜。 她就那樣靜靜地躺著名惩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪孕荠。 梳的紋絲不亂的頭發(fā)上娩鹉,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機與錄音稚伍,去河邊找鬼底循。 笑死,一個胖子當(dāng)著我的面吹牛槐瑞,可吹牛的內(nèi)容都是我干的熙涤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼困檩,長吁一口氣:“原來是場噩夢啊……” “哼祠挫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起悼沿,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤等舔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后糟趾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體慌植,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年义郑,在試婚紗的時候發(fā)現(xiàn)自己被綠了蝶柿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡非驮,死狀恐怖交汤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情劫笙,我是刑警寧澤芙扎,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布星岗,位于F島的核電站,受9級特大地震影響戒洼,放射性物質(zhì)發(fā)生泄漏俏橘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一圈浇、第九天 我趴在偏房一處隱蔽的房頂上張望寥掐。 院中可真熱鬧,春花似錦汉额、人聲如沸曹仗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怎茫。三九已至,卻和暖如春妓灌,著一層夾襖步出監(jiān)牢的瞬間轨蛤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工虫埂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留祥山,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓掉伏,卻偏偏與公主長得像缝呕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子斧散,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

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

  • 原教程內(nèi)容詳見精益 React 學(xué)習(xí)指南供常,這只是我在學(xué)習(xí)過程中的一些閱讀筆記,個人覺得該教程講解深入淺出鸡捐,比目前大...
    leonaxiong閱讀 2,835評論 1 18
  • It's a common pattern in React to wrap a component in an ...
    jplyue閱讀 3,267評論 0 2
  • 使用 create-react-app 快速構(gòu)建 React 開發(fā)環(huán)境 項目的目錄結(jié)構(gòu)如下: React JSX ...
    majun00閱讀 510評論 0 0
  • 3. JSX JSX是對JavaScript語言的一個擴展語法栈暇, 用于生產(chǎn)React“元素”,建議在描述UI的時候...
    pixels閱讀 2,826評論 0 24
  • 字符串(String類)與符號(Symbol)這兩種變量類型的特點和區(qū)別: 字符串和符號箍镜,都是Ruby中表示文本的...
    GALAXY_ZMY閱讀 1,000評論 0 2