Vue生命週期鉤子的理解

組件從創建到銷燬的一系列過程叫做組件的聲明週期

vue在整個生命週期裏面提供了一些函數,可以在內部實現一些業務邏輯,並且這些函數會在一些特定的場合下去執行。(在生命週期的某一個時刻進行觸發)。

組件的生命週期鉤子函數大致可以分爲三個階段:初始化 、進行中 、 銷燬

1、初始化:beforecreate – create – beforeMount - mounted

		// 一個組件或者實例的生命週期都是通過new開始的
	    // 實例化之後,內部會做一些初始化事件與生命週期相關的配置
	    Vue.component("my-component",{
	        template:"#my-component",
	        data(){
	            return {
	                msg:1
	            }
	        },
	
        // 這個鉤子函數初始化的時候立馬執行,此鉤子函數裏面是獲取不到數據的
        // 同時頁面中的真實dom節點也沒有掛載出來,null
        beforeCreate(){
            console.log("beforeCreate....")
            console.log(this.msg,document.getElementById("title")) // undefined null
        },

        // created鉤子函數內部的數據已經被掛載了,但是真實dom節點還是沒有渲染出來
        // 在這個鉤子函數裏面,如果同步的去更改數據的話,運行中鉤子函數是不會執行的。
        // 通常會在此鉤子函數裏面進入ajax的異步操作,另外還可以做一些初始化事件的綁定
        created(){
            console.log("created...")
            console.log(this.msg,document.getElementById("title")) // undefined null
        },

        // 接下來的過程,就是組件或者實例去查找各自的模板,讓後將其編譯成虛擬dom,即將放入render函數中做初始化渲染的操作。
        // beforeMount代表dom馬上就要被渲染出來了,但是還沒有真正的在頁面中渲染出來
        // 此鉤子函數與created鉤子函數基本一致,可以做ajax與初始化事件的綁定操作
        beforeMount(){
            console.log("beforeMount....")
            console.log(this.msg,document.getElementById("title")) // 1 null
        },

        // 生成好了虛擬dom,然後在render函數裏面替換對應的el,渲染成真實dom節點
        // 相當於在render函數裏面做了一個初始化渲染的操作
		// 相當於把組件內部的render函數覆蓋了。自己的render是將虛擬dom渲染成真實dom的操作
        render(){ // 內部執行不需要寫這一步
            console.log("render.....")
        },

        // mounted鉤子函數是初始化階段的最後一個鉤子函數
        // 數據已經掛載完畢了,真實的dom也已經渲染出來了
        // 這個鉤子函數可以用來做一些實例化的相關操作 ===> 拖拽
        mounted(){
            console.log("mounted.....")
            console.log(this.msg,document.getElementById("title")) // 1 dom真實節點
        },
        
	    })
	
	     // 綁定摸板組件
	    new Vue({}).$mount("#app");

2、進行中階段:beforeUpdate - updated

		// 一個組件或者實例的生命週期都是通過new開始的
	    // 實例化之後,內部會做一些初始化事件與生命週期相關的配置
	    Vue.component("my-component",{
	        template:"#my-component",
	        data(){
	            return {
	                msg:1
	            }
	        },
			
            // 運行時鉤子函數初始化階段是不會主動執行的
            // 只有dom掛載完畢了,然後再去當數據發生變化的時候,beforeUpdate這個鉤子函數纔會執行
            beforeUpdate(){
                console.log("beforeUpdate....")
            },
			
			// 這個鉤子函數是可行的
			// 當數據發生改變的時候,引發虛擬dom的對比,虛擬dom對比完成後,再去渲染真實的dom結構
			// 當真實的dom結構渲染完成後,內部纔會執行updated鉤子函數
			// 數據改變了,然後swiper-slide這幾個真實dom生成好了之後,纔會進入到updated這個鉤子函數裏面去
			updated(){
			    new Swiper(".swiper-container",{
			        loop:true 
			    })
			},
        
	    })
	
	     // 綁定摸板組件
	    new Vue({}).$mount("#app");

3、銷 毀:beforeDestroy - destroyed

		// 一個組件或者實例的生命週期都是通過new開始的
    	// 實例化之後,內部會做一些初始化事件與生命週期相關的配置
		Vue.component("my-component",{
           	template:"#my-component",
           	data(){
              	 return {
                  	 msg:1
              	 }
           },
		
		// 當組件銷燬時,就會觸發,vm.$destroy()的時候,組件就會被銷燬
		// 這個鉤子函數代表銷燬之前,可以做一些善後操作
		// 例如可以做一些清除事件綁定,清除計時器綁定
		beforeDestroy(){
			clearInterval(this.timer) // 清除計時器
			console.log("beforeDestroy...")
		},
		
		// 組件一旦被銷燬了,組件的dom結構還是存在的
		// 只是組件的雙向綁定
		destroyed(){
			console.log("destroyed...")
		}
		
       })

        // 綁定摸板組件
       new Vue({}).$mount("#app");

注 意:生命週期函數內不能使用箭頭函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章