深入淺析uni-app的生命週期

2022-02-24 19:00:31
本篇文章給大家帶來了關於宣告週期的相關知識,其中主要介紹了應用宣告週期、頁面生命週期以及元件生命週期的相關問題,希望對大家有幫助。

推薦:《》

應用生命週期

uni-app 支援如下應用生命週期函數:

函數名說明
onLaunchuni-app 初始化完成時觸發(全域性只觸發一次)
onShowuni-app 啟動,或從後臺進入前臺顯示
onHideuni-app 從前臺進入後臺
onErroruni-app 報錯時觸發
onUniNViewMessagenvue 頁面傳送的資料進行監聽,可參考 nvue 向 vue 通訊
onUnhandledRejection對未處理的 Promise 拒絕事件監聽函數(2.8.1+)
onPageNotFound頁面不存在監聽函數
onThemeChange監聽系統主題變化

注意

  • 應用生命週期僅可在App.vue中監聽,在其它頁面監聽無效。
  • onlaunch裡進行頁面跳轉,如遇白屏報錯,請參考onlaunch生命週期內navigateto跳轉頁面注意 - DCloud問答
  • onPageNotFound 頁面實際上已經開啟了(比如通過分享卡片、小程式碼)且發現頁面不存在,才會觸發,api 跳轉不存在的頁面不會觸發(如 uni.navigateTo)

頁面生命週期

uni-app 支援如下頁面生命週期函數:

函數名說明平臺差異說明最低版本
onInit監聽頁面初始化,其引數同 onLoad 引數,為上個頁面傳遞的資料,引數型別為 Object(用於頁面傳參),觸發時機早於 onLoad百度小程式3.1.0+
onLoad監聽頁面載入,其引數為上個頁面傳遞的資料,引數型別為 Object(用於頁面傳參),參考範例

onShow監聽頁面顯示。頁面每次出現在螢幕上都觸發,包括從下級頁面點返回露出當前頁面

onReady監聽頁面初次渲染完成。注意如果渲染速度快,會在頁面進入動畫完成前觸發

onHide監聽頁面隱藏

onUnload監聽頁面解除安裝

onResize監聽視窗尺寸變化App、微信小程式
onPullDownRefresh監聽使用者下拉動作,一般用於下拉重新整理,參考範例

onReachBottom頁面捲動到底部的事件(不是scroll-view滾到底),常用於下拉下一頁資料。具體見下方注意事項

onTabItemTap點選 tab 時觸發,引數為Object,具體見下方注意事項微信小程式、QQ小程式、支付寶小程式、百度小程式、H5、App
onShareAppMessage使用者點選右上角分享微信小程式、QQ小程式、支付寶小程式、位元組小程式、飛書小程式、快手小程式
onPageScroll監聽頁面捲動,引數為Objectnvue暫不支援
onNavigationBarButtonTap監聽原生標題列按鈕點選事件,引數為ObjectApp、H5
onBackPress監聽頁面返回,返回 event = {from:backbutton、 navigateBack} ,backbutton 表示來源是左上角返回按鈕或 android 返回鍵;navigateBack表示來源是 uni.navigateBack ;詳細說明及使用:onBackPress 詳解。支付寶小程式只有真機能觸發,只能監聽非navigateBack引起的返回,不可阻止預設行為。app、H5、支付寶小程式
onNavigationBarSearchInputChanged監聽原生標題列搜尋輸入框輸入內容變化事件App、H51.6.0
onNavigationBarSearchInputConfirmed監聽原生標題列搜尋輸入框搜尋事件,使用者點選軟鍵盤上的「搜尋」按鈕時觸發。App、H51.6.0
onNavigationBarSearchInputClicked監聽原生標題列搜尋輸入框點選事件(pages.json 中的 searchInput 設定 disabled 為 true 時才會觸發)App、H51.6.0
onShareTimeline監聽使用者點選右上角轉發到朋友圈微信小程式2.8.1+
onAddToFavorites監聽使用者點選右上角收藏微信小程式2.8.1+

onInit使用注意

  • 僅百度小程式基礎庫 3.260 以上支援 onInit 生命週期
  • 其他版本或平臺可以同時使用 onLoad 生命週期進行相容,注意避免重複執行相同邏輯
  • 不依賴頁面傳參的邏輯可以直接使用 created 生命週期替代

onReachBottom使用注意 可在pages.json裡定義具體頁面底部的觸發距離onReachBottomDistance,比如設為50,那麼捲動頁面到距離底部50px時,就會觸發onReachBottom事件。

