React

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

那么React是什么呢?

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

React主要解決什么問題呢?

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

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

Virtual DOM 虛擬DOM

傳統(tǒng)的web應(yīng)用,操作DOM一般是直接更新操作的,但是我們知道DOM更新通常是比較昂貴的。而React為了盡可能減少對(duì)DOM的操作,提供了一種不同的而又強(qiáng)大的方式來更新DOM,代替直接的DOM操作。就是Virtual DOM,一個(gè)輕量級(jí)的虛擬的DOM,就是React抽象出來的一個(gè)對(duì)象,描述dom應(yīng)該什么樣子的,應(yīng)該如何呈現(xiàn)。通過這個(gè)
Virtual DOM去更新真實(shí)的DOM,由這個(gè)Virtual DOM管理真實(shí)DOM的更新。

為什么通過這多一層的Virtual DOM操作就能更快呢? 這是因?yàn)镽eact有個(gè)diff算法,更新Virtual DOM并不保證馬上影響真實(shí)的DOM,React會(huì)等到事件循環(huán)結(jié)束,然后利用這個(gè)diff算法,通過當(dāng)前新的dom表述與之前的作比較,計(jì)算出最小的步驟更新真實(shí)的DOM。

Components 組件

在DOM樹上的節(jié)點(diǎn)被稱為元素,在這里則不同,Virtual DOM上稱為commponent。Virtual DOM的節(jié)點(diǎn)就是一個(gè)完整抽象的組件,它是由commponents組成。

State 和 Render

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

組件的生命周期

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

  • getDefaultProps
  • getInitialState
  • componentWillMount
  • render
  • componentDidMount
    getDefaultProps

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

getInitialState

對(duì)于組件的每個(gè)實(shí)例來說,這個(gè)方法的調(diào)用有且只有一次,用來初始化每個(gè)實(shí)例的 state,在這個(gè)方法里,可以訪問組件的 props。
getInitialState 和 getDefaultPops 的調(diào)用是有區(qū)別的,getDefaultPops 是對(duì)于組件類來說只調(diào)用一次,后續(xù)該類的應(yīng)用都不會(huì)被調(diào)用,而 getInitialState 是對(duì)于每個(gè)組件實(shí)例來講都會(huì)調(diào)用,并且只調(diào)一次。

componentWillMount

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

render

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

componentDidMount

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

存在期

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

  • componentWillReceiveProps
  • shouldComponentUpdate
  • componentWillUpdate
  • render
  • componentDidUpdate

componentWillReceiveProps

組件的 props 屬性可以通過父組件來更改,這時(shí),componentWillReceiveProps 將來被調(diào)用??梢栽谶@個(gè)方法里更新 state,以觸發(fā) render 方法重新渲染組件。

shouldComponentUpdate

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

componentWillUpdate

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

componentDidUpdate

這個(gè)方法和 componentDidMount 類似,在組件重新被渲染之后,componentDidUpdate(object prevProps, object prevState) 會(huì)被調(diào)用??梢栽谶@里訪問并修改 DOM。

銷毀時(shí)

componentWillUnmount

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

  • getInitialState
  • componentWillMount
  • render
  • componentDidMount
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容