vue生命週期的理解

vue第一個生命週期beforecreate

創建前

  1. 拿不到任何數據
  2. 也不能訪問dom

vue的第二個生命週期created

創建完成

  1. 可以拿到數據
  2. 編譯中
  3. dom未掛載,無法獲得真實的頁面

vue的第三個生命週期 beforemount

掛載前

  1. 可以獲取數據
  2. 編譯完成
  3. dom未掛載

vue的第四個生命週期mounted

掛載完成(創建完成了)

  1. 能拿到數據
  2. 編譯完成
  3. 掛載到dom上
  4. 完成一個真實的頁面渲染

vue的第五個生命週期beforeupdate

修改數據前(組件運行的一個週期)

  • data打印出來更新的數據
  • dom還是舊的

vue的第六個生命週期updated

修改完成

  • 打印出來新的data
  • 打印出來新dom掛到真正的頁面中
  • 完成model到view的更新

vue的第七個生命週期beforedestory

銷燬前

  • 所有data method都可以用

vue的第八個生命週期destoryed

銷燬完成

  • 所有data,method等不可再用。
<!DOCTYPE html>
<!-- 
 @title:vue的生命週期
 -->
<html>
	<head>
		<meta charset="utf-8">
		<title>vue的生命週期</title>
		<link href="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet">
		<script src="https://cdn.bootcss.com/vue/2.6.10/vue.min.js"></script>
	</head>
	<body>
		<div id="app">
			<h1 id="message" style="margin-left: 15px;">{{msg}}</h1>
			<button class="btn btn-primary" type="button" @click="updateMsg">更新msg</button>
			<button class="btn btn-danger" type="button" @click="destroyVM">銷燬實例</button>
		</div>
		<script type="text/javascript">
			var vm = new Vue({				//開始創建一個實例對象
				el:"#app",					//Vue實例的掛載目標
				data:{						//vm對象的屬性
					msg:"我愛中國"
				},
				methods:{					//vm對象的方法
					print(){
						return "print方法";
					},
					updateMsg(){
						this.msg = "I love China";
					},
					destroyVM(){
						this.$destroy();
					}
				},
				/* 以下開始爲整個vm實例的生命週期 */
				beforeCreate(){
					console.warn("---------beforeCreate-------------------這是第一個生命週期函數,實例還沒有被完全創建出來,data和methods都不存在,所以打印data是undefined,調用print方法提示找不到,因爲此時實例都還有被創建,模板還未編譯,所以el也是undefined,因爲調用print方法報錯導致js語句停止執行,所以38行的獲取dom的語句不會執行,所以控制檯看不到38行的打印內容");
					console.log("el:" + this.$el);
					console.log("data:" + this.msg);
					console.log("methods:" + this.print());
					console.log("獲取dom:" + document.getElementById('message').innerHTML);
				},
				created(){
					console.warn("---------created------------------這是第二個生命週期函數,實例被創建出來,這個時候data和methods都已經被初始化好了,所以data可以被正常地打印出來,print方法可以被正常的調用,這個時候Vue開始在內存中編譯模板,處於編譯中(ing)並未編譯好的一個狀態,所以此時el也是undefined,所以獲取dom打印出來的只是{{msg}}");
					console.log("el:" + this.$el);
					console.log("data:" + this.msg);
					console.log("methods:" + this.print());
					console.log("獲取dom:" + document.getElementById('message').innerHTML);
				},
				beforeMount(){
					console.warn("---------beforeMount------------------這是第三個生命週期函數,data和methods正常打印就不多說了,在上面的created生命週期中我們不是說模板處於正在編譯的一個狀態嗎,那麼此時模板已經在內存中編譯完成了,所以打印el會輸出[Object HTMLDivElemet]這樣一個元素,但是此時模板只是在內存中編譯完成還沒有掛載到頁面中,所以獲取dom打印出來的還是{{msg}}");
					console.log("el:" + this.$el);
					console.log("data:" + this.msg);
					console.log("methods:" + this.print());
					console.log("獲取dom:" + document.getElementById('message').innerHTML);
				},
				mounted(){
					console.warn("---------mounted------------------這是第四個生命週期函數,此時內存中的已經編譯好的模板已經真實的掛載到了頁面中,一個渲染好的頁面呈現在了我們眼前,此時的打印結果想必大家已經知道原因了。");
					console.log("el:" + this.$el);
					console.log("data:" + this.msg);
					console.log("methods:" + this.print());
					console.log("獲取dom:" + document.getElementById('message').innerHTML);
					console.group("說明:mounted是實例創建過程中的最後一個生命週期函數,當mounted執行完畢就表示實例已經被完全創建好了,如果沒有其它操作,這個實例會一直保存在內存中,此時創建階段正式結束,進入運行階段,")
					console.groupEnd();
				},
				beforeUpdate(){
					console.warn("---------beforeUpdate------------------這是第五個生命週期函數,也是組件運行階段的第一個生命週期函數,點擊更新按鈕時會觸發該方法,這一步先根據data中最新的數據,在內存中重新編譯好一個最新的模板,這個最新的模板在該生命週期中會被編譯好,但不會掛載到真實的頁面中,所以data中打印出來的是更新後的最新的數據,而獲取dom打印出來的還是舊的數據");
					console.log("el:" + this.$el);
					console.log("data:" + this.msg);
					console.log("methods:" + this.print());
					console.log("獲取dom:" + document.getElementById('message').innerHTML);
				},
				updated(){
					console.warn("---------updated------------------這是第六個生命週期函數,也是組件運行階段的第二個生命週期函數,此時內存中已經編譯好的最新的模板會掛載到真正的頁面中,這個時候就完成了data(model)層到view(視圖)層的更新,頁面同步刷新,所以獲取dom的時候會打印出最新的數據“I love China”");
					console.log("el:" + this.$el);
					console.log("data:" + this.msg);
					console.log("methods:" + this.print());
					console.log("獲取dom:" + document.getElementById('message').innerHTML);
				},
				beforeDestroy(){
					console.warn("---------beforeDestroy------------------這是第七個生命週期函數,當執行該鉤子函數的時候,Vue實例從---運行階段---進入到了---銷燬階段---但是此時實例上的data、methods以及過濾器和指令等都處於可用狀態,該實例還未真正銷燬。");
					console.log("el:" + this.$el);
					console.log("data:" + this.msg);
					console.log("methods:" + this.print());
					console.log("獲取dom:" + document.getElementById('message').innerHTML);
				},
				destroyed(){
					console.warn("---------destroyed------------------這是第七個生命週期函數,當執行該鉤子函數的時候,實例完全銷燬,魂飛魄散,自然而然地,實例上的所有數據,方法,指令等等都不再可用。");
					console.log("el:" + this.$el);
					console.log("data:" + this.msg);
					console.log("methods:" + this.print());
					console.log("獲取dom:" + document.getElementById('message').innerHTML);
				}
								
			})
		</script>
	</body>
</html>

轉至:https://www.csdn.net/gather_21/MtTaAgysNjEwOS1ibG9n.html

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