UNPKG

@morjs/runtime-web

Version:
142 lines 4.57 kB
"use strict"; 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