vue生命周期

Vue 框架的入口就是 Vue 實例,其實就是框架中的 view model ,它包含頁面中的業(yè)務(wù)處理邏輯、數(shù)據(jù)模型等,它的生命周期中有多個事件鉤子,讓我們在控制整個Vue實例的過程時更容易形成好的邏輯。

Vue 實例

在文檔中經(jīng)常會使用 vm 這個變量名表示 Vue 實例,在實例化 Vue 時,需要傳入一個選項對象,它可以包含數(shù)據(jù)(data)、模板(template)、掛載元素(el)、方法(methods)、生命周期鉤子(lifecyclehook)等選項。

Vue 實例化的選項

需要注意的是含 this 的函數(shù)大多不要使用箭頭函數(shù),因為我們期望 this 指向 Vue 實例。

data

Vue 實例的數(shù)據(jù)都保存在 data 對象中,Vue 將會遞歸將 data 的屬性轉(zhuǎn)換為 getter/setter,從而讓 data 的屬性能夠響應(yīng)數(shù)據(jù)變化。

?

1

2

3

4

5

6

7vardata = { a: 1 }

// 直接創(chuàng)建一個實例

varvm =newVue({

data: data

})

vm.a// -> 1

vm.$data === data// -> true

這樣數(shù)據(jù)就綁定在 HTML 中,Vue 框架監(jiān)視 data 的數(shù)據(jù)變化,自動更新 HTML 內(nèi)容。

computed

計算屬性將被混入到 Vue 實例中。所有 getter 和 setter 的 this 上下文自動地綁定為 Vue

實例。


22varvm =newVue({

data: { a: 1 },

computed: {

// 僅讀取,值只須為函數(shù)

aDouble:function() {

returnthis.a * 2

},

// 讀取和設(shè)置

aPlus: {

get:function() {

returnthis.a + 1

},

set:function(v) {

this.a = v - 1

}

}

}

})

vm.aPlus// -> 2

vm.aPlus = 3

vm.a// -> 2

vm.aDouble// -> 4

這里可以省略setter,如果省略了setter,那么值就可以是普通函數(shù),但是必須有返回值。

methods

methods 將被混入到 Vue 實例中。可以直接通過 VM 實例訪問這些方法,或者在指令表達式中使用。方法中的 this 自動綁定為 Vue 實例。


10varvm =newVue({

data: { a: 1 },

methods: {

plus:function() {

this.a++

}

}

})

vm.plus()

vm.a// 2

看下面這個例子,methods 和 computed 看起來可以做同樣的事情,單純看結(jié)果兩種方式確實是相同的。然而,不同的是計算屬性是基于它們的依賴進行緩存的。計算屬性只有在它的相關(guān)依賴發(fā)生改變時才會重新求值。這就意味著只要 message 還沒有發(fā)生改變,多次訪問 reversedMessage 計算屬性會立即返回之前的計算結(jié)果,而不必再次執(zhí)行函數(shù)。相比而言,只要發(fā)生重新渲染,method 調(diào)用總會執(zhí)行該函數(shù)。


13varvm =newVue({

el:'#example',

data: {

message:'Hello'

},

computed: {

// a computed getter

reversedMessage:function() {

// `this` points to the vm instance

returnthis.message.split('').reverse().join('')

}

}

})

watch

一個對象,鍵是需要觀察的表達式,值是對應(yīng)回調(diào)函數(shù)。值也可以是方法名,或者包含選項的對象。Vue實例將會在實例化時調(diào)用 $watch(),遍歷 watch 對象的每一個屬性。



19varvm =newVue({

data: {

a: 1,

b: 2,

c: 3

},

watch: {

// 監(jiān)控a變量變化的時候,自動執(zhí)行此函數(shù)

a:function(val, oldVal) {

console.log('new: %s, old: %s', val, oldVal)

},

// 深度 watcher

c: {

handler:function(val, oldVal) {/* ... */},

deep:true

}

}

})

vm.a = 2// -> new: 2, old: 1

Vue 實例的生命周期

Vue 實例有一個完整的生命周期,也就是從開始創(chuàng)建、初始化數(shù)據(jù)、編譯模板、掛載Dom→渲染、更新→渲染、卸載等一系列過程,我們稱這是 Vue 的生命周期。通俗說就是 Vue 實例從創(chuàng)建到銷毀的過程,就是生命周期。

