Harmony:自定义路由原理

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);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值