Vue 生命周期


生命周期-->生命周期鈎子函數:一個組件從創建到銷毀的一個過程就是生命周期

beforeCreate:創建前
1、組件創建會執行的一個生命周期函數,我們可以在當前生命周期中創建一個loading.當頁面加載完成的時候講loading移除
2、在當前生命周期函數中是訪問不到其他生命周期函數以及data身上的屬性

created:創建后(重)
1、當create生命周期函數執行的時候,會將data以及methods身上所有的屬性和方法添加到vm的實例身上
2、created執行的時候會遍歷data身上所有的屬性,給這些屬性添加一個getter/setter方法
3、我們可以在當前生命周期函數中進行前后端數據的請求(發起ajax)

beforeMount 掛載前
1、當前生命周期函數可以對data中的數據做最后的修改
2、如果在當前生命周期函數中添加的屬性是沒有getter和setter方法的。如果需要擁有的情況則用$set
3、當前生命周期函數中是模板和數據還未進行結合

mounted: 掛載后(重)
1、當前生命周期函數是數據和模板進行相結合,生成了真正的DOM結構
2、在當前生命周期函數重我們可以訪問到真實的DOM結構
3、我們可以在當期生命周期函數中做一些插件的實例化(Swiper better-scroll echarts....)
ref:
定義: ref="名稱"(名稱必須是當前組件中獨一無二的)
獲取: this.$refs.名稱

beforeDestroy: 銷毀前(重)
1、在當前生命周期函數中我們依舊是可以訪問到真實的DOM結構,因此我們可以在當前生命周期函數中做
事件的解綁,以及監聽的移除等操作


destroyed:銷毀后
1、當前生命周期函數執行的時候會將vm與模板之間的關聯進行斷開
2、在當前生命周期函數中我們無法通過ref來訪問到真實的DOM結構了
 

beforeUpdate:更新前 (多次執行)
1、當數據更新前會執行的生命周期函數
2、當前生命周期是更新的數據還未和模板進行相結合,因此我們可以在當期生命周期函數中做更新數據的最后修改

updated:更新后 (多次執行)
1、當前函數是更新的數據和模板進行了相結合。
2、我們可以在當前生命周期函數中獲取到數據更新后最新的DOM結構
3、我們一般情況下會在這里做插件的實例化,但是需要條件的判斷。如果不加判斷的情況下會非常耗費性能
 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <h2 ref="h2" id="box">{{msg}}</h2>
        <h2>{{obj.age}}</h2>
        <button @click="handleUpdate">數據更新</button>
    </div>


    <button onclick="handleDestroy()">銷毀</button>
</body>
</html>
<script src="vue.js"></script>
<script>
    var vm = new Vue({
        el:"#app",
        beforeCreate(){
            console.log("beforeCreate----");
            console.log(this.msg)
            console.log(this)
        },
        created(){
            console.log("created-----")
        },
        data:{
            msg:"1905",
            obj:{}
        },
        methods:{
            handleUpdate(){
                this.msg = "1902";
                // console.log(this.msg);
                // console.log(1);

                this.$nextTick(()=>{
                    console.log(document.getElementById("box").innerText);
                })
                
               
            }
        },
        beforeMount(){
            console.log("beforeMount----");
            // this.msg = "1902";
           // this.age = 20;
            this.$set(this.obj,"age",20)
          console.log(document.getElementById("app").innerHTML)
        },
        mounted(){
            console.log("mounted----")
            console.log(document.getElementById("app").innerHTML)
            console.log(this.$refs.h2);
        },
        beforeUpdate(){
            console.log("beforeUpdate ---")
            console.log(document.getElementById("app").innerHTML)
            this.msg = "不讓你變成1902";
        },
        updated(){
            console.log("updated ---")


            // if(!this.swiper){
                
            //     this.swiper = new Swiper();
            // }


        },
        beforeDestroy(){
            console.log("beforeDestroy----")
            console.log(document.getElementById("app").innerHTML)
            console.log(this.$refs.h2);
        },
        destroyed(){
            console.log("destroyed")
            console.log(document.getElementById("app").innerHTML)
            console.log(this.$refs.h2);
        }
    })


    function handleDestroy() {
        vm.$destroy();
    }


/*
    $nextTick():獲取數據更新后最新的DOM結構

    面試題:
        nextTicke是同步的還是異步的?   
        同步的 而nextTick中的函數是 異步的


    我可以在當前函數中獲取到數據更新后最新的DOM結構


    如何獲取到數據更新后最新的DOM結構
        1、nextTick  (底層原理類似一個setTimeout 時間為20ms)
        2、wacth
        3、updated

*/
</script>

 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM