1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- 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;
|