一步一步教你进行鸿蒙应用开发:四、在应用内基于Router实现页面基本跳转

前言

基于Router模块的页面路由主要有两种方式:

  • router.pushUrl()‌:目标页压入页面栈,保留当前页状态,可通过返回键或router.back()返回当前页,适用于通用跳转场景‌。
  • router.replaceUrl()‌:目标页替换当前页并销毁当前页资源,适用于登录后跳转首页等需清除历史页的场景‌。

下面将展示如何通过router实现页面跳转

注:本文接上一讲内容,首先将目录结构进行一下调整,上一讲的multihap不再直接放在首页Index.ets中,首页将作为后续所讲各个基础开发知识点的入口。接着在首页中增加各个功能按钮,通过这些按钮跳转到multihap功能页面路由跳转功能以及后续其他的各个基础功能开发功能中。

一、调整multihap目录结构

1、在pages目录下新建multihap目录

2、在multihap目录上新建页面文件MultiHap.ets

3、将Index.ets中的代码拷贝到MultiHap.ets中

import { common } from '@kit.AbilityKit';
import Logger from '../../util/Logger'
import { BusinessError } from '@kit.BasicServicesKit';

const TAG: string = 'MultiHap';
const AUDIO: string = 'audio';
const VIDEO: string = 'video';
const BUNDLE_NAME: string = 'com.example.helloworld';
const AUDIO_ABILITY_NAME: string = "AudioAbility";
const VIDEO_ABILITY_NAME: string = "VideoAbility";

@Entry
@Component
struct Multihap {
  private context?: common.UIAbilityContext

  build() {
    Row() {
      Column() {
        Button(AUDIO)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            if (this.context) {
              this.context.startAbility({
                bundleName: BUNDLE_NAME,
                abilityName: AUDIO_ABILITY_NAME
              }).then(() => {
                Logger.info(TAG, 'start audio ability success')
              }).catch((error: BusinessError) => {
                Logger.error(TAG, 'start audio ability failed, error: ' + JSON.stringify(error))
              })
            }
          })
          .id('btnAudio')
          .margin({ bottom: 20 })
        Button(VIDEO)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            if (this.context) {
              this.context.startAbility({
                bundleName: BUNDLE_NAME,
                abilityName: VIDEO_ABILITY_NAME
              }).then(() => {
                Logger.info(TAG, 'start video ability success')
              }).catch((error: BusinessError) => {
                Logger.error(TAG, 'start video ability failed, error: ' + JSON.stringify(error))
              })
            }
          })
          .id('btnVideo')
      }
      .width('100%')
    }
    .height('100%')
  }

  aboutToAppear() {
    this.context = getContext(this) as common.UIAbilityContext
  }
}

4、修改Index.ets代码,使用如下代码覆盖原代码

import router from '@ohos.router';

const MULTIHAP: string = 'MultiHap';


@Entry
@Component
struct Index {


  build() {
    Row() {
      Column() {
        Button(MULTIHAP)
          .onClick(() => {
            router.pushUrl({
              url: 'pages/multihap/MultiHap'
            });
          })
      }
    }
  }

}

5、编译并运行,在模拟器上展示结果如下

点击MultiHap按钮跳转到MultiHap页面

二、页面路由跳转功能实现

1、参考上面的方法在pages目录下创建pagerouter目录

2、在pagerouter目录下创建4个页面文件:

其中:PageRouting.ets 页面跳转功能主入口

           PushUrlPage.ets 使用PushUrl跳转到的页面文件

           PushUrlSinglePage.ets 使用PushUrl并设置了单例模式跳转到的页面文件

           ReplaceUrlPage.ets 使用使用ReplaceUrl跳转到的页面文件

3、分别在页面文件中拷贝如下代码

PageRouting.ets:

import router from '@ohos.router';
import { BusinessError } from '@kit.BasicServicesKit';
import RouterParam from '../../common/RouterParam';
import Logger from '../../util/Logger'

