React的生命週期 和 頁面優化

React的生命週期 和 頁面優化

先上React的生命週期圖
React生命週期圖
頁面優化問題在 shouldComponentUpdate 函數那裏寫的(有顏色備註)

React聲明週期的四個大階段:

  • Initialization:初始化階段。
  • Mounting: 掛在階段。
  • Updation: 更新階段。
  • Unmounting: 銷燬階段。

什麼是生命週期函數

用大神 技術胖 來說就是

生命週期函數指在某一個時刻組件會自動調用執行的函數

階段說明

Initialization指的是初始化過程,這個時候組件會初始化自己的一些數據,比如props,比如state,constructor就是我們初始化的位置,在這裏會定義state,會接收props。 代碼就不上了,大家有興趣可以看看官網文檔 ,也就不過多解釋了

  • 1 Mounting 掛載階段

    Mounting階段叫掛載階段,伴隨着整個虛擬DOM的生成,它裏邊有三個小的生命週期函數,分別是:

     componentWillMount : 在組件即將被掛載到頁面的時刻執行。
     render             : 頁面state或props發生變化時執行。
     componentDidMount  : 組件掛載完成時被執行。
    

執行代碼:

//componentWillMount代碼
	componentWillMount(){
	    console.log('我是componentWillMount--組件將要掛載到頁面的時刻出現')
	}
//componentDidMount代碼
	componentDidMount(){
	    console.log('我是componentDidMount--組件掛載完成的時刻執行出現')
	}
//render代碼  (必寫)
	render(){
	    console.log('我是render-組件掛載中出現')
	}

打印出來的順序是

 - componentWillMount
 - render
 - componentDidMount

注意的問題

componentWillMount和componentDidMount這兩個生命週期函數,只在頁面刷新時執行一次,而render函數是只要有state和props變化就會執行。

  • 2 Updation 更新階段
    Updation也就是組件發生改變的更新階段,這是React生命週期中比較複雜的一部分,它有兩個基本部分組成,一個是props屬性改變,一個是state狀態改變(這個在生命週期的圖片中可以清楚的看到,props比state 只多了一個componentWillReceiveProps 函數)。

    執行代碼:

//	componentWillReceiveProps 函數
//  **注意** 這個是寫在子組件中的 // 因爲頂層組件,它並沒接收任何的props
	componentWillReceiveProps(){
		//凡是組件都有生命週期函數,所以子組件也是有的,並且子組件接收了props,這時候函數就可以被執行了。
        console.log('child - componentWillReceiveProps')
    }

子組件接收到父組件傳遞過來的參數,父組件render函數重新被執行,這個生命週期就會被執行。

  • 也就是說這個組件第一次存在於Dom中,函數是不會被執行的;
  • 如果已經存在於Dom中,函數纔會被執行。
//shouldComponentUpdate函數代碼
//它要求返回一個布爾類型的結果,必須有返回值,這裏就直接返回一個true
	shouldComponentUpdate(){
	    console.log('shouldComponentUpdate---組件發生改變前執行')
	    return true
	}

這裏寫一下shouldComponentUpdate的重要性 也是頁面標題寫的 頁面優化問題

  • shouldComponentUpdate函數會在組件更新之前,自動被執行。
  • 它要求返回一個布爾類型的結果,必須有返回值,truefalse
  • 簡單點說,就是返回true,就同意組件更新;返回false,就反對組件更新。

頁面優化問題

在子組件頻繁無用渲染render,這樣項目小的話 看上去沒有問題性能損耗很小,但是當你頁面很複雜時,足以影響用戶體驗,積少成多嘛,性能損耗會增加 頁面會卡頓,肯定會被組長或總監罵死的;
這裏用shouldComponentUpdate 就能解決了

首先你要確認你安裝了谷歌 React Developer Tools 插件,如果你沒有安裝,可以到百度一下安裝。有了這個瀏覽器插件,就可以在控制檯中找到React標籤,然後在右邊點開設置,選中highlight Updates。
這時候你在瀏覽器的文本框中輸入一下內容,你可以清楚的看到子組件也發生了重新render的情況。

代碼如下:

	shouldComponentUpdate(){
	    return false;
	}

這時候在瀏覽器中查看,問題已經沒有了。但是這樣做太暴力了,否定了所有的東西,那如果在真實項目中,需要改變值屬性值,達到渲染就沒辦法了

shouldComponentUpdate有兩個參數(相當有用):

 1. nextProps:變化後的屬性;
 2. nextState:變化後的狀態;
//示例
	shouldComponentUpdate(nextProps,nextState){
		//content 父傳過來的數據 可以按自己項目需求寫
	    if(nextProps.content !== this.props.content){ 
	        return true
	    }else{
	        return false
	    }
	}

這樣就解決了子組件的渲染性能問題

我們接着說 Updation 後面的倆個函數 componentWillUpdatecomponentDidUpdate

componentWillUpdate在組件更新之前,但shouldComponenUpdate之後被執行。但是如果shouldComponentUpdate返回false,這個函數就不會被執行了。

//componentWillUpdate函數 代碼
	//shouldComponentUpdate返回true纔會被執行。
	componentWillUpdate(){
	    console.log('componentWillUpdate---組件更新前,shouldComponentUpdate函數之後執行')
	}

//componentDidUpdate函數 代碼
//componentDidUpdate在組件更新之後執行,它是組件更新的最後一個環節。
	componentDidUpdate(){
	    console.log('componentDidUpdate----組件更新之後執行')
	}

打印出來的順序是

 - 1、shouldComponentUpdate
 - 2、componentWillUpdate
 - 3、render
 - 4、componentDidUpdate
  • 3 Unmounting 銷燬階段
    把最後一個React的生命週期函數講一下,這個生命週期周期函數就是componentWillUnmount,它是在組件去除時執行。

這個函數時組件從頁面中刪除的時候執行 (子組件)

//當組件從頁面中刪除的時候執行
	componentWillUnmount(){
	    console.log('child - componentWillUnmount')
	}








這裏好多都是聽大神 技術胖講的 自己整理的 ,有興趣的朋友去看看

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章