在小程序中无法做路由拦截,所以用page中间页面来代替类似进入页面之后(onShow)判断是否登录,没有的话重定向到登录页的这种需求。
中间页面的主要功能:
1)在每个需要判断是否登录的功能的页面onshow生命周期中来获取storage中的token值,如果有,则跳转到对应页面,没有则跳转到登录页面。
2)跳转到登录页面之前,需要将即将跳转的页面(验证是否登录的页面)的路径及参数存入storage中,以便登录完成后继续跳转到之前想跳转的那个页面。
全局引入中间页:
每个页面使用:
需要使用中间页的页面,使用app.pageIntercept()包裹,不需要的则不包裹。
//middleware.js
/* page中间件,在page下的onshow生命周期中判断是否登录时候引入 */
export function pageIntercept(pageObj) {
if (pageObj.onShow) {
let _onShow = pageObj.onShow;
// 使用onLoad的话需要传递options
pageObj.onShow = function (options) {
//如果storage中有token,则证明已经登录跳转到对应页面
if (wx.getStorageSync('token')) {
wx.removeStorageSync('lastPage')
let currentInstance = getPageInstance(); // 获取当前页面
_onShow.call(currentInstance, options);
} else {
setLastPage()
//跳转到登录页
wx.showModal({
title: '提示',
content: '您还没有登录',
showCancel: false,
confirmText: '去登录',
success(res) {
if (res.confirm) {
wx.reLaunch({
url: "/pages/login/index"
});
}
}
})
}
}
}
return pageObj;
}
//设置登陆前的页面
function setLastPage() {
let path = '/' + getPageInstance().route
let options = getPageInstance().options
let params = ''
for (let prop in options) {
params += `${prop}=${options[prop]}&`
}
params = params.substring(0, params.length - 1)
if (params) {
path = `${path}?${params}`
}
wx.setStorageSync('lastPage', path)
}
// 获取当前页面
function getPageInstance() {
let pages = getCurrentPages();
return pages[pages.length - 1];
}