系列文章目錄
- Vue核心指令解析:探索MVVM與數據操作之美
文章目錄
- 系列文章目錄
- 前言
- 一、Vue生命周期是什么?
- 二、鉤子函數講解
- 1. beforeCreate( 創建前 )
- 2. created ( 創建后 )
- 3. beforeMount(掛載前)
- 4. mounted(掛載后)
- 5. beforeUpdate(更新前)
- 6. updated(更新后)
- 7. beforeDestroy(銷毀前)
- 8. destroyed(銷毀后)
- 9. 代碼實現鉤子函數
前言
????本文將詳細介紹Vue組件的生命周期,包括其各個階段的含義和作用,以及每個階段所對應的鉤子函數的使用方法。我們將逐一解析beforeCreated、created、beforeMount、mounted、beforeUpdate、updated、beforeDestroy和destroyed這八大鉤子函數,并通過一個簡單的實際代碼案例展示它們的具體應用。
一、Vue生命周期是什么?
Vue實例
有一個完整的 生命周期,也就是說從開始創建、初始化數據、編譯模板、掛載DOM、渲染-更新-渲染、銷毀等一系列過程,我們稱為Vue 實例的生命周期,鉤子 就是在某個階段給你一個做某些處理的機會。
生命周期圖
二、鉤子函數講解
1. beforeCreate( 創建前 )
在實例初始化之后,數據觀測(data observer)和事件配置(event/watcher) 之前被調用,此時組件的選項對象還未創建,el 和 data 并未初始化,因此無法訪問methods, data, computed的方法和數據。
2. created ( 創建后 )
實例已經創建完成之后被調用,在這一步,實例已完成以下配置:數據觀測(data observer)、屬性和方法的運算,watch/event事件回調,完成了data 數據的初始化,el沒有。 然而,掛載階段還沒有開始, $el屬性目前不可見。
這是一個常用的生命周期,因為你可以調用methods中的方法,改變data中的數據,并且修改可以通過vue的響應式綁定體現在頁面上,獲取computed中的計算屬性等等,通常我們可以在這里對實例進行預處理。
3. beforeMount(掛載前)
掛在開始之前被調用,相關的render函數首次被調用(虛擬DOM),實例已完成以下的配置: 編譯模板,把data里面的數據和模板生成html,完成了el和data 初始化,注意此時還沒有掛載html到頁面上。
4. mounted(掛載后)
掛載完成,也就是模板中的HTML 渲染到HTML頁面 中,此時一般可以做一些ajax操作,mounted只會執行一次。
5. beforeUpdate(更新前)
在數據更新之前被調用,發生在虛擬DOM重新渲染和打補丁之前,可以在該鉤子中進一步地更改狀態,不會觸發附加地重渲染過程
6. updated(更新后)
在由于數據更改導致的虛擬DOM重新渲染和打補丁時會調用,調用時,組件DOM已經更新,所以可以執行依賴于DOM的操作。在大多數情況下,應該避免在此期間更改狀態,因為這可能會導致更新無限循環,該鉤子在服務器端渲染期間不被調用
7. beforeDestroy(銷毀前)
在實例銷毀之前調用,實例仍然完全可用,
- 這一步還可以用this來獲取實例,
- 一般在這一步做一些重置的操作,比如清除掉組件中的定時器 和 監聽的dom事件
8. destroyed(銷毀后)
在實例銷毀之后調用,調用后,所有的事件監聽器會被移出,所有的子實例也會被銷毀,該鉤子在服務器端渲染期間不被調用。
9. 代碼實現鉤子函數
<template><div><h1>生命周期、鉤子函數</h1><h1>{{num}}</h1><button @click="btn">增加</button>
<!-- <button @click="btn">減少</button> 0--><button @click="num+=1">增加</button></div>
</template><script>
export default {name: "test",data(){return{num:0}},methods:{btn(){if(this.num < 15){this.num += 1}else {alert('不能再加了')this.num += 0}}},beforeCreate() {alert('創建之前')},created() {alert('創建之后')},beforeMount() {alert('掛載之前')},mounted() {alert('掛載之后')this.num = 10},beforeUpdate() {alert('修改之前')},updated() {alert('修改之后')}}
</script><style scoped></style>