const PUSHURLPAGE: string = 'PushUrlPage';
const REPLACEURLPAGE: string = 'ReplaceUrlPage';
const PUSHURLSINGLEPAGE: string = 'PushUrlSinglePage';

const TAG: string = 'PageRouting';

@Entry
@Component
struct PageRouting {
  @State message: string = 'Hello World';

  onPageShow() {
    Logger.info(TAG, "onPageShow");
  }

  build() {
    //RelativeContainer() {
    Row() {
      Column() {
        Button(PUSHURLPAGE)
          .onClick(() => {
            try {
              router.pushUrl({                                // 压入页面栈,可通过router.back()返回原页
                url: 'pages/pagerouter/PushUrlPage',
                params: new RouterParam('Open new page by pushUrl')  // 传递到新页面的参数,如果不需要传递参数,这个字段可以不需要
              });
            } catch (err) {
              let message = (err as BusinessError).message;
              let code = (err as BusinessError).code;
              console.error(`pushUrl failed, code is ${code}, message is ${message}`);
            }

          })

        Button(REPLACEURLPAGE)
          .onClick(() => {
            router.replaceUrl({                             // 销毁当前页,无法返回原页
              url: 'pages/pagerouter/ReplaceUrlPage',
              params: new RouterParam('Open new page by replaceUrl')
            });
          })

        Button(PUSHURLSINGLEPAGE)
          .onClick(() => {
            router.pushUrl({                                // 复用已有页面实例,减少内存消耗
              url: 'pages/pagerouter/PushUrlSinglePage',
              params: new RouterParam('Open new page by pushUrl, the mode is [single]\'')
            },
            router.RouterMode.Single,
            (err: Error) => {
              if (err) {
                let message = (err as BusinessError).message;
                let code = (err as BusinessError).code;
                console.error(`pushUrl failed, code is ${code}, message is ${message}`);
                return;
              }
              console.info('pushUrl success');
            });
          })
      }
    }
  }
}

PushUrlPage.ets:

import { router } from '@kit.ArkUI';
import RouterParam from '../../common/RouterParam';

@Entry
@Component
struct PushPageUrl {

  @State params: RouterParam = router.getParams() as RouterParam
  @State message: string = this.params.info;

  build() {
    RelativeContainer() {
      Text(this.message)
        .id('PushPageUrlHelloWorld')
        .fontSize($r('app.float.page_text_font_size'))
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
        .onClick(() => {
          this.message = 'Welcome';
        })
    }
    .height('100%')
    .width('100%')
  }
}

PushUrlSinglePage.ets

import { router } from '@kit.ArkUI';
import RouterParam from '../../common/RouterParam';

@Entry
@Component
struct PushUrlSinglePage {
  @State params: RouterParam = router.getParams() as RouterParam
  @State message: string = this.params.info;

  build() {
    RelativeContainer() {
      Text(this.message)
        .id('PushUrlSinglePageHelloWorld')
        .fontSize($r('app.float.page_text_font_size'))
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
        .onClick(() => {
          this.message = 'Welcome';
        })
    }
    .height('100%')
    .width('100%')
  }
}

ReplaceUrlPage.ets:

import { router } from '@kit.ArkUI';
import RouterParam from '../../common/RouterParam';

@Entry
@Component
struct ReplaceUrlPage {
  @State params: RouterParam = router.getParams() as RouterParam
  @State message: string = this.params.info;

  build() {
    RelativeContainer() {
      Text(this.message)
        .id('ReplaceUrlPageHelloWorld')
        .fontSize($r('app.float.page_text_font_size'))
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
        .onClick(() => {
          this.message = 'Welcome';
        })
    }
    .height('100%')
    .width('100%')
  }
}

4、在Index.ets中增加入口按钮代码

        Button(PAGEROUTING)
          .onClick(() => {
            router.pushUrl({
              url: 'pages/pagerouter/PageRouting'
            });
          })

5、编译并运行,在模拟器上展示结果如下

点击PageRouting按钮跳转到PageRouting主页面

