@morjs/runtime-web
Version:
mor runtime for web
142 lines • 4.57 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const extendApi_1 = require("../api/utils/extendApi");
const helper_1 = require("./helper");
const history_1 = require("./history");
const pageStack_1 = require("./pageStack");
const router_1 = require("./router");
const url_1 = require("./url");
const IDLE_TIME = 20;
const NAVIGATE_TASKS = [];
function getTo(url) {
const absolutePath = (0, url_1.getAbsolutePath)(url);
const urlArr = (0, url_1.getCustomUrl)(absolutePath).split('?');
return {
pathname: urlArr[0],
search: urlArr[1] ? `?${urlArr[1]}` : ''
};
}
function handleNavigateTasks() {
if (NAVIGATE_TASKS.length) {
setTimeout(() => {
var _a, _b;
NAVIGATE_TASKS.shift();
if (NAVIGATE_TASKS.length) {
routerFunctions[(_a = NAVIGATE_TASKS[0]) === null || _a === void 0 ? void 0 : _a.eventName].call(null, (_b = NAVIGATE_TASKS[0]) === null || _b === void 0 ? void 0 : _b.options);
handleNavigateTasks();
}
}, IDLE_TIME);
}
}
const routerFunctions = {
navigateTo: _navigateTo,
navigateBack: _navigateBack,
redirectTo: _redirectTo,
switchTab: _switchTab,
reLaunch: _reLaunch
};
// 问题: 路由同时触发,导致history异常(比如back、to同时触发,会导致两次pop)
// 解决方案: 路由方法触发,间隔10ms
function navigateHandler(methodName, options) {
return new Promise((resolve) => {
NAVIGATE_TASKS.push({ eventName: methodName, options });
if (NAVIGATE_TASKS.length === 1) {
routerFunctions[methodName].call(null, options);
handleNavigateTasks();
}
resolve('');
});
}
function navigateTo(options) {
return navigateHandler('navigateTo', options);
}
function navigateBack(options) {
return navigateHandler('navigateBack', options);
}
function redirectTo(options) {
return navigateHandler('redirectTo', options);
}
function switchTab(options) {
return navigateHandler('switchTab', options);
}
function reLaunch(options) {
return navigateHandler('reLaunch', options);
}
(0, extendApi_1.appendApis)({
navigateTo,
navigateBack,
redirectTo,
switchTab,
reLaunch
}, extendApi_1.DEFAULT_API_NO_CONFLICT);
function _navigateTo(options) {
const { url } = options || {};
if (!url) {
console.error('url 不能为空');
return;
}
// eleme 容器中history.push后history栈没变化,加上setTimeout解决问题(原因不明)
setTimeout(() => {
history_1.history.push(getTo(url));
});
}
function _navigateBack(options) {
let { delta = 1 } = options || {};
const pageStack = (0, pageStack_1.getCurrentPages)();
// 兼容:页面刷新后,页面栈仅保留当前页面,仍需支持返回。
if (pageStack.length === 1) {
window.history.back();
return;
}
if (delta < 1)
delta = 1;
// delta大于页面栈长度, 返回页面第一页
if (delta >= pageStack.length)
delta = pageStack.length - 1;
const targetIndex = delta
? pageStack.length - delta - 1
: pageStack.length - 2;
const targetPage = pageStack[targetIndex] || {};
window.dispatchEvent(new CustomEvent('__tigaRouterChange', {
detail: {
action: 'POP',
delta,
location: Object.assign({}, targetPage.__location)
}
}));
if (delta) {
// history.go(-delta);
// 某些场景,history.go(-delta) 回调函数需要1s多才触发,故暂时循环goback函数替代实现。
for (let i = 1; i <= delta; i++) {
history_1.history.goBack();
}
}
}
function _redirectTo(options) {
const { url } = options || {};
if (!url) {
console.error('url 不能为空');
return;
}
history_1.history.replace(getTo(url));
}
function _reLaunch(options) {
const { url } = options || {};
if (!url) {
console.error('url 不能为空');
return;
}
const length = window.getCurrentPages().length;
(0, router_1.batchUnloadPage)(length - 1);
redirectTo({ url });
}
function _switchTab(options) {
const { url } = options || {};
if (!url) {
console.error('url 不能为空');
return;
}
(0, router_1.unloadPageByCondition)((page) => !(0, helper_1.isTabBarPage)(page.path)); // 整理路由栈,将非 tabBar 页面移除
navigateTo({ url });
}
//# sourceMappingURL=api.js.map