uniapp 页面栈一定深度后,回首页导航到新页面的解决方案
uniapp 页面导航解决方案
在 uniapp 中,要实现先弹出页面栈回到首页,然后再跳转到指定页面。
/**
* @description 后台选择链接专用跳转
*/
interface Link {
path: string;
name?: string;
type: string;
isTab: boolean;
query?: Record<string, any>;
}
export enum LinkTypeEnum {
"SHOP_PAGES" = "shop",
"CUSTOM_LINK" = "custom",
}
export function navigateTo(
link: Link,
navigateType: "navigateTo" | "reLaunch" | "switchTab" = "navigateTo"
) {
const url = link.query
? `${link.path}?${objectToQuery(link.query)}`
: link.path;
navigateType == "navigateTo" && uni.navigateTo({ url });
navigateType == "reLaunch" && uni.reLaunch({ url });
}
/**
* @description 重新定向页面路由
* @param {string} baseUrl 首页基准路由URL
* @param {string} navigateToUrl 基准路由->跳转的页面URL(可以为空,这样就是定向到首页)
* @param {Function} uToastRefShow 弹窗提示
* @param {string} uToastMsg 弹窗提示信息
*
*/
export const goRedirectRouteMethod = async (
baseUrl: string,
navigateToUrl: string,
uToastRefShowFun: Function,
uToastMsg: string = "跳转成功" ) => {
console.log("goRedirectRouteMethod:baseUrl=", baseUrl,);
console.log("goRedirectRouteMethod:navigateToUrl=", navigateToUrl);
/**
* @description 默认 navigateBack
*/
if (baseUrl == undefined || baseUrl == null || baseUrl == '') {
uni.navigateBack({});
}
let pages = getCurrentPages();
if (pages.length == 0) {
return;
}
console.log("getCurrentPages", pages);
if (baseUrl.startsWith("/")) {
baseUrl = baseUrl.substring(1, baseUrl.length);
}
console.log("====baseUrl====", baseUrl);
let lngth: number = pages.length;
// 返回的页面数
let deltatmp: number = 1;
for (let index = 0; index < lngth; index++) {
let route = pages[index].route;
if (route == baseUrl) {
deltatmp = lngth - index - 1;
break;
}
}
if (!(uToastRefShowFun == null || uToastRefShowFun == undefined)) {
uToastRefShowFun(uToastMsg, "success", 2000);
}
await setTimeout(() => {
// 4. 返回A页面
uni.navigateBack({
delta: deltatmp,
success: () => {
/** === **/
setTimeout(() => {
if (navigateToUrl?.length > 0) {
if (!navigateToUrl.startsWith("/")) {
navigateToUrl = "/" + navigateToUrl;
}
// 5. 跳转到B页面 有BUG 首页会闪一下
navigateTo({
path: navigateToUrl,
type: '',
isTab: false,
query: {}
})
}
}, 300)
/** === **/
},
});
}, 2000);
}
解决方案说明
上述代码提供了一个完整的导航工具类,主要功能包括:
- 获取页面栈长度:通过
getCurrentPages()
API 获取当前页面栈的深度 - 智能导航逻辑:
- 先判断当前是否已经在首页
- 如果不在首页,根据首页在栈中的位置选择合适的方式返回首页
- 返回首页后,再跳转到目标页面
- 参数传递支持:支持向目标页面传递参数
- 错误处理:当导航失败时提供备选方案
使用方法
你可以在任何页面中引入这个导航工具,然后调用 backToHomeAndNavigate
方法,传入目标页面路径和可选的参数对象。
goRedirectRouteMethod(
"/package/index/index",
"/package/healthSign/index",
uToastRefShow, // 弹窗提示信息函数
"转到【首页】-->【健康签约】页面"
);
注意事项
- 请根据你的项目结构调整首页路径
baseUrl
- 页面路径需要使用绝对路径,以
/
开头 - 代码中使用了
setTimeout
来确保页面跳转的顺序性,你可以根据实际情况调整延迟时间或使用 Promise 链式调用
这个解决方案适用于大多数 uniapp 项目,并且提供了健壮的错误处理机制,确保导航操作能够顺利完成。