1. 程式人生 > >vue生命週期和react生命週期對比

vue生命週期和react生命週期對比

一 vue的生命週期如下圖所示(很清晰)初始化、編譯、更新、銷燬

 

二 vue生命週期的栗子

 注意觸發vue的created事件以後,this便指向vue例項,這點很重要

複製程式碼
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>vue生命週期</title>
        <script src="../js/vue.js"></script>
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
    </head>
    <body>
        <div class="test" style="border: 1px black dashed;padding: 8px;">
            {{a}}
        </div>
        <div class="test2" style="border: 1px red solid;margin-top: 10px;padding: 8px;">
            我是內容二
        </div>
        <script type="text/javascript">
            var myVue = new Vue({
                el: ".test",
                data: {
                    a: "我是內容,在控制檯輸入myVue.a=123456,可以改變我的值"
                },
                created: function () { 
                    //在例項建立之後同步呼叫。此時例項已經結束解析選項,這意味著已建立:資料繫結,計算屬性,方法,watcher/事件回撥。
                    //但是還沒有開始 DOM 編譯,$el 還不存在,但是例項存在,即this.a存在,可打印出來 。
                    console.log("建立");
                },
                beforeCompile: function () {
                    console.log("未開始編譯");
                },
                compiled: function () { 
                    //在編譯結束後呼叫。此時所有的指令已生效,因而資料的變化將觸發 DOM 更新。但是不擔保 $el 已插入文件。
                    console.log("編譯完成");
                },
                ready: function () { 
                    //在編譯結束和 $el 第一次插入文件之後呼叫,如在第一次 attached 鉤子之後呼叫。注意必須是由 Vue 插入(如 vm.$appendTo() 等方法或指令更新)才觸發 ready 鉤子。
                    console.log("一切準備好了");
                },
                attached :function () {  //myVue.$appendTo(".test2")暫時觸發不了,不知道怎麼解決
                    //在 vm.$el 插入 DOM 時呼叫。必須是由指令或例項方法(如 $appendTo())插入,直接操作 vm.$el 不會 觸發這個鉤子。
                    console.log("插入DOM成功");
                },
                detached :function () { //觸發事件 myVue.$destroy(true),其中引數true控制是否刪除DOM節點或者myVue.$remove()
                    //在 vm.$el 從 DOM 中刪除時呼叫。必須是由指令或例項方法刪除,直接操作 vm.$el 不會 觸發這個鉤子。
                    console.log("刪除DOM成功");
                },
                beforeDestroy: function () {  //觸發方式,在console裡面打myVue.$destroy();
                    //在開始銷燬例項時呼叫。此時例項仍然有功能。
                    console.log("銷燬前");
                },
                destroyed: function () {   //觸發方式,在console裡面打myVue.$destroy();其中myVue.$destroy(true)是刪除DOM節點,會觸發detached函式,但是例項仍然存在
                    //在例項被銷燬之後呼叫。此時所有的繫結和例項的指令已經解綁,注意是解綁不是銷燬,所有的子例項也已經被銷燬。
                    console.log("已銷燬");
                }
        });
        </script>
    </body>
</html>
複製程式碼

一、react生命週期

React 生命週期分為三種狀態 1. 初始化 2.更新 3.銷燬

  • 初始化

1、getDefaultProps()

設定預設的props,也可以用ufaultProps設定元件的預設屬性.

2、getInitialState()

在使用es6的class語法時是沒有這個鉤子函式的,可以直接在constructor中定義this.state。此時可以訪問this.props

3、componentWillMount()

元件初始化時只調用,以後元件更新不呼叫,整個生命週期只調用一次,此時可以修改state。

4、 render()

react最重要的步驟,建立虛擬dom,進行diff演算法,更新dom樹都在此進行。此時就不能更改state了。

5、componentDidMount()

元件渲染之後呼叫,只調用一次。

  • 更新

6、componentWillReceiveProps(nextProps)

元件初始化時不呼叫,元件接受新的props時呼叫。

7、shouldComponentUpdate(nextProps, nextState)

react效能優化非常重要的一環。元件接受新的state或者props時呼叫,我們可以設定在此對比前後兩個props和state是否相同,如果相同則返回false阻止更新,因為相同的屬性狀態一定會生成相同的dom樹,這樣就不需要創造新的dom樹和舊的dom樹進行diff演算法對比,節省大量效能,尤其是在dom結構複雜的時候

8、componentWillUpdata(nextProps, nextState)

元件初始化時不呼叫,只有在元件將要更新時才呼叫,此時可以修改state

9、render()

元件渲染

10、componentDidUpdate()

元件初始化時不呼叫,元件更新完成後呼叫,此時可以獲取dom節點。

  • 解除安裝

11、componentWillUnmount()

元件將要解除安裝時呼叫,一些事件監聽和定時器需要在此時清除。