123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- 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;
- }
- };
|