鸿蒙 HarmonyOS 实战 -ArkUI 组件(页面路由)
- 2024-04-26  湖南
- 本文字数:4502 字 - 阅读完需:约 15 分钟 

🚀一、路由导航
路由导航是指在应用程序中通过路径导航定位到特定页面的过程。路由导航的实现通常采用路由器(router)来进行管理,路由器根据路径的不同值将用户请求导向到不同的页面。
在 HarmonyOS 中路由导航主要有:页面跳转、页面返回和页面返回前增加一个询问框
🔎1.编程路由
🦋1.1 页面跳转
页面跳转相关作用:
 
 Router 模块提供了两种跳转模式: router.pushUrl() 和 router.replaceUrl()。router.pushUrl() 可以通过返回键或者调用 router.back()方法返回到当前页:
 
 Router 模块提供了两种实例模式: Standard 和 Single:
 
 ☀️1.1.1 保留主页在页面栈中,以便返回时恢复状态
主页(Home)和 详情页(Detail)
1、主页
import router from '@ohos.router';// 在Home页面中function onJumpClick(): void {  router.pushUrl({    url: 'pages/ImagePage' // 目标url  }, router.RouterMode.Standard, (err) => {    if (err) {      console.error(`Invoke pushUrl failed, code is ${err.code}, message is ${err.message}`);      return;    }    console.info('Invoke pushUrl succeeded.');  });}@Entry@Componentstruct Index {  build() {    Row() {      Button('跳转到图片页面')        .onClick(e=>{          onJumpClick()        })    }.alignItems(VerticalAlign.Center).justifyContent(FlexAlign.Center).backgroundColor(0xffd306).height('100%').width('100%')  }}
 
 2、详情页
import router from '@ohos.router';@Entry //FA模式必须有这个@Componentstruct Index {  @State imageWidth: number = 150
  build() {    Column() {      Row(){        Image($r('app.media.icon'))          .width(this.imageWidth)      }      .width('100%')      .height(400)      .justifyContent(FlexAlign.Center)
      Row(){        Text($r('app.string.width_label'))          .fontSize(20)          .fontWeight(FontWeight.Bold)
        TextInput({text: this.imageWidth.toFixed(0)})          .width(150)          .backgroundColor('#FFF')          .type(InputType.Number)          .onChange( value => {            this.imageWidth = parseInt(value)          })      }      .width('100%')      .padding({left: 14, right: 14})      .justifyContent(FlexAlign.SpaceBetween)
      Divider()        .width('91%')
      Row(){        Button('缩小')          .width(80)          .fontSize(20)          .onClick(() => {            if(this.imageWidth >= 10){              this.imageWidth -= 10            }          })
        Button('放大')          .width(80)          .fontSize(20)          .onClick(() => {            if(this.imageWidth < 300){              this.imageWidth += 10            }          })
      }      .width('100%')      .margin({ top: 35, bottom: 35 })      .justifyContent(FlexAlign.SpaceEvenly)      Button('回到首页')        .width(160)        .fontSize(20)        .onClick(() => {          router.back()        })
      Slider({        min: 100,        max: 300,        value: this.imageWidth,        step: 10,      })        .width('100%')        .blockColor('#36D')        .trackThickness(5)        .showTips(true)        .onChange(value => {          this.imageWidth = value        })    }    .width('100%')    .height('100%')  }}
 
 ☀️1.1.2 不保留主页在页面栈中,在返回时直接退出应用
