react-native的組件生命周期

react-native的組件生命周期

組件的相關(guān)方法

render

每個組件必須提供render方法妈拌。說該函數(shù)不修改組件的 state庆聘,你也可以返回 null 或者 false 來表明不需要渲染任何東西

  • 不要在render()函數(shù)中做復(fù)雜的操作铜犬,更不要進(jìn)行網(wǎng)絡(luò)請求匣掸,數(shù)據(jù)庫讀寫霸琴,I/O等操作播聪。

getInitialState

初始化組件狀態(tài)朽基,在組件掛載之前調(diào)用一次。返回值將會作為 this.state的初始值离陶。

getDefaultProps

該方法在任何實(shí)例創(chuàng)建之前調(diào)用稼虎,因此不能依賴于 this.props。另外招刨,getDefaultProps() 返回的任何復(fù)雜對象將會在實(shí)例間共享霎俩,而不是每個實(shí)例擁有一份拷貝。

PropTypes

propTypes 對象用于驗(yàn)證傳入到組件的 props沉眶,為類型檢查

statics

statics 對象允許你定義靜態(tài)的方法打却,這些靜態(tài)的方法可以在組件類上調(diào)用

var MyComponent = React.createClass({
  statics: {
    customMethod: function(foo) {
      return foo === 'bar';
    }
  },
  render: function() {
  }
});
MyComponent.customMethod('bar');  // true

在這個塊兒里面定義的方法都是靜態(tài)的,你可以通過ClassName.funcationName的形式調(diào)用它谎倔。
這些方法不能獲取組件的 props 和 state柳击。如果你想在靜態(tài)方法中檢查 props 的值,在調(diào)用處把 props 作為參數(shù)傳入到靜態(tài)方法片习。

isMounted

boolean isMounted()捌肴,當(dāng)組件被渲染到DOM蹬叭,該方法返回true,否則返回false状知。該方法通常用于異步任務(wù)完成后修改state前的檢查秽五,以避免修改一個沒有被渲染的組件的state。
但是不推薦這種方式试幽,等下講完周期后我們再來看這個問題

當(dāng)componentDidMount被調(diào)用時該變量為true筝蚕,當(dāng) componentWillUnmount被調(diào)用時,該變量為false铺坞,這樣該變量就可以當(dāng)isMounted()來使用起宽。但還不夠,到目前為止济榨,我們只是通過變量來替代isMounted()坯沪,還沒有做任何的優(yōu)化,接下來我們需要在componentWillUnmount被調(diào)用時取消所有的異步回調(diào)擒滑,主動釋放所有資源腐晾,這樣就能避免被卸載的組件還持有資源的引用的情況,從而減少了內(nèi)存溢出等情況的發(fā)生丐一。

組件的生命周期

分成三個狀態(tài):

  • Mounting:已插入真實(shí) DOM
  • Updating:正在被重新渲染
  • Unmounting:已移出真實(shí) DOM
    [站外圖片上傳中...(image-e2f3a-1522160563385)]

componentWillMount

初始化了狀態(tài)之后藻糖,在第一次繪制 render() 之前

componentDidMount

組件第一次繪制之后,會調(diào)用 componentDidMount()库车,通知組件已經(jīng)加載完成
這個函數(shù)調(diào)用的時候巨柒,其虛擬 DOM 已經(jīng)構(gòu)建完成,你可以在這個函數(shù)開始獲取其中的元素或者子組件了

componentWillReceiveProps

如果組件收到新的屬性(props)柠衍,就會調(diào)用 componentWillReceiveProps()

void componentWillReceiveProps(  
  object nextProps
)

輸入?yún)?shù) nextProps 是即將被設(shè)置的屬性洋满,舊的屬性還是可以通過 this.props 來獲取。在這個回調(diào)函數(shù)里面珍坊,你可以根據(jù)屬性的變化牺勾,通過調(diào)用 this.setState() 來更新你的組件狀態(tài),這里調(diào)用更新狀態(tài)是安全的阵漏,并不會觸發(fā)額外的 render() 調(diào)用

shouldComponentUpdate

當(dāng)組件接收到新的屬性和狀態(tài)改變的話驻民,都會觸發(fā)調(diào)用 shouldComponentUpdate

boolean shouldComponentUpdate(  
  object nextProps, object nextState
)

輸入?yún)?shù) nextProps 和上面的 componentWillReceiveProps 函數(shù)一樣,nextState 表示組件即將更新的狀態(tài)值履怯。這個函數(shù)的返回值決定是否需要更新組件回还,如果 true 表示需要更新,繼續(xù)走后面的更新流程虑乖。否者懦趋,則不更新,直接進(jìn)入等待狀態(tài)疹味。通過檢查變化前后屬性和狀態(tài)仅叫,來決定 UI 是否需要更新帜篇,能有效提高應(yīng)用性能

componentWillUpdate

如果組件狀態(tài)或者屬性改變,并且上面的 shouldComponentUpdate(...) 返回為 true诫咱,就會開始準(zhǔn)更新組件笙隙,并調(diào)用 componentWillUpdate()

void componentWillUpdate(  
  object nextProps, object nextState
)

