|
|
|
|
import { appPlatform } from './util';
|
|
|
|
|
import { methods, H5FnTypeToggle, Global } from './config';
|
|
|
|
|
import { transitionTo } from '../appRouter/hooks';
|
|
|
|
|
import { appletsTransitionTo, backCallHook } from '../appletsRouter/hooks';
|
|
|
|
|
import uniPushTo from '../appRouter/uniNav';
|
|
|
|
|
import appletsUniPushTo from '../appletsRouter/appletsNav';
|
|
|
|
|
import { err, warn } from './warn';
|
|
|
|
|
import H5PushTo from '../vueRouter/routerNav';
|
|
|
|
|
import * as compile from './compile';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 返回api 触发的公共函数
|
|
|
|
|
* @param {Object/String} rule 当前跳转规则
|
|
|
|
|
* @param {String} fnType 跳转页面的类型方法
|
|
|
|
|
*
|
|
|
|
|
* this 为当前 Router 实例
|
|
|
|
|
*/
|
|
|
|
|
const isBcakNav = function ({
|
|
|
|
|
backLayer,
|
|
|
|
|
delta,
|
|
|
|
|
H5PATCH,
|
|
|
|
|
}) {
|
|
|
|
|
compile.H5(() => {
|
|
|
|
|
H5PATCH.on('historyBack', {
|
|
|
|
|
backLayer,
|
|
|
|
|
delta,
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
compile.APP(() => {
|
|
|
|
|
Global.backLayerC = backLayer; // 告诉路由需要返回几层
|
|
|
|
|
uni.navigateBack({
|
|
|
|
|
delta: backLayer,
|
|
|
|
|
complete: () => {
|
|
|
|
|
Global.LockStatus = false; // 跳转完成解锁状态
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
compile.mp(() => {
|
|
|
|
|
backCallHook.call(this, backLayer, () => {
|
|
|
|
|
uni.navigateBack({
|
|
|
|
|
delta: backLayer,
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 非 返回api 触发的公共函数
|
|
|
|
|
* @param {Object/String} rule 当前跳转规则
|
|
|
|
|
* @param {String} fnType 跳转页面的类型方法
|
|
|
|
|
*
|
|
|
|
|
* this 为当前 Router 实例
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
const notBackNav = function (rule, fnType) {
|
|
|
|
|
if (rule == null) {
|
|
|
|
|
return err('跳转规则为空,不允许这样操作');
|
|
|
|
|
}
|
|
|
|
|
if (rule.constructor === String) { // 单独 path 的情况 允许?拼接参数
|
|
|
|
|
const ruleArray = rule.split('?');
|
|
|
|
|
if (ruleArray.length > 1) {
|
|
|
|
|
rule = {
|
|
|
|
|
path: ruleArray[0],
|
|
|
|
|
query: Global.$parseQuery.parse(ruleArray[1]),
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
switch (appPlatform(true)) {
|
|
|
|
|
case 'H5':
|
|
|
|
|
return H5PushTo.call(this, H5FnTypeToggle[fnType], rule, methods[fnType]);
|
|
|
|
|
case 'APP':
|
|
|
|
|
Global.LockStatus = true; // 设置为锁住状态
|
|
|
|
|
return transitionTo.call(this, rule, fnType, uniPushTo);
|
|
|
|
|
case 'APPLETS':
|
|
|
|
|
Global.LockStatus = true; // 设置为锁住状态
|
|
|
|
|
return appletsTransitionTo.call(this, rule, fnType, appletsUniPushTo);
|
|
|
|
|
default:
|
|
|
|
|
err('糟糕!!!还有其他的执行环境???没听说过啊。一脸懵逼???加QQ群问问:769241495');
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 处理正在跳转的公共api
|
|
|
|
|
* @param {Object/String} rule 当前跳转规则
|
|
|
|
|
* @param {String} fnType 跳转页面的类型方法
|
|
|
|
|
* @param {Boolean} isBack 是否通过 back() api 调用的 默认为false
|
|
|
|
|
* @param {Boolean} enforce 是否强制越过跳转加锁检查 默认false 目前只有back() api 传递了
|
|
|
|
|
*
|
|
|
|
|
* this 为当前 Router 实例
|
|
|
|
|
*/
|
|
|
|
|
const navjump = function (rule, fnType, isBack = false, enforce = false) {
|
|
|
|
|
if (Global.LockStatus && !enforce) { // 正在跳转的状态下 给出提示正在跳转
|
|
|
|
|
return warn('当前页面正在处于跳转状态,请稍后再进行跳转....');
|
|
|
|
|
}
|
|
|
|
|
if (isBack) { // 是返回api触发的
|
|
|
|
|
return isBcakNav.call(this, rule, fnType);
|
|
|
|
|
}
|
|
|
|
|
return notBackNav.call(this, rule, fnType);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export default navjump;
|