Vue元件生命週期(面試常問,最討厭的部分了吧,一直記不下來的來看看)
阿新 • • 發佈:2018-12-26
直接上程式碼,執行來看吧,看起來直觀一點
<!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>
<script src="./vue.js"></script>
</head>
<body>
<div id="app">
<p>{{info}}</p>
<button @click="info='hello1'">更新info</button>
<button @click="destroy">銷燬例項</button>
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
info: "hello"
},
// 在例項初始化之後,資料觀測 (data observer) 和 event/watcher 配置之前被呼叫。
beforeCreate: function () {
console.log("===============beforeCreate============================================" )
// $el表示Vue 例項使用的根 DOM 元素。
console.log('$el', this.$el);
// $data Vue 例項觀察的資料物件
console.log('$data', this.$data);
console.log("info:", this.info)
},
// 在例項建立完成後被立即呼叫。在這一步,例項已完成以下的配置:資料觀測 (data observer),屬性和方法的運算,watch/event 事件回撥。然而,掛載階段還沒開始,dom還未生成,$el 屬性目前不可見。
created: function () {
console.log("===============created=======================================")
console.log('$el', this.$el);
console.log('$data', this.$data);
console.log("info:", this.info)
},
// 模板編譯掛載之前呼叫,首先會判斷物件是否有el選項。如果有的話就繼續向下編譯,如果沒有el選項,則停止編譯,也就意味著停止了生命週期,直到在該vue例項上呼叫vm.$mount(el)。接著判斷是否有template屬性,有的話就以template屬性中的值作為模板,如果沒有的話,就以el屬性指向的作為模板。這裡會生成vm.$el,但指令尚未被解析
beforeMount: function () {
console.log("===============beforeMount=========================================")
console.log('$el', this.$el);
console.log('$data', this.$data);
console.log("info:", this.info)
},
// 模板編譯掛載之後呼叫,vm.$el替換掉el指向的dom
mounted: function () {
console.log("===============mounted===========================================")
console.log('$el', this.$el);
console.log('$data', this.$data);
console.log("info:", this.info)
},
// 資料變更導致虛擬DOM重新渲染之前呼叫
beforeUpdate: function () {
console.log("===============beforeUpdate============================================");
},
// 資料變更導致虛擬DOM重新渲染之後呼叫
updated: function () {
console.log("===============updated======================================================");
},
// 例項銷燬之前呼叫,在這一步,例項完全可用
beforeDestroy: function () {
console.log("===============beforeDestroy===============================================")
console.log('$el', this.$el);
console.log('$data', this.$data);
console.log("info:", this.info)
},
// vue例項指向的所有東西解除繫結,包括watcher、事件、所以的子元件,後續就不再受vue例項控制了
destroyed: function () {
console.log("===============destroyed================================================")
console.log('$el', this.$el);
console.log('$data', this.$data);
console.log("info:", this.info)
},
methods: {
destroy() {
// 表示銷燬元件
this.$destroy()
},
udpateinfo() {
this.info = 'hello2'
}
}
})
</script>
</body>
</html>