router.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. // HR 模块路由工具:统一处理 reLaunch 去重与返回兜底
  2. // 规范化页面路径:去掉 query / hash 与开头斜杠,得到与 getCurrentPages().route 一致的格式
  3. function normalizeRoute(url) {
  4. return url.split("?")[0].split("#")[0].replace(/^\//, "");
  5. }
  6. // 记录最近一次 reLaunch,用于去重:避免连续两次相同导航互相取消
  7. let lastRelaunch = null;
  8. /**
  9. * 带防护的 reLaunch:
  10. * - 目标就是当前页时直接跳过(reLaunch 会销毁重建当前页,导致 onLoad 与页面请求重复执行);
  11. * - 同目标的并发导航复用上一次结果,不再发起新 reLaunch;
  12. * - 即便被新导航取消(Navigation cancelled),也吞掉 rejection,不抛未处理异常。
  13. */
  14. export function switchMain(url) {
  15. const target = normalizeRoute(url);
  16. const pages = getCurrentPages() || [];
  17. if (pages.length && pages[pages.length - 1] && pages[pages.length - 1].route === target) {
  18. return Promise.resolve();
  19. }
  20. if (lastRelaunch && lastRelaunch.target === target) return lastRelaunch.promise;
  21. const promise = new Promise((resolve) => {
  22. uni.reLaunch({
  23. url,
  24. success: () => resolve(),
  25. fail: (err) => {
  26. if (!err || /Navigation cancelled/i.test(String(err.errMsg || ""))) {
  27. resolve();
  28. } else {
  29. console.error("[hr-router] reLaunch failed:", err);
  30. resolve();
  31. }
  32. },
  33. });
  34. });
  35. lastRelaunch = { target, promise };
  36. promise.finally(() => {
  37. if (lastRelaunch && lastRelaunch.promise === promise) lastRelaunch = null;
  38. });
  39. return promise;
  40. }
  41. export function go(url) {
  42. uni.navigateTo({ url });
  43. }
  44. // 返回上一页;没有上一页(深链进入)时退回 fallbackUrl
  45. export function back(fallbackUrl = "") {
  46. const pages = getCurrentPages() || [];
  47. if (pages.length > 1) {
  48. uni.navigateBack({ delta: 1 });
  49. return;
  50. }
  51. if (fallbackUrl) switchMain(fallbackUrl);
  52. }