Vue 生命周期函數(shù)

吐槽:最近學習 Vue 的生命周期函數(shù),有點搞不懂,為什么要叫鉤子函數(shù)???以前了解過 React 的生命周期,開始我已經(jīng) Vue 的生命周期理解起來應該和 React 類似,但是生命周期鉤子函數(shù)是什么鬼,難道是和 Vue 其它地方環(huán)環(huán)相扣,有數(shù)據(jù)交互?

了解了之后發(fā)下,沒有那么復雜,其實....就是和 React 生命周期類似,還是沒有懂為什么要叫鉤子函數(shù)?希望有大神可以答疑

什么鬼?

好了,不皮了,下面開始正式說 Vue 生命周期鉤子函數(shù)

1. 生命周期方法詳解

鉤子函數(shù) 詳情 場景 備注
beforeCreate 實例初始化之后,組件被創(chuàng)建時期,這個時候的 el,data,message 都是 underfined 可以加入 loading 事件;在服務器端的應用場景中,這個時候發(fā)送數(shù)據(jù)請求比較多一些
created 實例創(chuàng)建完成后,data、methods 被初始化 結(jié)束 loading 事件;推薦這個時候發(fā)送請求數(shù)據(jù),尤其是返回的數(shù)據(jù)與綁定事件有關(guān)時
beforeMount 掛載初始之前,完成 el 初始化,render 被初次調(diào)用 也可以發(fā)送數(shù)據(jù)請求 在服務器端渲染期間不會被調(diào)用
mounted 完成掛載 獲取 el 中 DOM 元素,進行 DOM 操作;如果返回的數(shù)據(jù)操作依賴 DOM 完成,推薦這個時候發(fā)送數(shù)據(jù)請求 在服務器端渲染期間不會被調(diào)用
beofreUpdate 掛載開始之前調(diào)用 掛載完成之前訪問現(xiàn)有 DOM ,比如手動移除已添加的事件監(jiān)聽器;也可以進一步修改數(shù)據(jù) 在服務器渲染期間不會被調(diào)用,只有初次渲染會在服務端調(diào)用
updated 由于數(shù)據(jù)更改,重新渲染界面時調(diào)用 可執(zhí)行依賴于 DOM 的操作 服務器端渲染期間不會被調(diào)用
activated keep-alive 組件激活時調(diào)用 服務器端渲染期間不會被調(diào)用
deactivated 組件停用時調(diào)用 服務器端渲染期間不會被調(diào)用
beforeDestroy 實例銷毀之前調(diào)用 刪除錢發(fā)出確認信息;清理定時器 服務器端渲染期間不會被調(diào)用
destroyed 實例銷毀后調(diào)有。調(diào)用后,所有東西都會被解綁,所有的事件監(jiān)聽器會被移動,子實例也會被銷毀 提示已刪除 服務器端渲染期間不會被調(diào)用
errorCaptured 當捕獲一個來自子孫組件的錯誤時被調(diào)用。收到三個參數(shù):錯誤對象、發(fā)生錯誤的組件實例以及一個包含錯誤來源信息的字符串。可返回 false 以阻止該錯誤繼續(xù)向上傳播。 修改組件狀態(tài) 2.5.0新增

2. 日常舉栗子:

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <meta charset="UTF-8">
    <script type="text/javascript" src="https://cdn.jsdelivr.net/vue/2.1.3/vue.js"></script>
</head>
<body>

<div id="app">
    <p>{{ message }}</p>
    <button v-on:click="change()">change</button>
    <button v-on:click="destr()">destroy</button>
</div>

<script type="text/javascript">

    var app = new Vue({
        el: '#app',
        data: {
            message: 66
        },
        beforeCreate: function () {
            console.group('beforeCreate 創(chuàng)建前');
            console.log("el: " + this.$el);
            console.log("data: " + this.$data);
            console.log("message: " + this.message)
        },
        created: function () {
            console.group('created 創(chuàng)建完畢');
            console.log("el: " + this.$el);
            console.log("data: " + this.$data + JSON.stringify(this.$data));
            console.log("message: " + this.message)
        },
        beforeMount: function () {
            console.group('beforeMount 掛載前');
            console.log("el: " + this.$el);
            console.log("data: " + this.$data);
            console.log("message: " + this.message)
        },
        mounted: function () {
            console.group('mounted 掛載結(jié)束');
            console.log("el: " + this.$el);
            console.log("data: " + this.$data);
            console.log("message: " + this.message)
        },
        beforeUpdate: function () {
            console.group('beforeUpdate 更新前');
            console.log("el: " + this.$el);
            console.log("data: " + this.$data);
            console.log("message: " + this.message)
        },
        updated: function () {
            console.group('updated 更新完成');
            console.log("el: " + this.$el);
            console.log("data: " + this.$data);
            console.log("message: " + this.message)
        },
        beforeDestroy: function () {
            console.group('beforeDestroy 銷毀前');
            console.log("el: " + this.$el);
            console.log("data: " + this.$data);
            console.log("message: " + this.message)
        },
        destroyed: function () {
            console.group('destroyed 銷毀完成');
            console.log("el: " + this.$el);
            console.log("data: " + this.$data);
            console.log("message: " + this.message)
        },
        methods: {
            change() {
                app.message++;
            },
            destr() {
                app.$destroy();
            }
        }
    })
</script>
</body>
</html>

2.1直接加載頁面,頁面顯示:

初始化

控制臺:

初始化

2.2 點擊 change 按鈕,頁面:

change

控制臺:

change

2.3 點擊 destroy ,頁面:

destory

控制臺:

destory

之后,再點擊 change 按鈕,頁面與控制臺都不會再發(fā)生變化。


最后用官網(wǎng)的一張圖壓軸,如果有不對的地方,歡迎指正


vue.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容