import { afterHooks, beforeHooks, registerRouter } from './concat'; import { fromatRoutes } from './util'; import { err, warn } from '../helpers/warn'; import { proxyEachHooks } from './proxy/proxy'; /** * 重写掉H5端 uni-app原始存在的bug * * @param {Object} Router */ const rewriteUniFun = function (Router) { if (Router.CONFIG.h5.rewriteFun === false) { // 不需要重写 return false; } uni.reLaunch = function ({ url, }) { if (url === '/') { warn('H5端 uni.reLaunch(\'/\')时 默认被重写了! 你可以使用 this.$Router.replaceAll() 或者 uni.reLaunch(\'/\'?xxx)'); // eslint-disable-next-line if (history.length > 1) { // 只有在有历史记录的时候才返回 不然直接返回首页 return Router.back(); } return Router.replaceAll('/'); } const path = url.match(/^[^?]+|(\/)/)[0]; try { const query = {}; url.replace(/([^?&]+)=([^?&]+)/g, (s, v, k) => { query[v] = decodeURIComponent(k); return `${k}=${v}`; }); Router.replaceAll({ path, query, }); } catch (e) { err(`${url}解析失败了.... 试试 this.$Router.replaceAll() 吧`); } }; uni.navigateBack = function (delta) { let backLayer = delta; if (delta.constructor === Object) { // 这种可能就只是uni-app自带的返回按钮,还有种可能就是开发者另类传递的 backLayer = 1; } Router.back(backLayer, delta); }; }; /** * 拦截并注册vueRouter中的生命钩子,路由表解析 * @param {Object} Router * @param {vueRouter} vueRouter */ const init = function (Router, vueRouter) { const CONFIG = Router.CONFIG.h5; vueRouter.afterHooks = proxyEachHooks(Router, 'afterHooks', afterHooks); vueRouter.beforeHooks = proxyEachHooks(Router, 'beforeHooks', beforeHooks); const objVueRoutes = fromatRoutes(vueRouter.options.routes, false, {}); // 返回一个格式化好的routes 键值对的形式 const objSelfRoutes = fromatRoutes(Router.CONFIG.routes, true, CONFIG); Router.vueRoutes = objVueRoutes; // 挂载vue-routes到当前的路由下 Router.selfRoutes = { ...Router.selfRoutes || {}, ...objSelfRoutes, }; // 挂载self-routes到当前路由下 Router.$route = vueRouter; // 挂载vue-router到$route rewriteUniFun(Router); // 重新掉uniapp上的一些有异常的方法 registerRouter(Router, vueRouter, CONFIG.vueRouterDev); }; export default init;