在业务体系庞大或复杂的情况下,通常会将业务拆分成多个子业务模块,单个子业务模块为一个har/hsp。在该场景下,通常存在从主业务入口跳转到不同子页面模块,或从一个子业务模块A页面跳转到另一个子业务模块B页面的需求。如,从应用首页跳转到登录子业务模块页面。 针对该场景,有以下三种解决方案:

  • 方案一:使用router的命名路由接口router.pushNamedRoute()跳转。

    参考地址: [页面路由 (@ohos.router)]

  • 方案二:使用navigation组件跳转。

    以从应用入口模块的页面NavigationPage跳转到Login子业务模块页面LoginPage为例。主要包含以下步骤:

  1. 在Login模块中开发自定义组件LoginPage(路由跳转目的地),并对外导出。
@Component 
export struct LoginPage { 
  @Consume('pathStack') pathStack: NavPathStack; 
  @State message: string = 'Login Page'; 
 
  build() { 
    NavDestination() { 
      Column() { 
        Text(this.message) 
          .fontSize(50) 
          .fontWeight(FontWeight.Bold) 
      } 
      .width('100%') 
      .height('100%') 
    } 
    .onBackPressed(() => { 
      this.pathStack.pop(); 
      return true; 
    }) 
  } 
}
  1. 在Login模块的入口文件Index.ets中导出自定义组件。

export { LoginPage } from ‘./src/main/ets/pages/loginPage’;

  1. 在入口模块的oh-package.json5文件中添加对Login模块的依赖。
{ 
  // ... 
  "dependencies": { 
    "@ohos/login": "file:../login" 
  } 
}
  1. 入口模块LoginPage页面导入Login模块的自定义组件,并添加到Navigation组件的路由表中。
// 导入Login模块自定义组件 
import { LoginPage } from '@ohos/login'; 
 
@Entry 
@Component 
struct NavigationPage { 
  @Provide('pathStack') pathStack: NavPathStack = new NavPathStack(); 
 
  @Builder 
  pageMap(name: string) { 
    if (name === 'loginPage') { 
      LoginPage() 
    } 
  } 
 
  build() { 
    Navigation(this.pathStack) { 
      Button('jump to login page') 
        .onClick(() => { 
          // NavPathInfo第二个参数为自定义参数,可用于信息传递 
          let pathInfo: NavPathInfo = new NavPathInfo('loginPage', new Object()); 
          this.pathStack.pushDestination(pathInfo, true); 
        }) 
    } 
    .navDestination(this.pageMap) 
  } 
}
  • 方案三:使用基于navigation组件的自定义路由框架跳转。

    方案二虽然可以实现跨模块跳转的功能,但当模块间跳转需求增多,各个模块间将存在非常复杂的依赖关系,甚至会导致多个har/hsp间循环依赖。为了解决模块间的强耦合关系,并且提升页面加载性能,推荐[跨包动态路由]。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