摘要:實例在文檔中經常會使用這個變量名表示實例,在實例化時,需要傳入一個選項對象,它可以包含數據模板掛載元素方法生命周期鉤子等選項。通俗說就是實例從創建到銷毀的過程,就是生命周期。
Vue 實例中的生命周期鉤子
Vue 框架的入口就是 Vue 實例,其實就是框架中的 view model ,它包含頁面中的業務
處理邏輯、數據模型等,它的生命周期中有多個事件鉤子,讓我們在控制整個Vue實例的
過程時更容易形成好的邏輯。
在文檔中經常會使用 vm 這個變量名表示 Vue 實例,在實例化 Vue 時,需要傳入一個選
項對象,它可以包含數據(data)、模板(template)、掛載元素(el)、方法(methods)、生
命周期鉤子(lifecyclehook)等選項。
需要注意的是含 this 的函數大多不要使用箭頭函數,因為我們期望 this 指向 Vue 實例。
dataVue 實例的數據都保存在 data 對象中,Vue 將會遞歸將 data 的屬性轉換為 getter/setter,
從而讓 data 的屬性能夠響應數據變化。
var data = { a: 1 } // 直接創建一個實例 var vm = new Vue({ data: data }) vm.a // -> 1 vm.$data === data // -> true
這樣數據就綁定在 HTML 中,Vue 框架監視 data 的數據變化,自動更新 HTML 內容。
computed計算屬性將被混入到 Vue 實例中。所有 getter 和 setter 的 this 上下文自動地綁定為 Vue
實例。官方API
var vm = new Vue({ data: { a: 1 }, computed: { // 僅讀取,值只須為函數 aDouble: function () { return this.a * 2 }, // 讀取和設置 aPlus: { get: function () { return this.a + 1 }, set: function (v) { this.a = v - 1 } } } }) vm.aPlus // -> 2 vm.aPlus = 3 vm.a // -> 2 vm.aDouble // -> 4
這里可以省略setter,如果省略了setter,那么值就可以是普通函數,但是必須有返回值。
methodsmethods 將被混入到 Vue 實例中。可以直接通過 VM 實例訪問這些方法,或者在指令表達
式中使用。方法中的 this 自動綁定為 Vue 實例。官方API
var vm = new Vue({ data: { a: 1 }, methods: { plus: function () { this.a++ } } }) vm.plus() vm.a // 2
看下面這個例子,methods 和 computed 看起來可以做同樣的事情,單純看結果兩種方式確實是相同的。
然而,不同的是計算屬性是基于它們的依賴進行緩存的。計算屬性只有在它的相關依賴發生改變
時才會重新求值。這就意味著只要 message 還沒有發生改變,多次訪問 reversedMessage 計算屬性會
立即返回之前的計算結果,而不必再次執行函數。相比而言,只要發生重新渲染,method 調用總會執行
該函數。
var vm = new Vue({ el: "#example", data: { message: "Hello" }, computed: { // a computed getter reversedMessage: function () { // `this` points to the vm instance return this.message.split("").reverse().join("") } } })watch
一個對象,鍵是需要觀察的表達式,值是對應回調函數。值也可以是方法名,或者包含選項的對象。Vue
實例將會在實例化時調用 $watch(),遍歷 watch 對象的每一個屬性。
var vm = new Vue({ data: { a: 1, b: 2, c: 3 }, watch: { // 監控a變量變化的時候,自動執行此函數 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: 1Vue 實例的生命周期
Vue 實例有一個完整的生命周期,也就是從開始創建、初始化數據、編譯模板、掛載Dom→渲染、更新→渲染、卸載等一系列
過程,我們稱這是 Vue 的生命周期。通俗說就是 Vue 實例從創建到銷毀的過程,就是生命周期。
在Vue的整個生命周期中,它提供了一些生命周期鉤子,給了我們執行自定義邏輯的機會。
接下來我們用幾個例子來看看生命周期鉤子是怎么用的:
完整的代碼托管在 codepen
HTML結構:
{{ number }}
我們對 input 和 p 綁定了data 對象的 number 數據,Vue 實例構建如下:
var app = new Vue({ el: "#app", data: { number: 1 } })
在實例中分別在每個生命周期鉤子中 console.log("鉤子名稱",this.number) 我們發現,第一次頁面加載時
觸發了 beforeCreate, created, beforeMount, mounted 這幾個鉤子,data 數據在 created 中可獲取到。
再去 console.log("mounted: ", document.getElementsByTagName("p")[0]) ,DOM 渲染在 mounted 中已經
完成。
我們再試著去更改 input 輸入框中的內容,可以看到輸入框上方的數據同步發生改變,這就是數據綁定的效果,在更
新數據時觸發 beforeUpdate 和 updated 鉤子,且在 beforeUpdate 觸發時,數據已更新完畢。
而 destroy 僅在調用app.$destroy();時觸發,對 vue 實例進行銷毀。銷毀完成后,我們再重新改變 number 的值,vue 不再對此動作
進行響應了。但是原先生成的dom元素還存在,可以這么理解,執行了destroy操作,后續就不再受vue控制了。
在下次 DOM 更新循環結束之后執行延遲回調。在修改數據之后立即使用這個方法,獲取更新后的 DOM。官方API
Vue.nextTick(function () { // DOM 更新了 })
官方還提供了一種寫法,vm.$nextTick,用 this 自動綁定到調用它的實例上
created() { setTimeout(() => { this.number = 100 this.$nextTick(() => { console.log("nextTick", document.getElementsByTagName("p")[0]) }) },100) }
什么時候需要到Vue.nextTick()
在 Vue 生命周期的 created() 鉤子函數進行的 DOM 操作一定要放在 Vue.nextTick() 的回調函數中。原因是什么呢,原因是
在 created() 鉤子函數執行的時候 DOM 其實并未進行任何渲染,而此時進行 DOM 操作無異于徒勞,所以此處一定要將 DOM 操作
的 js 代碼放進 Vue.nextTick() 的回調函數中。與之對應的就是 mounted 鉤子函數,因為該鉤子函數執行時所有的 DOM 掛載和
渲染都已完成,此時在該鉤子函數中進行任何DOM操作都不會有問題 。
在數據變化后要執行的某個操作,而這個操作需要使用隨數據改變而改變的 DOM 結構的時候,這個操作都應該放
進 Vue.nextTick() 的回調函數中。
生命周期小結生命周期鉤子的一些使用方法:
beforecreate : 可以在這加個loading事件,在加載實例時觸發
created : 初始化完成時的事件寫在這里,如在這結束loading事件,異步請求也適宜在這里調用
mounted : 掛載元素,獲取到DOM節點
updated : 如果對數據統一處理,在這里寫上相應函數
beforeDestroy : 可以做一個確認停止事件的確認框
nextTick : 更新數據后立即操作dom
運行這個例子需要marked組件,通過以下方法引入:
在項目目錄下運行 npm i marked -S, js 文件中 import marked from "marked" 即可。
這個例子沒有用到生命周期鉤子,簡單解讀一下這段代碼,
methods: { update: _.debounce(function (e) { this.input = e.target.value }, 300) }
html 中 textarea 綁定了 @input = "update" ,方法中用 debounce 指令設置了延時,在每次輸
入后延時同步輸入框的數據,減少了更新次數,提高性能。
這個例子從 Github 的 API 中獲取了最新的 Vue.js 提交數據,并且以列表形式將它們展示了出
來。你可以輕松地切換 master 和 dev 分支。
created: function () { this.fetchData() },
在 created 鉤子中用聲明的 fetchData 函數獲取ajax異步數據并渲染到頁面。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/82117.html
摘要:實例化發生了什么詳解生命周期本文將對的生命周期進行詳細的講解讓你了解一個實例的誕生都經歷了什么我在上建立了一個存放筆記的倉庫以后會陸續更新一些知識和項目中遇到的坑有興趣的同學可以去看看哈歡迎傳送門實例化一個這是一個方法觸發鉤子函數組件實例剛 實例化vue發生了什么?(詳解vue生命周期) 本文將對vue的生命周期進行詳細的講解,讓你了解一個vue實例的誕生都經歷了什么~ 我在Githu...
摘要:此時還未有選項鉤子函數和間的生命周期完成后,會有一個判斷過程,判斷對象是否有選項。鉤子函數和鉤子函數間的生命周期當發現中的數據發生了改變,會觸發對應組件的重新渲染,先后調用和鉤子函數。和鉤子函數間的生命周期鉤子函數在實例銷毀之前調用。 vue生命周期 這是vue生命周期的圖示具體內容:showImg(https://segmentfault.com/img/bV4xju?w=1200&...
摘要:在這一步,實例已完成以下的配置數據觀測,屬性和方法的運算,事件回調。可以直接寫等標簽的寫法之前會的工程師上手框架的成本較低 簡介 1.美團工程師推出的基于Vue.js封裝的用于開發小程序的框架2.融合了原生小程序和Vue.js的特點3.可完全組件化開發 特點 1.組件化開發2.完成的Vue.js開發體驗(前提是熟悉Vue)3.可使用Vuex管理狀態4.Webpack構建項目5.最終H5...
閱讀 3441·2023-04-25 23:25
閱讀 2069·2021-11-12 10:36
閱讀 2816·2019-08-30 12:47
閱讀 2037·2019-08-29 18:45
閱讀 435·2019-08-29 17:28
閱讀 1785·2019-08-29 17:15
閱讀 1707·2019-08-29 16:05
閱讀 1405·2019-08-29 14:17