点击相应的按钮将展示相应的页面,然后点模拟器上的返回键将返回上一页,其中将看到ReplaceUrlPage直接跳转到了Index首页,这是因为使用ReplaceUrl方法是将PageRouting主页面置换成了ReplaceUrlPage页面,PageRouting在页面栈中已经没有了,所以会直接返回Index首页。

完整的源码工程见附件:一步一步教你进行鸿蒙应用开发代码工程.zip

至此就完成了几种基本的页面路由功能,关键代码增加了相应的注释便于理解,如果还有疑问请在评论区留言,下一章节将展示页面布局相关的开发,请大家关注后续更新。

<think>好的,我需要回答用户关于鸿蒙开发中路由实现方案的问题。首先,我要仔细阅读用户提供的引用内容,特别是引用[3]和[4],这两个引用提到了路由模块的依赖配置,比如在oh-package.json5中添加@ohos/dynamicsrouter或@hadss/hmrouter的依赖。用户可能想知道如何在鸿蒙项目中配置和使用路由。 接下来,用户的问题是关于路由的实现方法,所以我要结合引用中的信息,整理出具体的步骤。可能需要包括路由模块的配置、静态路由和动态路由的使用方法,以及路由参数传递和拦截器机制。此外,引用[2]提到ArkTS、ArkUI开发组件和Stage模型,这些可能在路由实现中起到作用,需要适当提及。 需要注意的是,系统级指令要求使用中文回答,并且正确使用LaTeX格式的数学表达式,但在这个问题中可能涉及代码和配置示例,所以重点在于代码块的正确展示。同时,生成的相关问题需要与路由开发相关,比如性能优化、多端部署中的路由适配等。 然后,我需要检查引用标识是否正确添加,比如在提到依赖配置时引用[3]和[4],在核心知识部分引用[2]。回答结构要清晰,分步骤说明实现方案,确保用户能够逐步理解和应用。 最后,确保相关问题的生成符合用户可能感兴趣的后续学习方向,例如路由优化、与分布式应用开发的结合等。同时,代码示例要准确,符合鸿蒙开发的规范,比如使用ArkTS语言和Stage模型的结构。</think>在鸿蒙(HarmonyOS开发中,路由实现方案主要基于 **动态路由模块** 和 **ArkUI框架**,以下是具体实现方法: --- ### 一、路由模块配置 1. **依赖声明** 在模块的`oh-package.json5`中添加路由模块依赖: ```json { "dependencies": { "@ohos/dynamicsrouter": "file:../../common/routermodule", // 动态路由模块[^3] "@hadss/hmrouter": "^1.0.0-rc.6" // 第三方路由库[^4] } } ``` 2. **编译插件配置** 在`build-profile.json5`中启用路由插件支持: ```json { "plugins": [ { "name": "@hadss/hmrouter-plugin" } ] } ``` --- ### 二、路由实现方案 #### 1. **静态路由声明** 在`ets`文件中定义路由表: ```typescript // routes.ets export const routes = [ { path: '/home', component: HomePage // 静态导入页面组件 }, { path: '/detail/:id', // 动态参数路由 component: () => import('pages/DetailPage') // 懒加载组件 } ]; ``` #### 2. **动态路由跳转** 使用`Router`模块进行导航: ```typescript import { Router } from '@ohos/dynamicsrouter'; // 基础跳转 Router.pushUrl({ url: 'pages/HomePage' }); // 带参数跳转 Router.pushUrl({ url: 'pages/DetailPage', params: { id: 123 } }); ``` #### 3. **路由拦截器** 通过路由守卫实现权限控制: ```typescript Router.addInterceptor((to, from, next) => { if (to.url === '/profile' && !isLogin) { next('/login'); // 未登录跳转登录页 } else { next(); } }); ``` --- ### 三、核心机制解析 - **Stage模型支持**:路由模块深度集成Stage模型,通过`UIAbility`实现页面通信[^2]。 - **跨端适配**:通过`@ohos/dynamicsrouter`支持多端部署时路由策略自动适配[^2]。 - **性能优化**:懒加载(`import()`语法)减少首屏资源加载量。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jackiendsc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值