vue生命周期鉤子函數中最早調用的是beforecreate函數。在這個階段,vue實例已經完成了數據的觀測,但是尚未完成模板的編譯,同時實例的方法和數據也不可用。
let vm = new Vue({
data:{
name: 'Vue'
},
beforeCreate: function() {
console.log('beforecreate', this.name)
}
})
//輸出結果為:
//"beforecreate" undefined
在beforecreate函數中可以訪問實例的數據,但是由于模板還沒有編譯,所以無法訪問實例的DOM節點。這個階段適合做一下初始化的操作,例如設置一些需要在每次實例中都用到的數據或在請求數據前做一些加載狀態的初始化處理。
let vm = new Vue({
data:{
name: 'Vue'
},
beforeCreate: function() {
this.loading = true; //加載狀態初始化為true
},
mounted: function() {
//模擬數據請求
setTimeout(() =>{
this.loading = false; //請求完成后,將加載狀態設置為false
}, 2000)
}
})
由于生命周期函數的執行順序是固定的,因此beforecreate函數既不能訪問到DOM也不能使用實例方法。如果需要在beforecreate階段使用實例方法,可以考慮將這些方法提取出來,在beforecreate之后再掛載到實例上。
let data = {
name: 'Vue'
};
let methods = {
sayHello: function() {
console.log('Hello', this.name)
}
}
let vm = new Vue({
data,
beforeCreate: function() {
Object.assign(this, methods)
},
mounted: function() {
this.sayHello() //輸出結果為:"Hello Vue"
}
})
在實際開發中,beforecreate函數常常用來處理一些全局的事件和鉤子。例如在beforecreate函數中可以監聽全局的路由跳轉事件,從而針對不同的頁面做不同的處理。
let vm = new Vue({
beforeCreate: function() {
this.$router.beforeEach((to, from, next) =>{
if (to.name === 'cart') {
//如果跳轉到購物車頁面,則禁止跳轉
next(false);
} else {
next()
}
})
}
})
在beforecreate函數中可以執行一些異步操作,但是一定要注意異步操作完成后更新實例數據的時機。如果異步操作在mounted鉤子函數之后返回,則可以在異步操作中直接修改實例數據。如果異步操作在mounted鉤子函數之前返回,則需要在異步操作完成后手動更新實例數據。
let vm = new Vue({
data: {
name: ''
},
beforeCreate: function() {
//使用axios發送異步請求,獲取數據
axios.get('/api/user/info').then(res =>{
this.name = res.data.name; //直接修改實例數據
})
},
mounted: function() {
console.log(this.name) //異步請求完成后,輸出用戶名
}
})
上一篇html屬性設置滑動
下一篇html展示網站源代碼