登录页(Login)和 个人中心页(Profile)的切换适用案例
更多鸿蒙最新技术知识点,请关注作者博客:https://t.doruo.cn/14DjR1rEY
1、登录页
function onJumpClick(): void {  router.replaceUrl({    url: 'pages/ImagePage' // 目标url  }, router.RouterMode.Standard, (err) => {    if (err) {      console.error(`Invoke replaceUrl failed, code is ${err.code}, message is ${err.message}`);      return;    }    console.info('Invoke replaceUrl succeeded.');  })}
☀️1.1.3 保留主页在页面栈中,以便返回时恢复状态
设置页(Setting)和一个主题切换页
1、设置页
// 在Setting页面中function onJumpClick(): void {  router.pushUrl({    url: 'pages/Theme' // 目标url  }, router.RouterMode.Single, (err) => {    if (err) {      console.error(`Invoke pushUrl failed, code is ${err.code}, message is ${err.message}`);      return;    }    console.info('Invoke pushUrl succeeded.');  });}
☀️1.1.4 保留主页在页面栈中,以便返回时恢复状态
搜索结果列表页(SearchResult)和一个搜索结果详情页(SearchDetail)
1、搜索结果列表页
// 在SearchResult页面中function onJumpClick(): void {  router.replaceUrl({    url: 'pages/SearchDetail' // 目标url  }, router.RouterMode.Single, (err) => {    if (err) {      console.error(`Invoke replaceUrl failed, code is ${err.code}, message is ${err.message}`);      return;    }    console.info('Invoke replaceUrl succeeded.');})}
🦋1.2 页面参数
☀️1.2.1 主页页面参数传递和获取
1、参数传递
class DataModelInfo {  age: number;}
class DataModel {  id: number;  info: DataModelInfo;}
function onJumpClick(): void {  // 在Home页面中  let paramsInfo: DataModel = {    id: 123,    info: {      age: 20    }  };
  router.pushUrl({    url: 'pages/Detail', // 目标url    params: paramsInfo // 添加params属性,传递自定义参数  }, (err) => {    if (err) {      console.error(`Invoke pushUrl failed, code is ${err.code}, message is ${err.message}`);      return;    }    console.info('Invoke pushUrl succeeded.');  })}
2、参数获取
const params = router.getParams(); // 获取传递过来的参数对象const id = params['id']; // 获取id属性的值const age = params['info'].age; // 获取age属性的值
☀️1.2.1 返回页页面参数传递和获取
 
 1、参数传递
router.back({  url: 'pages/Home',  params: {    info: '来自Home页'  }});
2、参数获取
onPageShow() {  const params = router.getParams(); // 获取传递过来的参数对象  const info = params['info']; // 获取info属性的值}
🦋1.3 页面返回前增加一个询问框
 
 ☀️1.3.1 默认询问框
import router from '@ohos.router';
function onJumpClick(): void {  router.pushUrl({    url: 'pages/ImagePage' // 目标url  }, router.RouterMode.Standard, (err) => {    if (err) {      console.error(`Invoke replaceUrl failed, code is ${err.code}, message is ${err.message}`);      return;    }    console.info('Invoke replaceUrl succeeded.');  })}@Entry@Componentstruct Index {  build() {    Row() {      Button('跳转到图片页面')        .onClick(e=>{          onJumpClick()        })    }.alignItems(VerticalAlign.Center).justifyContent(FlexAlign.Center).backgroundColor(0xffd306).height('100%').width('100%')  }}
 
 ☀️1.3.2 自定义询问框
import router from '@ohos.router';import promptAction from '@ohos.promptAction';
function onBackClick() {  // 弹出自定义的询问框  promptAction.showDialog({    message: '您还没有完成支付,确定要返回吗?',    buttons: [      {        text: '取消',        color: '#FF0000'      },      {        text: '确认',        color: '#0099FF'      }    ]  }).then((result) => {    if (result.index === 0) {      // 用户点击了“取消”按钮      console.info('User canceled the operation.');    } else if (result.index === 1) {      // 用户点击了“确认”按钮      console.info('User confirmed the operation.');      // 调用router.back()方法,返回上一个页面      router.back();    }  }).catch((err) => {    console.error(`Invoke showDialog failed, code is ${err.code}, message is ${err.message}`);  })}
@Entry@Componentstruct Index {  @State imageWidth: number = 150
  build() {    Column() {      Row(){        Image($r('app.media.icon'))          .width(this.imageWidth)      }      .width('100%')      .height(400)      .justifyContent(FlexAlign.Center)
      Row(){        Text($r('app.string.width_label'))          .fontSize(20)          .fontWeight(FontWeight.Bold)
        TextInput({text: this.imageWidth.toFixed(0)})          .width(150)          .backgroundColor('#FFF')          .type(InputType.Number)          .onChange( value => {            this.imageWidth = parseInt(value)          })      }      .width('100%')      .padding({left: 14, right: 14})      .justifyContent(FlexAlign.SpaceBetween)
      Divider()        .width('91%')
      Row(){        Button('缩小')          .width(80)          .fontSize(20)          .onClick(() => {            if(this.imageWidth >= 10){              this.imageWidth -= 10            }          })
        Button('放大')          .width(80)          .fontSize(20)          .onClick(() => {            if(this.imageWidth < 300){              this.imageWidth += 10            }          })
      }      .width('100%')      .margin({ top: 35, bottom: 35 })      .justifyContent(FlexAlign.SpaceEvenly)      Button('回到首页')        .width(160)        .fontSize(20)        .onClick(() => {          onBackClick()        })
      Slider({        min: 100,        max: 300,        value: this.imageWidth,        step: 10,      })        .width('100%')        .blockColor('#36D')        .trackThickness(5)        .showTips(true)        .onChange(value => {          this.imageWidth = value        })    }    .width('100%')    .height('100%')  }}
 
 🚀写在最后
- 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙: 
- 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。 
- 关注小编,同时可以期待后续文章 ing🚀,不定期分享原创知识。 
- 更多鸿蒙最新技术知识点,请关注作者博客:https://t.doruo.cn/14DjR1rEY 
 
 
蜀道山
欢迎关注作者公众号:【 蜀道衫】 2023-12-29 加入
3年Java后端,5年Android应用开发,精通Java高并发、JVM调优、以及Android开发各种技能。现专研学习鸿蒙HarmonyOS Next操作系统







 
    
评论