1. 程式人生 > >【一起來學React】- 生命週期

【一起來學React】- 生命週期

本文為系列文章首發於我的部落格:https://www.fakin.cn

上一章我們講了一些react的基礎知識,咱們這一章來說個好玩點的東西,react的生命週期(這一章基本是都是理論)
為了文章更加清晰簡單,示例程式碼都是直接貼出,並不是真實情況的,
下面圖片,都為上一章todolist的輸出!

元件生命週期

React元件的生命週期可分成三個狀態:

    Mounting:已插入真實 DOM
    Updating:正在被重新渲染
    Unmounting:已移出真實 DOM

下面我們來看下每個狀態詳細的生命週期函式

Mounting

    componentWillMount->當元件即將掛載到頁面
    componentDidMount->當元件被掛載到頁面後

其實我覺得render函式也是生命週期,一個完整的Mounting應該是這樣的:

    componentWillMount->render->componentDidMount
class App extends Component {
    constructor(props) {
        super(props);
    }
    render() {
        console.log
('render') } componentWillMount(){ console.log('componentWillMount') } componentDidMount(){ console.log('componentDidMount') } } export default App;

這時我們來看控制檯列印的結果,如下所示:
在這裡插入圖片描述

我想這下應該明白了Mounting狀態下的兩個(不算render)生命週期函式的具體意義了!其實從字面意思也能理解的~

Updating

顧名思義,明顯就是升級、更新的意思,Updating就是元件更新的狀態,這個狀態下生命週期函式就有點多了!
在react的Updating狀態下分別有props和states兩種型別的生命週期函式!

props:

     componentWillReceiveProps:當一個元件從父元件接收了引數(props),只有父元件的render函式被重新執行了,子元件的componentWillReceiveProps函式就會被執行
     shouldComponentUpdate:元件更新之前自動執行函式(要求返回一個布林值必須,必須告訴react元件是否要更新)
     componentWillUpdate:元件更新之前自動執行,但是他在shouldComponentUpdate執行後返回true之後才執行,如果shouldComponentUpdate返回false不執行
     componentDidUpdate:元件更新完成之後

states:

    shouldComponentUpdate:元件更新之前自動執行函式(要求返回一個布林值必須,必須告訴react元件是否要更新)
    componentWillUpdate:元件更新之前自動執行,但是他在shouldComponentUpdate執行後返回true之後才執行,如果shouldComponentUpdate返回false不執行
    componentDidUpdate:元件更新完成之後

其實props比起states的生命週期函式就多了一個componentWillReceiveProps而已,其他都是一樣的!

一個完整的Updating應該是這樣的:

    (componentWillReceiveProps)->shouldComponentUpdate(true)->componentWillUpdate-componentDidUpdate

其中componentWillReceiveProps需要特殊對待!只有在子元件接收了父元件的引數,並且父元件render重新執行才會觸發這個,所以我寫在括號裡面了!

class App extends Component {
    constructor(props) {
        super(props);
    }
    componentWillReceiveProps() {
        console.log('componentWillReceiveProps')
    }
    render(){
        console.log('render')
    }
    shouldComponentUpdate(){
        console.log('shouldComponentUpdate')
        return true
    }
    componentWillUpdate(){
        console.log('componentWillUpdate')
    }
    componentDidUpdate(){
        console.log('componentDidUpdate')
    }
}

export default App;

ps:由於componentWillReceiveProps需要在子元件中,這裡直接和其他的函式寫的一起是為了看著更方便,真實的開發環境是在子元件下。
如圖

在這裡插入圖片描述
看上圖可以看到,紅色是Mounting狀態下的,而橘色是Updating狀態下的,但是為什麼只有四個生命週期函數了?
其實很簡單,componentWillReceiveProps這裡是肯定不會輸出的,原因嘛,你看上文對於componentWillReceiveProps的解釋

在這裡插入圖片描述
此圖可以得到全部Updating狀態的生命週期,
這裡的生命週期,控制檯輸入的順序,大家可以用之前我的todoList的案例去輸出下,一定要去試一下哦~

Unmounting

之前說的mounting是掛載,那麼Unmounting反過來就是解除安裝嘛,這個狀態下只有一個生命週期函式。
componentWillUnmount->當元件在頁面中即將被剔除時自動執行。
這個咱們可以去控制檯輸入看下。
(為了更好的理解,一下程式碼為子元件程式碼)

class Test extends Component {
    constructor(props) {
        super(props);
        this.state={
        }
    }
    render() {
        console.log('render')
    }
   componentWillUnmount(){
        console.log('componentWillUnmount')
   }
}

在這裡插入圖片描述
componentWillUnmount,在這張圖上是不存在的,因為你這個生命週期是在子元件定義的,子元件還沒有被解除安裝呢?

當我點選list的x的時候,那麼就是子元件被解除安裝的時候,接下來你在看
在這裡插入圖片描述
這樣是不是就有componentWillUnmount輸出了!

總結:

1、render函式會在props和state改變的時候自動重新執行
2、componentWillReceiveProps是父元件傳遞props給子元件的時候才觸發(當然有時候也會在父元件觸發,componentWillReceiveProps會有一些bug例如觸發多次等,所以react16中建議用getDerivedStateFromProps 替換 componentWillReceiveProps)
3、生命週期不難,只是需要全部死記硬背下來!

ps:文章的示例程式碼並不是真實生產的程式碼,只是為了更好理解,圖片中的輸出為上一章todolist例項輸出!