起因
uni-app 進(jìn)行小程序開發(fā)時吨枉,更改了相應(yīng)的參數(shù)后,是需要進(jìn)行重新編譯誓酒,才能反饋在頁面同中的樟蠕,然后一旦重新編譯的話,默認(rèn)情況下后跳轉(zhuǎn)到首頁靠柑,也就是在pages.json中pages數(shù)組中的第一項(xiàng)寨辩。
對此uni-app是提供了有了condition https://uniapp.dcloud.io/collocation/pages.html#condition ,它是在pages.json中進(jìn)行手動配置病往,更在于傳入到頁面的參數(shù)是并不容易拿到的捣染。
因此希望可以通過某種方式可以最終達(dá)到,重新編譯頁面后停巷,頁面依舊可以停留在原先的頁面,并且數(shù)據(jù)參數(shù)都是要與原來保持一致榕栏。
uni-app中的路由監(jiān)聽
如果我能進(jìn)行uni-app中的路由攔截畔勤,并將攔截到的路由設(shè)置在storage中,編譯后扒磁,再次進(jìn)入到首頁時庆揪,使用navigateTo直接跳轉(zhuǎn)到原來的頁面,一切便大功造成妨托。
對于uni-app中的路由攔截可以使用官方的攔截器缸榛,https://uniapp.dcloud.io/api/interceptor.html#addinterceptor吝羞。 也可以采用重寫路由的方式,如下:
const _navigateTo = uni.navigateTo
uni.navigateTo = (params) => {
// 此處便是可以一些全局?jǐn)r截操作
_navigateTo(params)
}
問題在于,我們使用的原生的頂部欄内颗,返回上一頁钧排,并不能被攔截到。而在微信小程序中均澳,事件onBackPress是不起作用的恨溜。
因此這種方式不能很好的解決。https://uniapp.dcloud.io/tutorial/page.html#lifecycle
利用應(yīng)用和頁面的生命周期
基本的思路是在頁面或者應(yīng)用的銷毀的銷毀的生命周期時將當(dāng)前頁面的信息存儲到storage找前,然后在頁面加載時糟袁,跳轉(zhuǎn)到原先的頁面。
最終很遺憾的是躺盛,再次編譯時是沒有進(jìn)入到 頁面生命周期 onUnLoad中项戴,也沒有進(jìn)入到組件生命周期 beforeDestory中的。
最終方案
在開發(fā)環(huán)境中使用定時器槽惫,不斷將當(dāng)前頁面的值寫入到Storage中肯尺,編譯再次進(jìn)入時跳轉(zhuǎn)。
export function navigateToLastRoute() {
let preRoute = getCurrentPage()
const switchMenus= ['/pages/workbench/workbench','/pages/user/user']
if (switchMenus.indexOf(preRoute) === -1) {
uni.navigateTo({
url: preRoute
})
}else{
uni.switchTab({
url:preRoute
})
}
setInterval(() => {
const routes = getCurrentPages()
const fullPath = routes[routes.length - 1].$page.fullPath;
if(preRoute !== fullPath){
setCurrentPage(fullPath)
preRoute = fullPath
}
}, 4000)
}
通過了這種方式躯枢,特別對于層級很深的頁面则吟,不需要再編譯之后一層層去點(diǎn)到之前的頁面了,開發(fā)效率被大大提升锄蹂。