vue生命週期

接觸Vue兩個月了,今天說一說vue裏邊很重要的生命週期,記得最開始接觸的時候我問了一下週邊的同事,html

這些生命週期都有什麼用,獲得的答案是mounted裏邊能夠操做屬性,你記住mounted就完事了,因而乎。。。vue

數據請求,mounted() 賦值 mounted(),執行方法,mounted(),  監聽更新數據???搞不動了。。。ios

而後最近仔細的看了一遍Vue的生命週期,今天和你們分享一下我所瞭解的  axios

 

首先  什麼是Vue的生命週期瀏覽器

Vue 實例從開始建立、初始化數據、編譯模板、掛載Dom和渲染、更新和渲染、卸載等一系列過程,這是 Vue 的生命週期dom

vue的生命週期裏邊有八個生命週期鉤子函數分別是函數

 

beforeCreat() 建立前性能

created()建立this

beforeMount()掛載前spa

mounted()掛載

beforeupdate()更改前

updated()更改

beforeDestroy()銷燬前

destroyed()銷燬

 

先來一張官方的生命週期圖鎮貼

 

beforeCreate 實例建立前

這個生命週期如上圖所示   實例初始化在這個生命週期遍歷 data 對象下全部屬性將其轉化爲 getter/setter

也就是說添加一個被觀察者,因此咱們平時在項目中遇到在後來添加新的屬性視圖不更新就是這個緣由

在後來被添加的屬性,沒有被放到觀察者對象中去 可是這個時候數據並無和模板創建連接 還不能操做屬性

說到這裏你可能會反駁我,打印的全都是undefined,你怕是在逗我

but  你能夠經過$options(實例自定義屬性,屬於數據訪問的一種和$date 平級)   看到data的值  注意data是個函數  他沒執行  因此拿不到數據,用圖來講話

 

data(){
        return{
            a:"1"
        }
    },
    beforeCreate(){
        console.log("beforeCreate",this.$el,this.a)
    },
//beforeCreate undefined undefined

那麼若是想在實例掛載完成後添加的屬性觸發視圖更新的話能夠用 $set 這個方法  這個方法會向被觀察者對象裏邊新增你的屬性

這時候咱們打印一下組件裏的屬性仍是不存在的

created 實例建立

到這個生命週期的時候  實例已經被建立完畢  屬性已經綁定 屬性是能夠操做的

可是dom還不存在 $el屬性還不能夠操做

這個生命週期能夠進行axios請求 可是這個時候頁面尚未被渲染出來  若是請求時間過長的話  會出現長時間的白屏

加loading可能會用戶體驗好一些

這個生命週期如上圖所示  他會把template模板編譯成html  還有執行render函數,返回一個虛擬dom 同第一句話  就是說

dom還拿不到  

data(){
        return{
            a:"1"
        }
    },
    beforeCreate(){
        console.log("beforeCreate",this.$el,this.a)
    },
    created(){
        console.log("created",this.$el,this.a)
        this.a=2
        console.log(this.a)
    },
//created undefined 1
//2

 這個虛擬Dom接觸的不是太多  簡單來說就是經過js生成一個相似於dom樹的那麼一個東西

來看一下這個虛擬dom

大概就是這麼一大串 ,剛看到的時候個人第一感受就是  真¥%…#…複雜  而後出於好奇  我打印了一下真實dom

 

更¥%……%複雜總而言之  一屏放不下   因此說大批量的操做dom  是很影響性能的一件事情    膜拜一下遠方的各位大神

beforeMount 掛載前

從圖上來說  這個聲明週期作的是模板編譯,看網上的帖子有人能把$el打印出來   不太理解怎麼打印出來的  本身試了一下

打印不出任何東西

 

    beforeMount(){
        console.log('beforeMount',this.$el,this.pickerMark)
        debugger
    },
//beforeMount undefined false

 這個生命週期 el還未對數據進行渲染 仍是不能操做dom

mounted掛載

這個生命週期  是我用的最多的   這個時候的虛擬dom已經被渲染到了真實的dom上邊

這個生命週期裏邊咱們能夠作的事情不少  好比數據請求或者賦值操做屬性等等

    mounted(){
        console.log('mounted',this.$el,this.pickerMark)
    },


//mounted <div class=​"propaganda-form" arealistitem=​"[object Object]​,[object Object]​,[object Object]​,[object Object]​,[object Object]​,[object Object]​,[object Object]​,[object Object]​,[object Object]​,[object Object]​,[object Object]​,[object Object]​,[object Object]​,[object Object]​,[object Object]​" style=​"display:​ none;​">​</div>​ false

以上四個生命週期  每一個組件只執行一次,過去了就不會在執行了

 

beforeUpdate 更新前  Updated 更新

咱們在mounted更新一個屬性的話  beforeUpdate  和 updated  生命週期函數 會被觸發  可是僅限於 被觀察的屬性作出的變化且被引用他們纔會觸發

 

 

並且須要注意的是  不要再updated  函數裏邊直接就修改屬性   會進入死循環  好比說。。。。

 

 

瀏覽器崩潰了。。。。    若是你要用的話  必定要加判斷條件  確保能跳出去的那種,我我的是很喜歡用updated這個生命週期函數的

由於以前我拿值什麼的都是用的watch 可是vue並不推薦用 緣由說是很耗費資源  不算計算屬性的話  這個updated 能夠說是很方便了

可是若是變化的不是響應式的值  他就不會觸發怎麼辦    以前研究過一個方法分享一下  就是說再date裏邊聲明一個變量看成標記

而後把這個變量放到頁面中  dispaly:none;  而後在你調用非相應的變量的時候 你在後邊也調用一下這個標記  updated生命週期函數

是會執行的  這時候你能夠加一些判斷在update去執行一些東西  固然  後來認識了計算屬性  就放棄了這個作法  計算屬性是一種聲明式的屬性

他只會告訴你這個值是怎麼構成的  很方便

beforeDestroy 銷燬前 destroy銷燬

 這兩個生命週期 用到的比較少  顧名思義  銷燬前這個生命週期  的時候 仍是能夠對元素進行操做的

以前在項目中用到的就是 高級搜索在銷燬的時候判斷是否有值  而後返回相應的狀態

銷燬這個生命週期執行事後  實例的屬性和方法就不能再用了 

 

生命週期的順序

上邊講了單個實例的生命週期,可是咱們在平時用到的  確定不會是一個組件,  那麼父子組件  或者兄弟組件的生命週期又是什麼樣的

直接來一張圖

 

上圖能夠看到  若是有父子組件的話   會先從父組件開始  到beforeMount   開始走子組件 到beforeMount   而後是子組件的一堆mounted 最後父組件

還能夠看出  兄弟組件的話   是依次到beforeMount  而後按照順序mounted

再來看一下update

 

有關聯的話   他的順序是  父beforeupdate  子beforeupdate 子updated 父updated  

父組件沒有關聯的話  也不會觸發子組件的生命週期   

銷燬也是這個順序   就不一一上圖了  

你們 能夠理解成遞歸  感受就是遞歸  ,那麼若是遞歸的話  就存在一個做用域的問題  混入的時候 又是什麼樣的

你們都知道混入的時候組件裏邊屬性和方法 會優先使用 可是生命週期是都會走的   相比你們猜也都猜到了

既然組件裏邊有方法的話會用組件的  那麼混入必然是最外層的   剛纔證明了一下想法 確實是這樣  

混入的生命週期的話  會在每一個聲明週期的最前邊  全部的生命週期  都會優先執行

 

以上是對vue生命週期的理解   可能有不足之處  但願你們批評指正

相關文章
相關標籤/搜索