1. 程式人生 > >React - 元件的生命週期詳解(及各階段呼叫的方法)

React - 元件的生命週期詳解(及各階段呼叫的方法)

轉自http://www.hangge.com/blog/cache/detail_1473.html

React - 元件的生命週期詳解(及各階段呼叫的方法)

2016-12-22釋出:hangge閱讀:2699

ReactJS 的核心思想是元件化,即按功能封裝成一個一個的元件,各個元件維護自己的狀態和 UI,當狀態發生變化時,會自定重新渲染整個元件,多個元件一起協作共同構成了 ReactJS 應用。

為了能夠更好的建立和使用元件,我們首先要了解元件的生命週期。

一、元件的生命週期

元件在整個 ReactJS 的生命週期中,主要會經歷這4個階段:建立階段、例項化階段、更新階段、銷燬階段。下面對各個階段分別進行介紹。

原文:React - 元件的生命週期詳解(及各階段呼叫的方法)

 

1,建立階段

  • 該階段主要發生在建立元件類的時候,即呼叫 React.createClass 時觸發。
  • 這個階段只會觸發一個 getDefaultProps 方法,該方法返回一個物件並快取起來。然後與父元件指定的 props 物件合併,最後賦值給 this.props 作為該元件的預設屬性。

props屬性介紹:
1,props 是一個物件,是元件用來接收外面傳來的引數的。
2,元件內部是不允許修改自己的 props 屬性,只能通過父元件來修改。上面的 getDefaultProps 方法便是處理 props 的預設值的。

 

2,例項化階段

該階段主要發生在例項化元件類的時候,也就是該元件類被呼叫的時候觸發。這個階段會觸發一系列的流程,按執行順序如下:

(1)getInitialState:初始化元件的 state 的值。其返回值會賦值給元件的 this.state 屬性。

(2)componentWillMount:根據業務邏輯來對 state 進行相應的操作。

(3)render:根據 state 的值,生成頁面需要的虛擬 DOM 結構,並返回該結構。

(4)componentDidMount:對根據虛擬 DOM 結構而生的真實 DOM 進行相應的處理。元件內部可以通過 ReactDOM.findDOMNode(this) 來獲取當前元件的節點,然後就可以像 Web 開發中那樣操作裡面的 DOM 元素了。

state屬性介紹:
它是用來儲存元件自身需要的資料。它是可以改變的,它的每次改變都會引發元件的更新。這也是 ReactJS 中的關鍵點之一。
即每次資料的更新都是通過修改 state 屬性的值,然後 ReactJS 內部會監聽 state 屬性的變化,一旦發生變化,就會觸發元件的 render 方法來更新 DOM 結構。

 

3,更新階段

這主要發生在使用者操作之後或者父元件有更新的時候,此時會根據使用者的操作行為進行相應得頁面結構的調整。這個階段也會觸發一系列的流程,按執行順序如下:

(1)componentWillReceiveProps:當元件接收到新的 props 時,會觸發該函式。在改函式中,通常可以呼叫 this.setState 方法來完成對 state 的修改。

(2)shouldComponentUpdate:該方法用來攔截新的 props 或 state,然後根據事先設定好的判斷邏輯,做出最後要不要更新元件的決定。

(3)componentWillUpdate:當上面的方法攔截返回 true 的時候,就可以在該方法中做一些更新之前的操作。

(4)render:根據一系列的 diff 演算法,生成需要更新的虛擬 DOM 資料。(注意:在 render 中最好只做資料和模板的組合,不應進行 state 等邏輯的修改,這樣元件結構更加清晰)

(5)componentDidUpdate:該方法在元件的更新已經同步到 DOM 中去後觸發,我們常在該方法中做一 DOM 操作。

 

4,銷燬階段

  • 這個階段只會觸發一個叫 componentWillUnmount 的方法。
  • 當元件需要從 DOM 中移除的時候,我們通常會做一些取消事件繫結、移除虛擬 DOM 中對應的元件資料結構、銷燬一些無效的定時器等工作。這些事情都可以在這個方法中處理。

二、完整的樣例

下面通過一個簡單的歡迎資訊元件,來演示元件各個環節的運作流程。同時這裡把元件整個生命週期中所有會觸發的方法都列出來了。

原文:React - 元件的生命週期詳解(及各階段呼叫的方法)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

<!DOCTYPE html>

<html>

<head lang="en">

    <meta charset="UTF-8">

    <title>hangge</title>

    <script type="text/javascript" src="react.js"></script>

    <script type="text/javascript" src="react-dom.js"></script>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.24/browser.min.js"></script>

</head>

<body>

  <div id="example"></div>

  <script type="text/babel">

      var Welcome = React.createClass({

          /* 1.建立階段 */

          //在建立類的時候被呼叫

          getDefaultProps: function() {

              console.log("getDefaultProps");

              return {};

          },

 

          /* 2.例項化階段 */

          //獲取this.state的預設值

          getInitialState: function() {

              console.log("getInitialState");

              return {name: "hangge.com"};

          },

          //元件將要載入,在render之前呼叫此方法

          componentWillMount: function() {

              //業務邏輯的處理都應該放在這裡,比如對state的操作等

              console.log("componentWillMount");

          },

          //渲染並返回一個虛擬DOM

          render: function() {

              console.log("render");

              return (

                      <div>歡迎訪問: {this.state.name}</div>

              );

          },

          //元件完成載入,在render之後呼叫此方法

          componentDidMount: function() {

              //在該方法中,ReactJS會使用render方法返回的虛擬DOM物件來建立真實的DOM結構

              console.log("componentDidMount");

              var node = ReactDOM.findDOMNode(this);

              console.log(node);

          },

 

          /* 3.更新階段 */

          //該方法發生在this.props被修改或父元件呼叫setProps()方法之後

          componentWillReceiveProps: function() {

              console.log("componentWillRecieveProps");

          },

          //是否需要更新

          shouldComponentUpdate: function() {

              console.log("shouldComponentUpdate");

              return true;

          },

          //將要更新

          componentWillUpdate: function() {

              console.log("componentWillUpdate");

          },

          //更新完畢

          componentDidUpdate: function() {

              console.log("componentDidUpdate");

          },

 

          /* 4.銷燬階段 */

          //銷燬時會被呼叫

          componentWillUnmount: function() {

              console.log("componentWillUnmount");

          },

      });

      ReactDOM.render(<Welcome />, document.getElementById('example'));

  </script>

</body>

</html>

控制檯輸出資訊如下(由於樣例中我沒有更新狀態,也沒有銷燬元件。所以也就沒有後面兩個階段):


原文出自:www.hangge.com  轉載請保留原文連結:http://www.hangge.com/blog/cache/detail_1473.html