1. 程式人生 > >React元件生命週期

React元件生命週期

React元件在生命週期裡面大概有兩種情況,一種是初次渲染,一種是狀態更新導致再次渲染。咱們從元件生命週期的每一步可進行的操作的角度來了解一下。

初次渲染

  1. 建構函式,指定This,初始狀態,繫結函式(constructor)
       constructor(props){
                //指定This
		super(props)  
               //設定初始化狀態
		this.state={
			value:'',
			focus:false
			}
               //為元件上的函式繫結this
		this.handleChange = this.handleChange.bind(this);
	}複製程式碼

建構函式在元件初次渲染的時候只執行一次,建構函式裡面進行的操作大概有上述程式碼的三種操作。

2.元件安裝(componentWillMount)


void componentWillMount()複製程式碼

在元件掛載之前呼叫一次。在這個函式裡面你可以呼叫setState方法設定元件state,然後經過render函式渲染可以得到state被設定之後的效果。

3.元件生成DOM,必須JSX規則(render)

render(){
		return(
			<div className="FilterableProductTable">
			   <SearchBar value={this.state.value} handleChange={this.handleChange} handleFocus={this.handleFocus} handleOnblur={ this.handleOnblur}/>
			   <ProductTable data={this.props.JsonData} focus={this.state.focus} value={this.state.value} handleSelect={this.handleSelect}/>
			</div>
		);
	}複製程式碼

這個 render 方法必須要返回一個 JSX 元素。 必須要用一個外層的 JSX 元素把所有內容包裹起來,返回並列多個 JSX 元素是不合法的.在這裡render函式只調用一次

4.查詢DOM或者請求資料(componentDidMount

void componentDidMount()複製程式碼

在第一次渲染後呼叫,此時元件已經生成了對應的DOM結構,可以通過this.getDOMNode()來進行訪問。 

如果你想和其他JavaScript框架一起使用,可以在這個方法中呼叫setTimeout, setInterval或者傳送AJAX請求等操作(防止異部操作阻塞UI)

元件的二次渲染

導致元件進行二次渲染的原因一般有三種

  • 父元件的props發生更新
  • 呼叫this.forceUpdate,(呼叫 forceUpdate() 會導致元件跳 shouldComponentUpdate() ,直接呼叫 render()。 )
  • 呼叫this.setState (並不是一次setState會觸發一次render,React可能會合並操作,再一次性進行render)

1.父元件的props發生更新


void componentWillReceiveProps(nextProps)複製程式碼

props是父元件傳遞給子元件的。當子元件接受到nextProps時,不管這個props與原來的是否相同都會執行該方法。


bool shouldComponentUpdate(nextProps, nextState)複製程式碼

shouldComponentUpdate方法接收一個新的props和state,函式返回一個bool型別資料決定是否更新元件。如果返回false,則不進行更新。如果返回true,則進入下一環節。通常情況下為了優化,我們需要對新的props以及state和原來的資料作對比,如果發生變化。一般用immutable ,判斷如下

import React, { Component } from 'react';
import { is, fromJS } from 'immutable';
shouldComponentUpdate(nextProps, nextState) {
    return !is(fromJS(this.props), fromJS(nextProps))|| !is(fromJS(this.state),fromJS(nextState))
  }複製程式碼

當元件決定繼續更新時,會進入componentWillUpdate方法


void componentWillUpdate(nextProps, nextState)複製程式碼

之後執行render函式更新DOM

ReactElement render()複製程式碼

執行完render函式之後執行componentDidUpdata,


void componentDidUpdate()複製程式碼

除了首次render之後呼叫componentDidMount,其它render結束之後都是呼叫componentDidUpdate

當元件需要被解除安裝的時候,呼叫 componentWillUnmount 方法


void componentWillUnmount()複製程式碼

一般在componentDidMount裡面註冊的事件需要在這裡刪除。

2.呼叫this.forceUpdate更新(重複componentWillUpdate方法之後的操作)

當元件呼叫forceUpdata方法更新時,會進入componentWillUpdate方法。直接跳過shouldComponentUpdta

void componentWillUpdate(nextProps, nextState)複製程式碼

之後執行render函式更新DOM

ReactElement render()複製程式碼

執行完render函式之後執行componentDidUpdata,

void componentDidUpdate()複製程式碼

除了首次render之後呼叫componentDidMount,其它render結束之後都是呼叫componentDidUpdate

當元件需要被解除安裝的時候,呼叫 componentWillUnmount 方法

void componentWillUnmount()複製程式碼

一般在componentDidMount裡面註冊的事件需要在這裡刪除。

3.呼叫this.setState方法更新元件state,觸發元件更新

呼叫this.setState()方法更新元件state,首先會觸發shouldComponentUpdata(nextProps,nextState)

在方法判斷過後,決定是否更新。更新的操作和呼叫this.forceUpdate更新的操作是一樣的。

下面給大家一張元件的生命週期的圖,這張圖是我根據自己的理解以及日常操作用到的情況畫出來的。歡迎大家提出自己的見解,如有不正確的地方歡迎大家提出批評以及修改意見。謝謝。

作者:IT白菜 連結:https://juejin.im/post/5afe32cd6fb9a07ab5092213 來源:掘金 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。