鸿蒙Harmony(九)页面路由

news/2024/7/21 10:59:25 标签: harmonyos, java, 华为

介绍

页面路由是指在应用程序中实现不同页面之间的跳转和数据传递。

  • 页面栈的最大容量上限为32个页面,使用router.clear()方法可以清空页面栈,释放内存
  • Router有两种页面跳转模式,分别是:
    -router.pushUrl():目标页不会替换当前页,而是压入页面栈,因此可以用router.back返回当前页
    -router.replaceUrl():目标页替换当前页,当前页会被销毁并释放资源,无法返回当前页。

同时,Router模块提供了两种实例模式,分别是Standard和Single。这两种模式决定了目标url是否会对应多个实例。

Standard:标准实例模式,也是默认情况下的实例模式。每次调用该方法都会新建一个目标页,并压入栈顶。

Single:单实例模式。即如果目标页的url在页面栈中已经存在同url页面,则离栈顶最近的同url页面会被移动到栈顶,并重新加载;如果目标页的url在页面栈中不存在同url页面,则按照标准模式跳转。

使用

在使用页面路由Router相关功能之前,需要在代码中先导入Router模块。

javascript">import router from '@ohos.router';

然后利用router实现跳转,返回等操作

javascript">  router.pushUrl({
    url: 'pages/Detail' // 目标url
    params: {id:1} // 目标url
  }, router.RouterMode.Standard, (err) => {
    if (err) {
    // 异常相应,错误码: 100001:内部错误,可能是渲染失败。100002:路由地址错误 100003:路由栈页面超过32
      console.error(`Invoke pushUrl failed, code is ${err.code}, message is ${err.message}`);
      return;
    }
    console.info('Invoke pushUrl succeeded.');
  });

返回操作

javascript">// 方式一:返回到上一个页面
router.back()
// 方式二:返回到指定页面。
router.back({
  url: 'pages/Home'
});
//方式三;返回到指定页面,并传递自定义参数信息。
router.back({
  url: 'pages/Home',
  params: {
    info: '来自Home页'
  }
});
// 在目标页中,在需要获取参数的位置调用router.getParams()方法即可,例如在onPageShow()生命周期回调中:

onPageShow() {
  const params = router.getParams(); // 获取传递过来的参数对象
  const info = params['info']; // 获取info属性的值
}

示例

页面一

javascript">import router from '@ohos.router'

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

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            router.pushUrl({
              url: 'pages/RouterDemoPage',
              params: { id: 1, msg: "这是来自第一个页面的信息" }
            }, router.RouterMode.Standard, (err) => {

            })
          })
      }
      .width('100%')
    }
    .height('100%')
  }

  onPageShow() {
    if (router.getParams() && (router.getParams() as any).msg) {
      this.message = (router.getParams() as any).msg
      console.log(this.message);
    }

  }
}

页面二
在这里插入图片描述

跳转需要确保resources目录下的profile下的main_pages.json下有文件配置

javascript">{
  "src": [
    "pages/Index",
    "pages/TaskPage",
    "pages/RouterDemoPage"
  ]
}

页面

javascript">import router from '@ohos.router'
import { CommonTitleComp } from '../components/CommonTitleComp'

@Entry
@Component
struct RouterDemoPage {
  @State message: string = 'Hello World'
  @State params: any = router.getParams()

  build() {
    Row() {
      Column() {
        CommonTitleComp()
        Text(this.params.msg)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .margin({ top: 100 })
      }
      .width('100%')
      .height('100%')
      .justifyContent(FlexAlign.Start)
    }
    .height('100%')
  }
}

组件CommonTitleComp

javascript">import router from '@ohos.router'

@Component
export struct CommonTitleComp {
  @State params: any = router.getParams()

  build() {
    Row() {
      Image($r('app.media.back')).width(30).height(30)
        .margin({ left: 30, right: 10 })
        .onClick(() => {
          router.showAlertBeforeBackPage({
            message: '确定要离开当前页面吗'
          })
          if (this.params && this.params.msg) {
            console.log('2222');
            router.back({
              url: 'pages/Index',
              params: { msg: "这是上个页面的返回信息" }
            })
          } else {
            console.log('1111');
            router.back()
          }
        })
      if (this.params && this.params.id) {
        Text(this.params.id + "标题名称")
          .fontSize(20)
      } else {
        Text("默认标题")
          .fontSize(20)
      }
      Blank()

      Image($r('app.media.apple'))
        .width(30)
        .height(30)
        .borderRadius(30)
        .margin({ right: 20 })
    }.width('100%')
    .height(60)
    .alignItems(VerticalAlign.Center)
  }
}

http://www.niftyadmin.cn/n/5303892.html

相关文章

PO模式。

对项目进行梳理和总结 1.整个项目中的文件解析 2.每个文件包和模块具体的使用规范 3.整个项目中的模块与文件之间的联系 4.各个模块及包之间的导入使用 5.整体从项目完成之后的角度出发去将军项目搭建流程以及使用规范 搭建app自动化测试环境 安卓的sdk java的sdk 安装app…

【工具使用】 炫酷Vscode使用技巧,提高你的编程效率

文章目录 1 Vscode的基础设置2 善用自动补全功能3 善用快捷键4 善用强大插件4.1 外观 美化主题4.1.1 主题4.1.2 图标 4.2 便捷工具4.3 远程仓库管理 炫酷Vscode使用技巧,提高你的编程效率! vscode的设置 1 Vscode的基础设置 {"files.defaultLangu…

普通用户用哪款电脑杀毒软件最好?

前言 各位小伙伴接触到电脑的时候,都一定有听过“电脑一定要安装杀毒软件”这句话。 毕竟在电脑诞生之初到今天,电脑木马和病毒依旧存在。 中了木马或病毒的电脑会出现什么现象?具体得看中了什么样的病毒。 但轻则资料泄漏、电脑瘫痪&…

海外数据中心代理与住宅代理:优缺点全面对比

数据中心代理和住宅代理是为了匿名而开发的,通过替换网站眼中您自己的 IP 地址。然而,它们在价格、功能、性能或最佳用例方面存在一些差异。那么,这些代理类型到底有什么相似点和不同点呢? 一、什么是数据中心代理? 1…

day8--java高级编程:数据结构与集合源码

数据结构与集合源码 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 本章专题与脉络 1. 数据结构剖析 我们举一个形象的例子来理解数据结构的作用: 战场:程序运行所需的软…

性能测试之(六):JMeter 元件

元件(多个类似功能组件的容器) 组件:封装的方法,比如取样器中的发送请求的方法 一、常见的元件 1、取样器:发送请求2、逻辑处理:控制语句执行顺序3、前置处理器:在请求(取样器&…

Oracle/Myql批量操作

前言&#xff1a;在oracle中使用insert into values (),(),()多种方式都不能成功,记录正确的批量方法 注意&#xff1a;oracle有自己实现批量的方法&#xff0c;mysql适用的&#xff0c;oracle不一定适用 <insert id"insertTaskImportOpen" parameterType"l…

普通函数与函数模板的区别以及调用规则 学习笔记

前提知识&#xff1a; 引用是不能出现在隐式类型转换之中 引用时会把隐式类型转换后的值放到一个常量区中&#xff0c;即我们引用的时候&#xff0c;引用的是一个常量区的值。如果想使用引用&#xff0c;那么必须加const修饰&#xff0c;变成只读&#xff0c;方可使用隐式类型…