摘要:組件是否應(yīng)當(dāng)渲染新的或,返回表示跳過后續(xù)的生命周期方法,通常不需要使用以避免出現(xiàn)。組件銷毀生命周期函數(shù)的淵源自定義組件的生命周期主要通過三種狀態(tài)進(jìn)行管理,它們負(fù)責(zé)通知組件當(dāng)前所處的狀態(tài),應(yīng)該執(zhí)行生命周期中的哪個步驟,是否可以更新。
生命周期有哪些以及用法 首次實(shí)例化
getDefaultProps
作用于組件類,只調(diào)用一次,返回對象用于設(shè)置默認(rèn)的props,對于引用值,會在實(shí)例中共享
getInitialState
作用于組件的實(shí)例,在實(shí)例創(chuàng)建時調(diào)用一次,用于初始化每個實(shí)例的state,此時可以訪問this.props。
componentWillMount
在完成首次渲染之前調(diào)用,此時仍可以修改組件的state。
reader
必選的方法,創(chuàng)建虛擬DOM,該方法具有特殊的規(guī)則:
只能通過this.props和this.state訪問數(shù)據(jù)
可以返回null、false或任何React組件
只能出現(xiàn)一個頂級組件(不能返回數(shù)組)
不能改變組件的狀態(tài)
componentDidMount
真實(shí)的DOM被渲染出來后調(diào)用,在該方法中可通過this.getDOMNode()訪問到真實(shí)的DOM元素。此時已可 以使用其他類庫來操作這個DOM。
在服務(wù)端中,該方法不會被調(diào)用。
getInitialState
componentWillMount
render
componentDidMount
組件已存在時的狀態(tài)改變componentWillReciveProps
組件接收到新的props時調(diào)用,并將其作為參數(shù)nextProps使用,此時可以更改組件props及state。
shouldComponentUpdate
組件是否應(yīng)當(dāng)渲染新的props或state,返回false表示跳過后續(xù)的生命周期方法,通常不需要使用以避免出現(xiàn)bug。在出現(xiàn)應(yīng)用的瓶頸時,可通過該方法進(jìn)行適當(dāng)?shù)膬?yōu)化。
在首次渲染期間或者調(diào)用了forceUpdate方法后,該方法不會被調(diào)用
componentWillUpdate
接收到新的props或者state后,進(jìn)行渲染之前調(diào)用,此時不允許更新props或state。
render
componentDidUpdate
完成渲染新的props或者state后調(diào)用,此時可以訪問到新的DOM元素。
componentWillUnmount
生命周期函數(shù)的淵源自定義組件(ReactCompositeComponent)的生命周期主要通過三種狀態(tài)進(jìn)行管理:MOUNTING、RECEIVE_PROPS、UNMOUNTING,它們負(fù)責(zé)通知組件當(dāng)前所處的狀態(tài),應(yīng)該執(zhí)行生命周期中的哪個步驟,是否可以更新 state。三個狀態(tài)對應(yīng)三種方法,分別為:mountComponent、updateComponent、unmountComponent,每個方法都提供了兩種處理方法
getDefaultProps
這個生命周期函數(shù)是在組件初始化構(gòu)造函數(shù)中執(zhí)行,所以只執(zhí)行一次
// 構(gòu)造函數(shù) var Constructor = function(props, context) { this.props = props; this.context = context; this.state = null; var initialState = this.getInitialState ? this.getInitialState() : null; this.state = initialState; };狀態(tài)一:MountComponent
由于react構(gòu)建的是虛擬DOM所以要準(zhǔn)備開始渲染頁面之前拿到的虛擬的DOM,需要經(jīng)過組裝之后然后給到瀏覽器,在這里會發(fā)生:首先會通過getInitialState拿到初始化的數(shù)據(jù)
// 當(dāng)前狀態(tài)為 MOUNTING this._compositeLifeCycleState = CompositeLifeCycle.MOUNTING; // 當(dāng)前元素對應(yīng)的上下文 this.context = this._processContext(this._currentElement._context); // 當(dāng)前元素對應(yīng)的 props this.props = this._processProps(this.props); // 獲取初始化 state this.state = this.getInitialState();
然后判斷如果有componentwillMount就會運(yùn)行這里的js語法,在這里如果有state發(fā)生變化不會馬上出發(fā)render而是與initialState進(jìn)行,組成新的state;這里渲染的時候是通過遞歸的方式進(jìn)行渲染所以父組件的componentWillMount在子組件的componentWillMount之前執(zhí)行,而子組件的componentDidMount在父組件的componentDidMount之前執(zhí)行,這塊可能有點(diǎn)繞,直接上代碼
// render 遞歸渲染 var markup = this._renderedComponent.mountComponent( rootID, transaction, mountDepth + 1 );
這樣就把dom與state以及props數(shù)據(jù)拿到就可以完整的進(jìn)行渲染
最后判斷是否有componentDidMount,如果有會執(zhí)行這里的js
狀態(tài)二:receive PropsupdateComponent 負(fù)責(zé)管理生命周期中的 componentWillReceiveProps、shouldComponentUpdate、componentWillUpdate、render 和 componentDidUpdate。
compnentWillReciveProps中setState在componentWillReceiveProps、shouldComponentUpdate 和 componentWillUpdate 中還是無法獲取到更新后的 this.state,即此時訪問的this.state 仍然是未更新的數(shù)據(jù),只有在 render 和 componentDidUpdate 中才能獲取到更新后的this.state。
禁止在 shouldComponentUpdate 和 componentWillUpdate 中調(diào)用 setState,會造成循環(huán)調(diào)用,直至耗光瀏覽器內(nèi)存后崩潰。(如果在 shouldComponentUpdate 或 componentWillUpdate 中調(diào)用 setState,此時的狀態(tài)已經(jīng)從 RECEIVING_PROPS -> NULL,則 performUpdateIfNecessary 就會調(diào)用 updateComponent 進(jìn)行組件更新,但 updateComponent 又會調(diào)用 shouldComponentUpdate 和 componentWillUpdate,因此造成循環(huán)調(diào)用,使得瀏覽器內(nèi)存占滿后崩潰。)
狀態(tài)三:unMountComponent在 componentWillUnmount 中調(diào)用 setState,是不會觸發(fā) reRender。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/92547.html
摘要:總結(jié)其實(shí),這個和的思想有很大的淵源,不推薦繼承,而是推薦組合,而就是其中的典范。比如我們寫了兩個個高階組件,一個是,一個是,組件就可以隨意的在和之間隨意切換,而不需要改動組件原有代碼。 0x000 概述 高階函數(shù)組件...還是一個函數(shù),和函數(shù)組件不同的是他返回了一個完整的組件...他返回了一個class!??! 0x001 直接上栗子 照常,先寫個App組件,外部傳入一個theme ...
摘要:理解這個統(tǒng)一標(biāo)準(zhǔn)的不符規(guī)范的資源沒有統(tǒng)一實(shí)踐一個例子圖書管理系統(tǒng)技術(shù)棧前端后端要點(diǎn)驗(yàn)證前端路由統(tǒng)一的請求響應(yīng)攔截處理權(quán)限控制表級對象級如下圖最后,是否要做前后端分離的開發(fā)模式,取決于實(shí)際情況的多方位考量,適合的才是更好的。 所謂的前后端分離 淵源 前端發(fā)展史 特點(diǎn) 前端:負(fù)責(zé) View 和 Controller 層 后端:只負(fù)責(zé) Model 層,業(yè)務(wù)處理/數(shù)據(jù)等 優(yōu)缺點(diǎn) 優(yōu)點(diǎn):解...
摘要:因?yàn)樽舆M(jìn)程一定不會是組長進(jìn)程,所以子進(jìn)程可以調(diào)用。主進(jìn)程退出子進(jìn)程繼續(xù)執(zhí)行啦啦啦,啦啦啦,啦啦啦,已經(jīng)變成啦,開心一般服務(wù)器軟件都有寫配置項,比如以模式運(yùn)行還是以模式運(yùn)行。 [原文地址:https://blog.ti-node.com/blog...] 其實(shí)前面是談過一次daemon進(jìn)程的,但是并涉及過多原理,但是并不影響使用。今天打算說說關(guān)于daemon進(jìn)程更多的二三事,本質(zhì)上說,如...
摘要:也就是說,如果能處理名為的這個高階組件返回的組件則完全無視這個。先展示我是一個組件,我設(shè)置了兩秒,之后展示倒計時完成 概況: 什么是高階組件? 高階部件是一種用于復(fù)用組件邏輯的高級技術(shù),它并不是 React API的一部分,而是從React 演化而來的一種模式。 具體地說,高階組件就是一個接收一個組件并返回另外一個新組件的函數(shù)! 這是官方文檔說的,我沒有截全,因?yàn)楹竺娴慕忉寱斐烧`解...
摘要:組件裝載過程裝載過程依次調(diào)用的生命周期函數(shù)中每個類的構(gòu)造函數(shù),創(chuàng)造一個組件實(shí)例,當(dāng)然會調(diào)用對應(yīng)的構(gòu)造函數(shù)。組件需要構(gòu)造函數(shù),是為了以下目的初始化,因?yàn)樯芷谥腥魏魏瘮?shù)都有可能訪問,構(gòu)造函數(shù)是初始化的理想場所綁定成員函數(shù)的環(huán)境。 React系列---React(一)初識ReactReact系列---React(二)組件的prop和stateReact系列---之React(三)組件的生...
閱讀 3886·2021-11-25 09:43
閱讀 2282·2021-11-23 10:13
閱讀 902·2021-11-16 11:44
閱讀 2433·2019-08-29 17:24
閱讀 1456·2019-08-29 17:17
閱讀 3537·2019-08-29 11:30
閱讀 2651·2019-08-26 13:23
閱讀 2408·2019-08-26 12:10