在Vue的整個生命周期中,它提供了一些生命周期鉤子,給了我們執(zhí)行自定義邏輯的機會。

接下來我們用幾個例子來看看生命周期鉤子是怎么用的:

HTML結(jié)構(gòu):


{{ number }}

我們對 input 和 p 綁定了data 對象的 number 數(shù)據(jù),Vue 實例構(gòu)建如下:


6varapp =newVue({

el:'#app',

data: {

number: 1

}

})

在實例中分別在每個生命周期鉤子中 console.log('鉤子名稱',this.number) 我們發(fā)現(xiàn),第一次頁面加載時觸發(fā)了 beforeCreate, created, beforeMount, mounted 這幾個鉤子,data 數(shù)據(jù)在 created 中可獲取到。

再去 console.log('mounted: ', document.getElementsByTagName('p')[0]) ,DOM 渲染在 mounted 中已經(jīng)

完成。

我們再試著去更改 input 輸入框中的內(nèi)容,可以看到輸入框上方的數(shù)據(jù)同步發(fā)生改變,這就是數(shù)據(jù)綁定的效果,在更新數(shù)據(jù)時觸發(fā) beforeUpdate 和 updated 鉤子,且在 beforeUpdate 觸發(fā)時,數(shù)據(jù)已更新完畢。

而 destroy 僅在調(diào)用app.$destroy();時觸發(fā),對 vue 實例進行銷毀。銷毀完成后,我們再重新改變 number 的值,vue 不再對此動作進行響應(yīng)了。但是原先生成的dom元素還存在,可以這么理解,執(zhí)行了destroy操作,后續(xù)就不再受vue控制了。

Vue.nextTick

在下次 DOM 更新循環(huán)結(jié)束之后執(zhí)行延遲回調(diào)。在修改數(shù)據(jù)之后立即使用這個方法,獲取更新后的 DOM。


3Vue.nextTick(function() {

// DOM 更新了

})

官方還提供了一種寫法,vm.$nextTick,用 this 自動綁定到調(diào)用它的實例上


8created() {

setTimeout(() => {

this.number = 100

this.$nextTick(() => {

console.log('nextTick', document.getElementsByTagName('p')[0])

})

},100)

}

什么時候需要用的Vue.nextTick()

在 Vue 生命周期的 created() 鉤子函數(shù)進行的 DOM 操作一定要放在 Vue.nextTick() 的回調(diào)函數(shù)中。原因是什么呢,原因是在 created() 鉤子函數(shù)執(zhí)行的時候 DOM 其實并未進行任何渲染,而此時進行 DOM 操作無異于徒勞,所以此處一定要將 DOM 操作的 js 代碼放進 Vue.nextTick() 的回調(diào)函數(shù)中。與之對應(yīng)的就是 mounted 鉤子函數(shù),因為該鉤子函數(shù)執(zhí)行時所有的 DOM 掛載和渲染都已完成,此時在該鉤子函數(shù)中進行任何DOM操作都不會有問題 。

在數(shù)據(jù)變化后要執(zhí)行的某個操作,而這個操作需要使用隨數(shù)據(jù)改變而改變的 DOM 結(jié)構(gòu)的時候,這個操作都應(yīng)該放進 Vue.nextTick() 的回調(diào)函數(shù)中。

生命周期小結(jié)

生命周期鉤子的一些使用方法:

beforecreate : 可以在這加個loading事件,在加載實例時觸發(fā)

created : 初始化完成時的事件寫在這里,如在這結(jié)束loading事件,異步請求也適宜在這里調(diào)用

mounted : 掛載元素,獲取到DOM節(jié)點

updated : 如果對數(shù)據(jù)統(tǒng)一處理,在這里寫上相應(yīng)函數(shù)

beforeDestroy : 可以做一個確認停止事件的確認框

nextTick : 更新數(shù)據(jù)后立即操作dom

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

原文鏈接:https://segmentfault.com/a/1190000008771768

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,646評論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,595評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,560評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,035評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,814評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,224評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,301評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,444評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,988評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,804評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,998評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,544評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,237評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,665評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,927評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,706評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,993評論 2 374

推薦閱讀更多精彩內(nèi)容