Files
testing-tool/sidepanel/modules/Router.js
T
雨霖铃 8cb9580860 refactor(router): 优化路由重定向配置与组件初始化逻辑
- 设置默认重定向路由为 '/'
- 修复路由实例化后未正确调用 init 方法的问题
- 移除不必要的控制台日志输出
- 调整路由守卫中 next 回调的参数传递方式
- 导出 Router 类时增加空格以符合代码风格
- 更新时间戳组件导入方式并移除冗余初始化调用
- 为定时器管理器添加清理功能的日志提示
- 从 BaseComponent 中移除调试日志并修复定时器返回值处理
2025-12-13 21:52:52 +08:00

140 lines
3.3 KiB
JavaScript

class Router {
constructor() {
this.routes = {};
this.beforeFun = null;
this.afterFun = null;
this.routerViewId = 'app';
this.redirectRoute = '/';
this.stackPages = true;
this.routerMap = [];
this.scriptManager = window.scriptManager;
// 页面实例
this.currentinstance = null;
}
/**
* 初始化路由
*/
init(config) {
// 配置路由
this.routerMap = config?.routes || this.routerMap;
this.routerViewId = config?.routerViewId || this.routerViewId;
this.stackPages = config?.stackPages ?? this.stackPages;
this.redirectRoute = config?.redirectRoute || this.redirectRoute;
this.map();
// 监听路由变化
window.addEventListener('hashchange', () => this.urlChange());
window.addEventListener('load', () => this.urlChange());
window.lintTo = (path) => this.navigate(path);
}
map() {
if (!this.routerMap.length) {
console.error('请配置路由');
return;
}
for (const r of this.routerMap) {
if (r.name === 'redirect') this.redirectRoute = r.path;
this.routes[r.path] = r;
}
}
/**
* 导航
*/
navigate(path) {
window.location.hash = path;
}
/**
* 路由解析与渲染
*/
urlChange() {
const path = location.hash.replace('#', '') || this.redirectRoute;
const route = this.routes[path];
if (!route) {
// 当前路由不存在时,返回到设置的重定向页面
location.hash = this.redirectRoute;
return;
}
const doChange = async () => {
if (this.currentinstance && typeof this.currentinstance.destroy === 'function') {
console.log(`销毁旧组件${this.currentRoute.name}`);
this.currentinstance.destroy();
this.currentinstance = null;
}
const mount = document.getElementById(this.routerViewId);
if (!mount) {
console.error('挂载点不存在:', this.routerViewId);
return;
}
if (!this.stackPages) mount.innerHTML = '';
if (route.html) {
try {
mount.innerHTML = await fetch(route.html).then((r) => r.text());
} catch (e) {
mount.innerHTML = `<h2>页面加载失败:${e.message}</h2>`;
}
}
if (route.script) {
await this.scriptManager.loadScript({
path: route.script,
name: route.name,
isModule: route.isModule,
deps: route.deps,
});
}
const newInstance = await this.scriptManager.getComponentInstance(route.name);
console.log(newInstance);
if (newInstance) {
this.currentinstance = newInstance;
if (typeof newInstance.init === 'function') {
newInstance.init();
}
}
this.currentRoute = route;
if (this.afterFun) this.afterFun(route);
};
if (this.beforeFun) {
this.beforeFun({ to: route, next: doChange });
} else {
doChange().then(r => r);
}
}
/**
* before 钩子
*/
beforeEach(callback) {
if (typeof callback === 'function') {
this.beforeFun = callback;
} else {
console.trace('beforeEach 必须是函数');
}
}
/**
* after 钩子
*/
afterEach(callback) {
if (typeof callback === 'function') {
this.afterFun = callback;
} else {
console.trace('afterEach 必须是函数');
}
}
}
export { Router };