關于uniapp微信小程序左上角返回按鈕的監(jiān)聽詳解
項目場景:
uni-app 開發(fā)微信小程序,界面中點擊左上角的返回按鈕或者是系統(tǒng)自帶的虛擬返回操作,返回前監(jiān)聽用戶是否在頁面內(nèi)進行了相應操作,如果有則進行提示(提示用戶是否確定要返回),如果沒有則直接返回。
問題描述:
uni-app 頁面生命周期中有 onBackPress ,不過不支持微信小程序。
翻看微信小程序官方文檔,并未發(fā)現(xiàn)可以監(jiān)聽到左上角返回按鈕的事件。
查閱相關技術文檔,確認微信小程序現(xiàn)階段并沒有提供監(jiān)聽左上角返回事件的函數(shù)。

原因分析:
頁面A進入到頁面B,用戶在頁面B進行了一些操作(比如到頁面C選擇了一些項目添加到了頁面B),這時候用戶從頁面B返回(觸發(fā)左上角返回按鈕或者系統(tǒng)自帶的返回事件)。
由于用戶進行了操作,產(chǎn)生了滯留數(shù)據(jù),這個數(shù)據(jù)存在了storage里面。
假設用戶的返回是無意的,我們需要在用戶返回頁面A時進行一個確認,即彈出提示框,讓用戶看到這個操作會清空掉他剛才所選的項目。
如果用戶確認是要返回,即返回頁面A,并清空該storage。
如果用戶取消返回,即誤觸了返回按鈕等原因,這時候取消返回事件,頁面停留在頁面B,數(shù)據(jù)storage保留。
解決方案一:
頁面A onshow 生命周期內(nèi)監(jiān)聽 從 頁面B 返回來的數(shù)據(jù),即storage是否有值。
頁面A:
onShow(){
let choose = uni.getStorageSync('product'), //頁面B緩存的數(shù)據(jù)
obj = uni.getStorageSync('backsure'); //頁面B需要用到的數(shù)據(jù)(根據(jù)實際項目開發(fā))
if(choose.length){
uni.showModal({
title: '提示',
content: '當前頁面有未保存的數(shù)據(jù),您確定要取消嗎?',
success: function (res) {
if (res.confirm) {
uni.setStorageSync('product','');
} else if (res.cancel) {
uni.navigateTo({
url: './pageB?data=' + obj.data
})
}
}
});
}
},
methods:{
topageB(){
let backsure = {
data : this.data //頁面B需要用到的數(shù)據(jù)
};
uni.setStorageSync('backsure',backsure);
uni.navigateTo({
url: './pageB?data=' + this.data
});
}
}
注意:此處的 backsure 僅僅是頁面B所需要用到的數(shù)據(jù)(即 在onLoad()生命周期需要用到), 根據(jù)實際情況選擇是否需要加上這個storage。 判斷依據(jù)依然是頁面B返回頁面A的時候 product 這個storage是否有值。
解決方案二:
頁面B 使用custom 自定義導航欄,不使用微信小程序默認的導航欄。
1、重寫頁面B 頂部的導航欄,適配所有機型,參考api :uni.getSystemInfo()。
2、給左上角返回按鈕定義點擊事件,判斷是否確認返回。
3、為防止用戶使用系統(tǒng)返回,頁面A需要重復方案一的步驟。
頁面 B:
//頂部導航欄
<view class="custom_top" :style="{height:top_height+40+'px'}">
<label class="iconMoney icons iconarrow-left" @click="toback"></label>
<text>{{thetitle}}</text>
</view>
//生命周期中賦值導航欄高度
onLoad(){
let that = this;
uni.getSystemInfo({
success(res) {
that.top_height = res.statusBarHeight; //data中 聲明 top_height:0
}
});
}
//methods方法
toback(){
let choose = uni.getStorageSync('product');
if(choose.length){
uni.showModal({
title: '提示',
content: '當前頁面有未保存的數(shù)據(jù),您確定要取消嗎?',
success: function (res) {
if (res.confirm) {
uni.navigateBack();
uni.setStorageSync('product','');
}
}
});
}else{
uni.navigateBack();
}
}
頁面A同方案一相同。
此方案可以實現(xiàn)點擊左上角返回按鈕的時候在當前頁面(頁面B)中彈框提示用戶, 而方案一中僅僅是在頁面B已經(jīng)返回到頁面A后再觸發(fā)了提示。
這里頁面A實現(xiàn)的是對用戶用系統(tǒng)的返回按鍵時, 由于小程序無法監(jiān)聽到返回事件, 所以只能是重寫需要返回的頁面B的頂部導航欄, 然后給自定義的返回按鈕加上點擊事件, 實現(xiàn)當前頁面彈框提示。
結(jié)語
1、微信小程序官方尚未提供返回的監(jiān)聽函數(shù),這是目前可以解決問題的最佳方法(如果有其他的歡迎留言討論)
2、如果對頁面B已經(jīng)返回到頁面A后再提示沒有異議,那可以直接采用方案一,更直接,功能需求也可以實現(xiàn)。
3、方案二是對方案一的補充,同時會更替掉原生的微信小程序?qū)Ш綑?,需要手寫代碼適配機型。
到此這篇關于關于uniapp微信小程序左上角返回按鈕監(jiān)聽的文章就介紹到這了,更多相關uniapp小程序返回按鈕監(jiān)聽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳解JS截取字符串的三個方法substring,substr,slice
js中有三個截取字符的方法,分別是substring()、substr()、slice(),平時我們可能都用到過,但總是會對這些方法有點混淆。本文將詳細介紹一下這三者的區(qū)別,需要的可以參考一下2022-03-03
JavaScript利用img實現(xiàn)前端頁面埋點功能
做數(shù)據(jù)分析的時候需要獲取足量的有效數(shù)據(jù),這個時候就需要我們在前端頁面埋點。如何來實現(xiàn)一個前端埋點功能,本文就帶你上手試試2022-06-06
用 js 的 selection range 操作選擇區(qū)域內(nèi)容和圖片
本篇文章主要介紹了用js的selection range操作選擇區(qū)域內(nèi)容和圖片的相關知識。具有很好的參考價值。下面跟著小編一起來看下吧2017-04-04
微信小程序列表渲染功能之列表下拉刷新及上拉加載的實現(xiàn)方法分析
這篇文章主要介紹了微信小程序列表渲染功能之列表下拉刷新及上拉加載的實現(xiàn)方法,結(jié)合實例形式分析了微信小程序列表下拉刷新及上拉加載的相關實現(xiàn)方法與技巧操作,需要的朋友可以參考下2017-11-11
javascript簡單進制轉(zhuǎn)換實現(xiàn)方法
這篇文章主要介紹了javascript簡單進制轉(zhuǎn)換實現(xiàn)方法,涉及javascript字符串轉(zhuǎn)換與數(shù)值操作相關技巧,需要的朋友可以參考下2016-11-11