在這個回調(diào)中,可以做一些在更新界面之前要做的事情坎缭。需要特別注意的是竟痰,在這個函數(shù)里面,你就不能使用 this.setState 來修改狀態(tài)掏呼。這個函數(shù)調(diào)用之后坏快,就會把 nextProps 和 nextState 分別設(shè)置到 this.props 和 this.state 中。緊接著這個函數(shù)憎夷,就會調(diào)用 render() 來更新界面了

componentDidUpdate

調(diào)用了 render() 更新完成界面之后莽鸿,會調(diào)用 componentDidUpdate() 來得到通知

void componentDidUpdate(  
  object prevProps, object prevState
)

因?yàn)榈竭@里已經(jīng)完成了屬性和狀態(tài)的更新了,此函數(shù)的輸入?yún)?shù)變成了 prevProps 和 prevState拾给。

componentWillUnmount

當(dāng)組件要被從界面上移除的時候祥得,就會調(diào)用 componentWillUnmount()〗茫可以做一些組件相關(guān)的清理工作级及,例如取消計時器、網(wǎng)絡(luò)請求等

生命周期 調(diào)用次數(shù) 能否使用 setSate()
getDefaultProps 1
getInitialState 1
componentWillMount 1
render >=1
componentDidMount 1
componentWillReceiveProps >=0
shouldComponentUpdate >=0
componentWillUpdate >=0
componentDidUpdate >=0
componentWillUnmount 1
export default class LifeCycleComponent extends Component {

    constructor(props) {
        super(props);
        console.log(" --- LifeCycleComponent --- 構(gòu)造函數(shù) ")
        this.state={
            count:0,
        }
    }

    componentWillMount() {
        console.log(" --- LifeCycleComponent --- componentWillMount 只調(diào)用一次额衙,在初始化渲染執(zhí)行之前立刻調(diào)用 ")
    }

    componentDidMount() {
        console.log(" --- LifeCycleComponent --- componentDidMount 在初始化渲染執(zhí)行之后立刻調(diào)用一次 ")
    }

    componentWillReceiveProps(nextProps) {
        console.log(" --- LifeCycleComponent --- componentWillReceiveProps 初始化后 在組件接收到新的 props 的時候調(diào)用 ")
    }

    //該方法在初始化渲染的時候不會調(diào)用饮焦,在使用 forceUpdate 方法的時候也不會。如果確定新的 props 和 state 不會導(dǎo)致組件更新入偷,則此處應(yīng)該 返回 false
    shouldComponentUpdate(nextProps, nextState) {
        console.log(" --- LifeCycleComponent --- shouldComponentUpdate 在接收到新的 props 或者 state追驴,將要渲染之前調(diào)用 ")
        return true;
    }

    componentWillUpdate(nextProps, nextState) {
        console.log(" --- LifeCycleComponent --- componentWillUpdate 在接收到新的 props 或者 state 之前立刻調(diào)用 ")
    }

    componentDidUpdate(prevProps, prevState) {
        console.log(" --- LifeCycleComponent ---  componentDidUpdate 在組件的更新已經(jīng)同步到 DOM 中之后立刻被調(diào)用 ")
    }

    componentWillUnmount() {
        console.log(" --- LifeCycleComponent --- componentWillUnmount 在組件從 DOM 中移除的時候立刻被調(diào)用")
    }

    render() {
        console.log(" --- LifeCycleComponent --- render")
        return <View>
            <Text
                style={{fontSize:40,backgroundColor:'red'}}
                onPress={() => this.dotask()}>
                揍你</Text>
            <Text  style={{fontSize:40,backgroundColor:'yellow'}}>被打了{(lán)this.state.count}次</Text>
        </View>;
    }

    dotask(){
        this.setState({
            count:this.state.count+1,
        });
        CustomToast.show('揍你'+this.state.count+'次',CustomToast.SHORT);
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末械哟,一起剝皮案震驚了整個濱河市疏之,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌暇咆,老刑警劉巖锋爪,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異爸业,居然都是意外死亡其骄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門扯旷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拯爽,“玉大人,你說我怎么就攤上這事钧忽√号冢” “怎么了逼肯?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長桃煎。 經(jīng)常有香客問我篮幢,道長,這世上最難降的妖魔是什么为迈? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任三椿,我火速辦了婚禮,結(jié)果婚禮上葫辐,老公的妹妹穿的比我還像新娘搜锰。我一直安慰自己,他們只是感情好耿战,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布纽乱。 她就那樣靜靜地躺著,像睡著了一般昆箕。 火紅的嫁衣襯著肌膚如雪鸦列。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天鹏倘,我揣著相機(jī)與錄音薯嗤,去河邊找鬼。 笑死纤泵,一個胖子當(dāng)著我的面吹牛骆姐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播捏题,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼玻褪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了公荧?” 一聲冷哼從身側(cè)響起带射,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎循狰,沒想到半個月后窟社,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绪钥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年灿里,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片程腹。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡匣吊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情色鸳,我是刑警寧澤侣灶,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站缕碎,受9級特大地震影響褥影,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜咏雌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一凡怎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赊抖,春花似錦统倒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至报亩,卻和暖如春浴鸿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背弦追。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工岳链, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人劲件。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓掸哑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親零远。 傳聞我的和親對象是個殘疾皇子苗分,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

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