import { isH5, formatConfig, appPlatform } from './helpers/util'; import navjump from './helpers/navJump'; import { H5GetPageRoute } from './vueRouter/util'; import { APPGetPageRoute } from './appRouter/util'; import { AppletsPageRoute } from './appletsRouter/util'; import { lifeCycle, Global } from './helpers/config'; import { warn, err } from './helpers/warn'; import { registerRouterHooks, registerHook } from './lifeCycle/hooks'; import { vueMount } from './vueRouter/base'; import appletsMount from './patch/applets-patch'; import appMount from './patch/app-patch'; import initMixins from './helpers/mixins'; import ParseQuery from './helpers/urlQuery'; // #ifdef H5 import H5 from './patch/h5-patch'; // #endif let H5PATCH = null; // #ifdef H5 H5PATCH = new H5(isH5()); // #endif const parseQuery = new ParseQuery(); Global.H5RouterReady = new Promise((resolve) => Global.RouterReadyPromise = resolve); class Router { constructor(arg) { Router.$root = this; Global.Router = this; // 全局缓存一个对象,不必使用时都传递 Global.$parseQuery = parseQuery; this.CONFIG = formatConfig(arg); this.lifeCycle = lifeCycle; registerRouterHooks.call(this); // 注册全局Router生命钩子 if (appPlatform() === 'H5') { H5PATCH.setLoadingStatus(this.CONFIG.h5); } } get $Route() { return this.getPageRoute(); } /** * 获取 url 参数帮助类实例 */ get $parseQuery() { return Global.$parseQuery; } /** * 获取当前是否处于正在跳转的状态 * H5 状态下始终为false */ get $lockStatus() { return Global.LockStatus; } /** * 动态设置拦截状态 */ set $lockStatus(status) { warn('你确定要这么做?你知道后果?', true); Global.LockStatus = status; } /** 动态的导航到一个新 URL 保留浏览历史 * navigateTo * @param {Object} rule */ push(rule) { navjump.call(this, rule, 'push'); } /** 动态的导航到一个新 URL 关闭当前页面,跳转到的某个页面。 * redirectTo * @param {Object} rule */ replace(rule) { navjump.call(this, rule, 'replace'); } /** 动态的导航到一个新 URL 关闭所有页面,打开到应用内的某个页面 * reLaunch * @param {Object} rule */ replaceAll(rule) { navjump.call(this, rule, 'replaceAll'); } /** 动态的导航到一个新 url 关闭所有页面,打开到应用内的某个tab * @param {Object} rule */ pushTab(rule) { navjump.call(this, rule, 'pushTab'); } /** * 返回到指定层级页面上 * @param {Number} backLayer 需要返回的页面层级 默认 1 * @param {Object} delta 暂时无用 * @param {enforce} 是否强制越过跳转加锁检查 默认 false */ back(backLayer = 1, delta, enforce = false) { if (backLayer.constructor != Number) { return err( `返回层级参数必须是一个Number类型且必须大于1:${backLayer}`, ); } navjump.call(this, { backLayer, delta, H5PATCH, }, 'back', true, enforce); } /** * 获取当前页面下的 Route 信息 * * @param {Object} Vim 当前开发者可以传递一个 vue 组件对象 来获取当前下的 Route 信息 */ getPageRoute(Vim) { const pages = getCurrentPages(); switch (appPlatform(true)) { case 'H5': return H5GetPageRoute.call(this, pages, Vim); case 'APP': return APPGetPageRoute(pages, Vim); case 'APPLETS': return AppletsPageRoute(pages, Vim); default: break; } } beforeEach(fn) { return registerHook(this.lifeCycle.beforeHooks, fn); } afterEach(fn) { return registerHook(this.lifeCycle.afterHooks, fn); } } Router.install = function (Vue) { initMixins(Vue, Router); Object.defineProperty(Vue.prototype, '$Router', { get() { return Router.$root; }, }); Object.defineProperty(Vue.prototype, '$Route', { get() { return Router.$root.getPageRoute(this); }, }); }; export default Router; /** * * @param {VueComponent } Vim vue实例对象 * @param {dom} el dom节点选择器 */ export const RouterMount = function (Vim, el) { switch (appPlatform(true)) { case 'APP': appMount(Vim, el); break; case 'APPLETS': appletsMount(Vim, el); break; case 'H5': vueMount.push({ Vim, el }); break; default: warn('糟糕!!!还有其他的执行环境???没听说过啊。一脸懵逼???加QQ群问问:769241495'); break; } };