HarmonyOS鸿蒙Next中组件库页面和原生页面怎么互相跳转????

HarmonyOS鸿蒙Next中组件库页面和原生页面怎么互相跳转???? cke_387.png

cke_16089.pngcke_17995.png

我在组件库里面下载了一键登录的组件库,我根据示例代码运行成功了,但是它这个上面的其他方式登录跳转的页面我不太想要,所以我自己写了一个登录页面,但是我没办法给这两个页面做跳转(第二个图是组件库代码运行出来的,第三张图是我自己写的),我该怎么做才能做到点击其他方式登录,然后页面跳转到我自己写的页面


更多关于HarmonyOS鸿蒙Next中组件库页面和原生页面怎么互相跳转????的实战教程也可以访问 https://www.itying.com/category-93-b0.html

9 回复

开发者你好,修改组件库跳转逻辑在组件库的“其他方式登录”按钮事件中,替换为跳转到你的自定义页面,并且在你的自定义页面添加返回逻辑。使用Navigation实现跳转逻辑。如果自定义页面在独立模块中,使用命名路由跳转:参考:如何实现跨模块的页面跳转功能。以下是利用Navigation进行路由跳转参考:

【背景知识】

  • Navigation组件是路由导航的根视图容器,一般作为Page页面的根容器使用,其内部默认包含标题栏、内容区和工具栏,其中内容区默认首页显示导航内容(Navigation的子组件)或非首页显示(NavDestination的子组件),首页和非首页通过路由进行切换。
  • 从API Version 10开始,推荐使用NavPathStack配合navDestination属性进行页面路由。

【解决方案】

  • 第一步:创建首页Index和需要跳转的两个页面Page1和Page2,初始代码如下:
// Index.ets
@Entry
@Component
struct Index {
  private pathStack: NavPathStack = new NavPathStack();

  build() {
    Navigation(this.pathStack) {
      Column({space: 10}) {
        Text('首页')
          .fontSize(60)
        Button('跳转page_name_1')
          .width(200)
          .onClick(() => {
            this.pathStack.pushPathByName('page_name_1', null)
          })
        Button('跳转page_name_2')
          .width(200)
          .onClick(() => {
            this.pathStack.pushPathByName('page_name_2', null)
          })
      }
      .alignItems(HorizontalAlign.Center)
      .height('100%')
      .width('100%')
    }
  }
}
// Page1.ets
@Component
export struct Page1{
  build() {
    NavDestination() {
      Column(){
        Text('Page1')
          .fontSize(60)
      }
      .height('100%')
      .width('100%')
    }
  }
}
// Page2.ets
@Component
export struct Page2 {
  build() {
    NavDestination() {
      Column() {
        Text('Page2')
          .fontSize(60)
      }
      .height('100%')
      .width('100%')
    }
  }
}
  • 第二步:配置路由名称的跳转页面,对于代码this.pathStack.pushPathByName()中的第一个参数的页面名称page_name_1或者page_name_2,需要进行对应的映射配置。有两种配置方法,选择其中一种即可:
    • PageMap函数映射:通过@Builder修饰一个自定义映射函数PageMap,并将其传入Navigation组件的.navDestination()函数中,Navigation根据PageMap函数将参数名称page_name_1page_name_2路由到对应页面完成跳转。
import { Page1 } from './Page1';
import { Page2 } from './Page2';

@Entry
@Component
struct Index {
  private pathStack: NavPathStack = new NavPathStack();

  @Builder
  PageMap(name: string) {
    if (name === "page_name_1") { // 如果pushPathByName的第一个参数为"page_name_1", 路由到Page1
      Page1()
    } else if (name === "page_name_2") { // 如果pushPathByName的第一个参数为"page_name_2", 路由到Page2
      Page2()
    }
  }

  build() {
    Navigation(this.pathStack) {
      Column({ space: 10 }) {
        Text('首页')
          .fontSize(60)
        Button('跳转page_name_1')
          .width(200)
          .onClick(() => {
            this.pathStack.pushPathByName('page_name_1', null)
          })
        Button('跳转page_name_2')
          .width(200)
          .onClick(() => {
            this.pathStack.pushPathByName('page_name_2', null)
          })
      }
      .alignItems(HorizontalAlign.Center)
      .height('100%')
      .width('100%')
    }
    .navDestination(this.PageMap)
  }
}
  • route_map配置映射:通过route_map.json文件进行映射。
    • 在resources/base/profile文件夹中创建route_map.json文件,在src/main文件夹中的module.json5文件中配置route_map.json映射文件的位置。
    • 完成上述配置后,pushPathByName函数会根据route_map.json中的映射进行路由。注意进行route_map.json的配置前,需先在Page1.ets和Page2.ets中配置组件导出的函数,代码如下:
// Page1.ets
@Builder
export function Page1Builder() {
  Page1()
}

@Component
export struct Page1{
  build() {
    NavDestination() {
      Column(){
        Text('Page1')
          .fontSize(60)
      }
      .height('100%')
      .width('100%')
    }
  }
}
// Page2.ets
@Builder
export function Page2Builder() {
  Page2()
}

@Component
export struct Page2{
  build() {
    NavDestination() {
      Column(){
        Text('Page2')
          .fontSize(60)
      }
      .height('100%')
      .width('100%')
    }
  }
}
- route_map.json文件中的路由配置如下:
{
  "routerMap": [
    {
      "name": "page_name_1",
      "pageSourceFile": "src/main/ets/pages/Page1.ets",
      "buildFunction": "Page1Builder",
      "data": {
        "description": "Page1"
      }
    },
    {
      "name": "page_name_2",
      "pageSourceFile": "src/main/ets/pages/Page2.ets",
      "buildFunction": "Page2Builder",
      "data": {
        "description": "Page2"
      }
    }
  ]
}
- 关键参数含义解释:
  - `name`:`this.pathStack.pushPathByName`的第一个参数;
  - `pageSourceFile`:待跳转页的相对路径;
  - `buildFunction`:在Page1.ets或page2.ets中导出整个组件的函数名称;

更多关于HarmonyOS鸿蒙Next中组件库页面和原生页面怎么互相跳转????的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


我会用,现在不是关于Navigation的事,我发了个解释,你可以看一下,

跳转其他方式登录的逻辑代码在components/AggregatedLogin.ets文件中,126行Button($r(‘app.string.login_in_other’))组件就是跳转其他登录方式的按钮,然后139行的this.vm.phoneLogin方法是跳转逻辑,你把跳转路径改成你自己写的页面就可以了。

找到了,感谢大佬,

cke_256.png

cke_923.png

cke_1182.png

第一张图是示例代码里面的build代码,第二个页面是这个示例代码本身运行起来展示的主页面,点击"其他方式登录"跳转到第三个页面,然后第三个页面点击华为那个图标返回第二个页面,第一个图的代码里面没有关于"其他方式登录"的字眼,我根本不知道咋改

第二第图中的 其它方式登录 的按钮,是否有点击事件回调通知,如果有,接收该事按,按照你的App中的页面跳转逻辑实现跳转。

通常,这段代码可以作为参数传入组件,或者有设置的入口,你可以找找接口或文档。

我发了个解释,你再看一下,你说的事件回调通知我找不到,

在HarmonyOS Next中,使用router模块实现组件库页面与原生页面间的跳转。组件库页面通过router.pushUrl跳转至原生页面,目标路径需配置在module.json5中。原生页面返回组件库页面使用router.back。需确保双方页面已在配置文件中声明路由信息。

在HarmonyOS Next中,组件库页面与原生页面之间的跳转可以通过路由机制实现。以下是具体步骤:

  1. 配置路由:在项目的resources/base/profile/目录下的router.json文件中,注册你的原生页面路由。例如:

    {
      "path": "mylogin",
      "name": "MyLoginPage"
    }
    
  2. 触发跳转:在组件库的“其他方式登录”按钮事件中,调用路由跳转方法。使用router.pushUrlrouter.replaceUrl

    import router from '[@ohos](/user/ohos).router';
    
    // 在按钮点击事件中跳转
    router.pushUrl({ url: 'pages/MyLoginPage' });
    
  3. 参数传递(可选):如果需要传递数据到原生页面,可通过params字段:

    router.pushUrl({
      url: 'pages/MyLoginPage',
      params: { source: 'componentLogin' }
    });
    
  4. 返回处理:在原生页面中,可通过router.back返回到组件库页面。

确保组件库按钮事件可被覆盖或扩展。若组件库未暴露事件接口,需检查其文档或考虑自定义组件封装。跳转前验证目标页面路径是否正确注册。

回到顶部