init.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import {
  2. proxyLaunchHook, beforeBackHooks, beforeTabHooks, backApiCallHook,
  3. } from './hooks';
  4. import { Global, uniAppHook } from '../helpers/config';
  5. import { assertCanBack } from './util';
  6. import { warn } from '../helpers/warn';
  7. /**
  8. * 重写掉uni-app的 uni.getLocation 和 uni.chooseLocation APi
  9. * @param {Object} Router 当前路由对象
  10. */
  11. export const rewriteUniFun = function (Router) {
  12. const oldSwitchTab = uni.switchTab; // 缓存 跳转到 tabBar 页面
  13. uni.switchTab = function ({ url, ...args }, normal = false) {
  14. if (normal === true || uniAppHook.pageReady === false) { // 调用原始的uni-app api
  15. oldSwitchTab({
  16. url,
  17. ...args,
  18. });
  19. } else {
  20. if (uniAppHook.pageReady) { // 只有在路由守卫等 处理完所有操作后才能触发
  21. const { path } = Router.$Route; // 获取当前路径
  22. if (path == url) { // 路径相同不执行
  23. return warn(`当前跳转路径:${url} 已在本页面无须跳转`);
  24. }
  25. beforeTabHooks.call(Router, url.substring(1)); // 不要 /
  26. } else {
  27. warn('路由守卫正在忙碌中 不允许执行 ‘uni.switchTab’');
  28. }
  29. }
  30. };
  31. };
  32. /**
  33. * 对当前app做一个动画页面 用来过渡首次next 等待时间过长的尴尬
  34. * @param {Object} Router 当前路由对象
  35. */
  36. export const registerLoddingPage = function (Router) {
  37. const { loddingPageHook, loddingPageStyle } = Router.CONFIG.APP; // 获取app所有配置
  38. const view = new plus.nativeObj.View('router-loadding', {
  39. top: '0px',
  40. left: '0px',
  41. height: '100%',
  42. width: '100%',
  43. ...loddingPageStyle.call(Router),
  44. });
  45. loddingPageHook.call(Router, view); // 触发等待页面生命周期
  46. };
  47. /**
  48. * 移除当前 页面上 非router 声明的 onBackPress 事件
  49. * @param {Object} page 当前 vue 组件对象
  50. * @param {Object} options 当前page对象的 $options
  51. * 修复 https://github.com/SilurianYang/uni-simple-router/issues/106
  52. */
  53. export const removeBackPressEvent = function (page, options) {
  54. const isBack = assertCanBack(page);
  55. if (isBack) { // 可返回
  56. options.onBackPress = [options.onBackPress[0]]; // 路由混入的都干掉
  57. }
  58. };
  59. /**
  60. * 判断当前页面是否需要拦截返回
  61. *
  62. * @param {Object} page 当前 vue 组件对象
  63. * @param {Object} options 当前 vue 组件对象下的$options对象
  64. * @param {Array} args 当前页面是点击头部返回还是底部返回
  65. * 修复 https://github.com/SilurianYang/uni-simple-router/issues/66
  66. *
  67. * this 为当前 Router 对象
  68. */
  69. export const pageIsHeadBack = function (page, options, args) {
  70. if (args[0].from == 'navigateBack') { // 调用api返回
  71. if (Global.LockStatus) { // 正在跳转的时候 返回按键按的太快啦
  72. warn('当前页面正在处于跳转状态,请稍后再进行跳转....');
  73. return true;
  74. }
  75. Global.LockStatus = true; // 设置为锁住状态
  76. backApiCallHook.call(this, options, args);
  77. return true;
  78. }
  79. const isBack = assertCanBack(page);
  80. if (isBack) { // 可返回
  81. if (Global.LockStatus) { // 正在跳转的时候 返回按键按的太快啦
  82. warn('当前页面正在处于跳转状态,请稍后再进行跳转....');
  83. return true;
  84. }
  85. Global.LockStatus = true; // 设置为锁住状态
  86. beforeBackHooks.call(this, options, args);
  87. return true;
  88. }
  89. return false;
  90. };
  91. /**
  92. * 开始初始化app端路由配置
  93. *
  94. * @param {Object} Router
  95. *
  96. * this 为当前 page 对象
  97. */
  98. export const appInit = function (Router) {
  99. proxyLaunchHook.call(this);
  100. const { holdTabbar } = Router.CONFIG.APP;
  101. if (holdTabbar) { // 开启tab拦截时
  102. rewriteUniFun(Router);
  103. }
  104. registerLoddingPage(Router);
  105. };