@ray-js/router
Version:
Ray Core
74 lines (73 loc) • 2.08 kB
JavaScript
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
import "core-js/modules/esnext.iterator.constructor.js";
import "core-js/modules/esnext.iterator.for-each.js";
import "core-js/modules/esnext.iterator.some.js";
import { RouterScheduler as IRouterScheduler } from '@ray-js/types';
/**
* web 环境下的路由协调器
*/
export class RouterScheduler extends IRouterScheduler {
$currentRoute = '';
$listeners = {};
$entityMap = [];
basename = '/';
/**
* 当前调度器的 route 地址
*/
get currentRoute() {
return this.$currentRoute;
}
set currentRoute(val) {
if (val !== this.currentRoute) {
this.$currentRoute = val.replace(/\/$/, '');
this.emit('routeChange', this.currentRoute);
}
}
on(event, fn) {
if (!this.$listeners[event]) {
this.$listeners[event] = [];
}
const events = this.$listeners[event];
events.push(fn);
return () => {
events.splice(events.indexOf(fn), 1);
};
}
// 给 TabBar 监听,用于处理当前高亮状态
emit(event) {
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
args[_key - 1] = arguments[_key];
}
const fns = this.$listeners[event];
if (Array.isArray(fns)) {
fns.forEach(fn => {
fn(...args);
});
}
}
/**
* 初始化路由,注册应用声明的路由,并处理映射关系
*/
registryPages(params) {
const {
pages,
tabBar
} = params;
const tabBarList = (tabBar === null || tabBar === void 0 ? void 0 : tabBar.list) || [];
pages.forEach(page => {
const isTabBar = tabBarList.some(item => page.path === item.pagePath);
page.route = page.route || page.path;
page.originalRoute = page.route;
this.addPage(_objectSpread(_objectSpread({}, page), {}, {
isTabBar
}));
});
}
getMatchedPage(pathname) {
this.currentRoute = pathname;
return this.matchPageByPathname(pathname);
}
addPage(page) {
this.$entityMap.push(page);
}
}