1.前提:动态import
优点:按需加载,减少资源占用,降低内存,延迟加载,模块解耦;
2.模块间跳转的实现是需要执行两次动态加载:(feature间模块)
a.第一次动态import(HarA),会执行加载HarA中的index.ets,
b.接着再执行此文件中的某个方法,这个方法将动态加载此HarA中的某个页面元素(page1.ets)
即先动态加载到某个模块,再加载此模块中的页面
c.为了管理页面,引入了页面的栈管理,即实现入栈,弹栈,清空栈;即新建一个NavPathStack,当打开一个页面后push入栈,返回时弹栈;
//主程序中执行跳转页面
aboutToAppear() {
if (!this.hapARouter) {
this.hapARouter = new NavPathStack();
};
let routerName = "HapA_Router";
RouterModule.createRouter(routerName, this.hapARouter);
};
let url = "HarA/src/main/ets/components/mainpage/page2/HapA_Router-HarA_Page2_Builder";
RouterModule.push(url);
//动态路由模块
static builderMap: Map<string, WrappedBuilder<[object]>> = new Map<string, WrappedBuilder<[object]>>();
static routerMap: Map<string, NavPathStack> = new Map<string, NavPathStack>();
// 通过名称注册builder
public static registerBuilder(builderName: string, builder: WrappedBuilder<[object]>): void{
RouterModule.builderMap.set(builderName, builder);
}
// 通过名称获取builder
public static getBuilder(builderName: string): WrappedBuilder<[object]>{
let builder = RouterModule.builderMap.get(builderName);
return builder as WrappedBuilder<[object]>;
}
// 通过名称注册router
public static createRouter(routerName: string, router: NavPathStack): void{
RouterModule.routerMap.set(routerName, router);
}
// 通过名称获取router
public static getRouter(routerName: string): NavPathStack{
let router = RouterModule.routerMap.get(routerName);
return router as NavPathStack;
}
// 通过获取页面栈跳转到指定页面
public static async push(url: string): Promise<void>{
// 分解url
// 获取包名、路由名、页面名
let params = url.split("/");
const harName = params[0];
let context = params[params.length - 1].split("-");
const routerName = context[0];
const builderName = context[1];
// 获取路径
let path = ".";
for (let i = 1; i < params.length - 1; i++) {
path += "/" + params[i];
}
// 动态引入要跳转的页面,HarA
let ns: ESObject = await import(harName);
//执行此HarA模块中的index.ets程序文件中的harInit()方法,即执行页面跳转
ns.harInit(path);
//路由器需要维护一个NavPathStack,即一个栈,通过这个栈把WrapBuilder对象存进去,这样即可在返回时执行弹栈,清空等操作
RouterModule.getRouter(routerName).pushPathByName(builderName, null);
}
//跳转的模块(HarA)中的index.ets
export function harInit(path: string): void{
// 动态引入要跳转的页面
switch (path) {
case "./src/main/ets/components/mainpage/page1":
import("./src/main/ets/components/mainpage/page1");
break;
case "./src/main/ets/components/mainpage/page2":
import("./src/main/ets/components/mainpage/page2");
break;
case "./src/main/ets/components/mainpage/page3":
import("./src/main/ets/components/mainpage/page3");
break;
default:
break;
}
}
//Page1.ets
//harBuilder是此页面元素对象
let builderName = 'HarA_Page1_Builder';
if (!RouterModule.getBuilder(builderName)) {
let builder: WrappedBuilder<[object]> = wrapBuilder(harBuilder);
RouterModule.registerBuilder(builderName, builder);
}
442

被折叠的 条评论
为什么被折叠?