如使用scroll-view導致頁面沒有捲動,則觸底事件不會被觸發。scroll-view捲動到底部的事件請參考scroll-view的檔案

onPageScroll (監聽捲動、捲動監聽、捲動事件)引數說明:

屬性型別說明
scrollTopNumber頁面在垂直方向已捲動的距離(單位px)

注意

  • onPageScroll裡不要寫互動複雜的js,比如頻繁修改頁面。因為這個生命週期是在渲染層觸發的,在非h5端,js是在邏輯層執行的,兩層之間通訊是有損耗的。如果在捲動過程中,頻發觸發兩層之間的資料交換,可能會造成卡頓。
  • 如果想實現捲動時標題列透明漸變,在App和H5下,可在pages.json中設定titleNView下的type為transparent,參考。
  • 如果需要捲動吸頂固定某些元素,推薦使用css的粘性佈局,參考外掛市場。外掛市場也有其他js實現的吸頂外掛,但效能不佳,需要時可自行搜尋。
  • 在App、微信小程式、H5中,也可以使用wxs監聽捲動,參考;在app-nvue中,可以使用bindingx監聽捲動,參考。
  • onBackPress上不可使用async,會導致無法阻止預設返回
onPageScroll : function(e) { //nvue暫不支援捲動監聽,可用bindingx代替
    console.log("捲動距離為:" + e.scrollTop);
},

onTabItemTap 返回的json物件說明:

屬性型別說明
indexString被點選tabItem的序號,從0開始
pagePathString被點選tabItem的頁面路徑
textString被點選tabItem的按鈕文字

注意

  • onTabItemTap常用於點選當前tabitem,捲動或重新整理當前頁面。如果是點選不同的tabitem,一定會觸發頁面切換。
  • 如果想在App端實現點選某個tabitem不跳轉頁面,不能使用onTabItemTap,可以使用plus.nativeObj.view放一個區塊蓋住原先的tabitem,並攔截點選事件。
  • 支付寶小程式平臺onTabItemTap表現為點選非當前tabitem後觸發,因此不能用於實現點選返回頂部這種操作
onTabItemTap : function(e) {
    console.log(e);
    // e的返回格式為json物件: {"index":0,"text":"首頁","pagePath":"pages/index/index"}
},

onNavigationBarButtonTap 引數說明:

屬性型別說明
indexNumber原生標題列按鈕陣列的下標
onNavigationBarButtonTap : function (e) {
    console.log(e);
    // e的返回格式為json物件:{"text":"測試","index":0}
}

onBackPress 回撥引數物件說明:

屬性型別說明
fromString觸發返回行為的來源:'backbutton'——左上角導航欄按鈕及安卓返回鍵;'navigateBack'——uni.navigateBack() 方法。支付寶小程式端不支援返回此欄位
export default {
    data() {
        return {};
    },
    onBackPress(options) {
        console.log('from:' + options.from)
    }
}

注意

  • nvue 頁面weex編譯模式支援的生命週期同weex,具體參考:weex生命週期介紹。
  • 支付寶小程式真機可以監聽到非navigateBack引發的返回事件(使用小程式開發工具時不會觸發onBackPress),不可以阻止預設返回行為

元件生命週期

uni-app 元件支援的生命週期,與vue標準元件的生命週期相同。這裡沒有頁面級的onLoad等生命週期:

函數名說明平臺差異說明最低版本
beforeCreate在範例初始化之後被呼叫。詳見

created在範例建立完成後被立即呼叫。詳見

beforeMount在掛載開始之前被呼叫。詳見

mounted掛載到範例上去之後呼叫。詳見 注意:此處並不能確定子元件被全部掛載,如果需要子元件完全掛載之後在執行操作可以使用$nextTickVue官方檔案

beforeUpdate資料更新時呼叫,發生在虛擬 DOM 打修補程式之前。詳見僅H5平臺支援
updated由於資料更改導致的虛擬 DOM 重新渲染和打修補程式,在這之後會呼叫該勾點。詳見僅H5平臺支援
beforeDestroy範例銷燬之前呼叫。在這一步,範例仍然完全可用。詳見

destroyedVue 範例銷燬後呼叫。呼叫後,Vue 範例指示的所有東西都會解繫結,所有的事件監聽器會被移除,所有的子範例也會被銷燬。詳見

推薦:《》

以上就是深入淺析uni-app的生命週期的詳細內容,更多請關注TW511.COM其它相關文章!