React 的幾個(gè)注意點(diǎn)

受控組件和無(wú)狀態(tài)組件

  • 非受控組件

    • 推薦使用受控組件來(lái)實(shí)現(xiàn)表單. 在受控組件中, 表單數(shù)據(jù)是有React組件處理
    • 如果讓表單數(shù)據(jù)有DOM處理時(shí), 替代方案為使用非受控組件
    • <input type="text" ref={input =>this._name = input} /> 如是, 不通過(guò)value控制其值,
  • 受控組件

    • <input type="text" value={this.state.name} onChange={this.handleNameChange}/>
    • 以上handleNameChange獲取輸入的值 this.setState({ name: event.target.value }); 賦值給state, 然后在觸發(fā)刷新, 對(duì)用input的value賦新的值
  • 無(wú)狀態(tài)組件

    • 語(yǔ)法簡(jiǎn)潔, 占內(nèi)存小(少了class的諸多屬性), 無(wú)副作用(純函數(shù)), 函數(shù)式寫(xiě)法(柯里化)

    • 函數(shù)式組件: 使用props

      function Welcome(props) { return <h1>Hello, {props.name}</h1>; }

    • 狀態(tài)組件/類組件的優(yōu)點(diǎn):

      • 可以使用this
      • 擁有局部狀態(tài): this.state
      • 聲明周期鉤子

生命周期流程

  • 父子組件嵌套的生命周期, 先初始化父組件, 在父組件的render組件中初始化子組件, 當(dāng)子組件都創(chuàng)建完成后(都完成了componentDidMount方法后) 父組件執(zhí)行componentDidMount

  • 啟動(dòng)過(guò)程

    father constructor
    father componentWillMount
    father render
    son constructor
    son componentWillMount
    son render
    son componentDidMount
    father componentDidMount
    
  • 組件更新過(guò)程

    son componentWillReceiveProps
    son shouldComponentUpdate 根據(jù)返回值 true/false 決定是否繼續(xù)執(zhí)行
    son componentWillUpdate
    son render
    son componentDidUpdate
    

    ?

setState() 執(zhí)行流程, 生命周期.

  • 從源碼全面剖析 React 組件更新機(jī)制---這個(gè)說(shuō)的好,可以多看幾遍

  • 利用隊(duì)列機(jī)制管理state, 避免重復(fù)的view刷新

  • replaceState({}) 會(huì)完全替代原有的state, setState不會(huì)影響未涉及的state

  • 如果組件正處于創(chuàng)建或更新組件階段,則把新的更新放入dirtyComponents稍后處理

    • 故getInitialState,componentWillMount, render,componentWillUpdate 中setState都不會(huì)引起updateComponent。但在componentDidMount和componentDidUpdate中則會(huì)。
  • 主要流程如下

    • 1.enqueueSetState將state放入隊(duì)列中,并調(diào)用enqueueUpdate處理要更新的Component

    • 2.如果組件當(dāng)前正處于update事務(wù)中,則先將Component存入dirtyComponent中。否則調(diào)用batchedUpdates處理。

    • 3.batchedUpdates發(fā)起一次transaction.perform()事務(wù)

    • 4.開(kāi)始執(zhí)行事務(wù)初始化,運(yùn)行,結(jié)束三個(gè)階段

      • 1.初始化:事務(wù)初始化階段沒(méi)有注冊(cè)方法,故無(wú)方法要執(zhí)行

      • 2.運(yùn)行:執(zhí)行setSate時(shí)傳入的callback方法,一般不會(huì)傳callback參數(shù),

      • 3.結(jié)束:更新isBatchingUpdates為false,并執(zhí)行FLUSH_BATCHED_UPDATES這個(gè)wrapper中的close方法

      • FLUSH_BATCHED_UPDATES在close階段,會(huì)循環(huán)遍歷所有的dirtyComponents,調(diào)用updateComponent刷新組件,并執(zhí)行它的pendingCallbacks, 也就是setState中設(shè)置的callback。第二個(gè)參數(shù)?
        
  • 我的理解: setState 修改state是異步操作, 意思就是不能立即獲取this.state 修改的值, 當(dāng)調(diào)用了setState后,把本次操作放入隊(duì)列中, 如果組件未在創(chuàng)建/更新,那么立即執(zhí)行更新流程, 如果組件在刷新,那么本次更新操作放入稍后執(zhí)行的隊(duì)列中等待執(zhí)行.

  • 批處理時(shí)會(huì)把待處理數(shù)組中每一個(gè)操作從第一個(gè)依次傳遞給后一個(gè),直到待處理操作為空,把最后的結(jié)果設(shè)置給state

?著作權(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),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 作為一個(gè)合格的開(kāi)發(fā)者,不要只滿足于編寫(xiě)了可以運(yùn)行的代碼。而要了解代碼背后的工作原理;不要只滿足于自己的程序...
    六個(gè)周閱讀 8,686評(píng)論 1 33
  • 說(shuō)在前面 關(guān)于 react 的總結(jié)過(guò)去半年就一直碎碎念著要搞起來(lái),各(wo)種(tai)原(lan)因(le)。心...
    陳嘻嘻啊閱讀 7,039評(píng)論 7 41
  • 已經(jīng)是高三的下學(xué)期,顧安也每天只睡五個(gè)小時(shí),她不得不拼命,因?yàn)樗芮宄?,這是她唯一能夠咸魚(yú)翻身的機(jī)會(huì)。班上...
    鹿崝閱讀 566評(píng)論 0 0
  • 中老年人在5點(diǎn)半,就生物鐘自動(dòng)醒來(lái)。 熱情飽滿地趕往了老年人活動(dòng)中心~ 發(fā)現(xiàn)太早沒(méi)有開(kāi)門(mén)后,匆匆吃了個(gè)貴價(jià)早餐(1...
    丸子Sophia閱讀 281評(píng)論 0 0
  • 小時(shí)候以為世界就那么大,長(zhǎng)大了才知道,原來(lái)世界沒(méi)有邊界。 開(kāi)始渴望能早早的等來(lái)一班車(chē),哪怕是最后一班,也...
    dumpling_閱讀 224評(píng)論 0 1

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