HarmonyOS-页面跳转Router实例演示

本文将以APP的登录和修改昵称为例演示官网的几种页面跳转、返回以及这些流程携带参数,实例的形式记录学习HarmonyOS的页面跳转。

页面路由指在应用程序中实现不同页面之间的跳转和数据传递。HarmonyOS提供了Router模块,通过不同的url地址,可以方便地进行页面路由,轻松地访问不同的页面。本文将从页面跳转页面返回页面返回前增加一个询问框几个方面介绍Router模块提供的功能。”这是官网对Router的介绍。

该案例非常简单我准备了LoginPages.ets、MainPages.ets、DetailPages.ets,分别是APP的登录页面、主页面和昵称修改页面。

                     登录页-LoginPage

                       首页-MainPage

              详情页修改昵称-DetailPage

LoginPages.ets有一个登录按钮、和账号文本。

@State name: string = '张一三'
@State userId: string = '123456'

build() {
  Row() {
    Column() {
      Text(this.name)
        .fontSize(20)
        .fontWeight(FontWeight.Bold)

      Button("登录")
        .fontSize(26)
        .margin({
          top:30
        })
        .padding({
          left:30,
          top:10,
          right:30,
          bottom:10,
        })
        .onClick(event =>{
//这里是放置具体的场景一、二、三、四、五的代码
})

场景一:初学HarmonyOS不管三七二十一我就想看一眼鸿蒙的页面跳转

router.pushUrl({
  url: 'pages/MainPage' // 目标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.');
});

有个小问题,如果我多次点击登录按钮会出现多个首页,这也不是我们想要的,于是场景二来了。

场景:希望如果用户故意或者不小心点了多次登录按钮,保证每次只有一个页存在于页面栈中,在返回时直接回到之前的登录页。这种场景下,可以使用pushUrl()方法,并且使用Single实例模式。  防止重复点击。

router.pushUrl({
  url: 'pages/MainPage' // 目标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.');
});

不对啊,我从登录页点登录按钮成功后进入了进入App首页,怎么按返回键还能回到登录页,这肯定不对,需要优化。于是就有了下面的场景三。

场景:希望从登录页成功登录后,跳转到页。同时,销毁登录页,在返回时直接退出应用而不是回到登录页面。这种场景下,可以使用replaceUrl()方法,并且使用Standard实例模式。

router.replaceUrl({
  url: 'pages/MainPage' // 目标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.');
})

场景四:主页面有一个“修改昵称”点击会跳转到DetailPages页面,如果DetailPages已经被查看过,则不需要再新建一个详情页,而是直接跳转到已经存在的详情页。这种场景下,可以使用replaceUrl()方法,并且使用Single实例模式。    place的防止重复点击,复用页面

router.replaceUrl({
  url: 'pages/MainPage' // 目标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.');})

上面场景都有一个特点是页面跳转时没有携带参数,但实际开发时在登录页与服务端交互后,服务端返回的一些参数和凭证是需要送给主页面的。

如果需要在跳转时传递一些数据给目标页,则可以在调用Router模块的方法时,添加一个params属性,并指定一个对象作为参数。例如:

let paramsInfo: DataModel = {
  name: this.name,
  userId: this.userId
};

router.pushUrl({
  url: 'pages/MainPage', // 目标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.');
})

这是定义传递的对象:

class DataModel {
  name: string;
  userId: string;
}

在目标页中,可以通过调用Router模块的getParams()方法来获取传递过来的参数。本案例在MainPages页面的aboutToAppear生命周期

aboutToAppear(){
  const params = router.getParams(); // 获取传递过来的参数对象
  this.name = params['name']; // 获取id属性的值
  const password = params['password'].age; // 获取age属性的值
  console.log("   name= "+this.name+"      password= "+password)
}

登陆后app首页就会显示登录页输入的账号。

  1. 页面返回

首页有一个修改昵称的按钮,点击会会到DetailPage页面,当用户完成操作后,需要将修改后的昵称返回到上一个页面或者指定页面,这就需要用到页面返回功能。在返回的过程中,可能需要将数据传递给目标页,这就需要用到数据传递功能。

可以使用以下几种方式进行页面返回:

Button("返回")
  .fontSize(26)
  .margin({
    top:30
  })
  .padding({
    left:30,
    top:10,
    right:30,
    bottom:10,
  }) .onClick(event =>{
  //回到上一个页面
  // router.back();
  //回到指定页面
  router.back({
    url: 'pages/MainPage’
  });
})

但是有一点必须注意方式一的“上一个页面或者方式二“我们指定的页面”,此处统称为返回的目标页面哈,返回的目标页面必须存在于页面栈中才能够返回否则该方法将无效。

方式三:返回到指定页面,并传递自定义参数信息此处我将修改后的昵称老梁学HarmonyOS

传回去了

Button("确认修改")
  .fontSize(26)
  .margin({
    top:30
  })
  .padding({
    left:30,
    top:10,
    right:30,
    bottom:10,
  }) .onClick(event =>{
  router.back({
    url: 'pages/MainPage',
    params: {
      name: this.message
    }
  });
})

这种方式不仅可以返回到指定页面,还可以在返回的同时传递自定义参数信息。这些参数信息可以在目标页中通过调用router.getParams()方法进行获取和解析。我们在MainPageonPageShow()生命周期回调中:

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

          首页-MainPage修改昵称以后

补充说明

1、鸿蒙提供了router.pushUrl()router.replaceUrl()这两种跳转模式很明显两者区别是目标页是否会替换当前页即A面启动了B页面之后A页面是在B页面下面继续存活还是被直接销毁

router.pushUrl():目标页不会替换当前页,而是压入页面栈。这样可以保留当前页的状态,并且可 以通过返回键或者调用router.back()方法返回到当前页。

router.replaceUrl():目标页会替换当前页,并销毁当前页。这样可以释放当前页的资源,并且无法返回到当前页。

2、页面栈的最大容量为32个页面。如果超过这个限制,可以调用router.clear()方法清空历史页面栈,释放内存空间。

3、标准实例模式下,router.RouterMode.Standard参数可以省略。

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

import router from '@ohos.router'; 快捷键alt+enter是可以直接导包的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/452773.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

47、C++/引用,函数重载,类相关学习20240312

一、自己封装一个矩形类(Rect),拥有私有属性:宽度(width)、高度(height), 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void show()。 代码&…

在 Rust 中使用 Serde 处理json

在 Rust 中使用 Serde 处理json 在本文中,我们将讨论 Serde、如何在 Rust 应用程序中使用它以及一些更高级的提示和技巧。 什么是serde? Rust中的serde crate用于高效地序列化和反序列化多种格式的数据。它通过提供两个可以使用的traits来实现这一点&a…

数字孪生+工业互联网标识解析,打造智能工厂新标杆!

当前,工业4.0浪潮愈发澎湃,加快数字化、网络化、智能化发展成为了制造业转型升级的必然要求。 51WORLD基于数字孪生技术与工业互联网标识解析体系,打造了一个集协同化供应、个性化定制、智能化生产于一体的全连接产线孪生平台(以…

AndroidStudio设计登录页源码(音悦app)

目录 一、代码 二、效果 一、代码 1.在activity_main.xml里的代码 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent&quo…

(一)RabbitMQ实战——rabbitmq的核心组件及其工作原理介绍

前言 RabbitMQ是一个开源的消息代理软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;标准&#xff0c;提供可靠的消息传递机制。RabbitMQ可以用于在应用程序之间传递消息&#xff0c;实现不同应用系统之间的解耦和通信。它支持多种编程语言&#xff0c;…

11.Java---语法总结之一个小项目

图书管理系统 Java学习了很久了,今天将运用之前学习的所有东西整理做个小小的小项目. 1.首先是各种包和操作方法建好 2.然后是项目的大框架搭好 3.然后就开始实现各个部分了 看看最后的运行结果吧! 管理员测试 1.登录&显示图书的运行结果 2.查找&新增图书的运行结…

C goto 语句

C 语言中的 goto 语句允许把控制无条件转移到同一函数内的被标记的语句。 注意&#xff1a;在任何编程语言中&#xff0c;都不建议使用 goto 语句。因为它使得程序的控制流难以跟踪&#xff0c;使程序难以理解和难以修改。任何使用 goto 语句的程序可以改写成不需要使用 goto 语…

安卓逆向 安装frida

1,准备工作 安装adb环境,python最高支持到3.8 2,下载雷电模拟器5.0(安卓是7.0)要64位的 雷电安卓模拟器-手游模拟器安卓版_android手机模拟器电脑版_雷电模拟器官网 3,下载frida服务端(版本要与安卓版本匹配;与客户端版本要一致) 在模拟器查看架构 adb shell getprop ro.pr…

数组和指针笔试题目解析---掌握他们拿下指针魔鬼

目录 一、前言二、一维数组2.1代码2.2分析2.3验证运行结果 三、字符数组3.1代码13.1.1分析3.1.2验证运行结果 3.2代码23.2.1分析3.2.2验证运行结果 3.3代码33.3.1分析3.3.2验证运行结果 3.4代码43.4.1分析3.4.2验证运行结果 3.5代码53.5.1分析3.5.2验证运行结果 3.6代码63.6.1分…

D7805 ——体积小,成本低,性能好

D7805 构成的 5V 稳压电源为输出电压5V&#xff0c;输出电流 1000mA 的稳压电源它由滤波电容 C1,C3,防止自激电容 C2、C3 和一只固定三端稳压器&#xff08;7805&#xff09;后级加 LC 滤波极为简洁方便地搭成&#xff0c;输入直流电压范围为 7~35V&#xff0c;此直流电压经过D…

机械女生,双非本985硕,目前学了C 基础知识,转嵌入式还是java更好?

作为单片机项目开发的卖课佬&#xff0c;个人建议&#xff0c;先转嵌入式单片机开发方向&#xff0c;哈哈。 java我也学过&#xff0c;还学过oracle、mysql数据库&#xff0c;只是当时没做笔记&#xff0c;找不好充分的装逼证据了。 从实习通过业余时间&#xff0c;学到快正式毕…

(黑马出品_高级篇_03)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

&#xff08;黑马出品_高级篇_03&#xff09;SpringCloudRabbitMQDockerRedis搜索分布式 微服务技术——多级缓存 今日目标1.什么是多级缓存2.JVM进程缓存2.1.导入案例2.1.1.安装MySQL2.1.1.1.准备目录2.1.1.2.运行命令2.1.1.3.修改配置 2.1.1.4.…

学编程前需要知道哪些编程语言呢?

编程语言的选择对学习编程的重要性不可低估。不同编程语言各有独特特点和适用场景&#xff0c;合理选择适合自身需求的编程语言能事半功倍。初学者而言&#xff0c;选择一门简洁易读的编程语言如Python&#xff0c;可以快速掌握编程基础原理&#xff0c;轻松编写程序&#xff0…

202003 青少年软件编程(Scratch)等级考试试卷(二级)

第1题:【 单选题】 在以下积木中,( )可以将声音的音量增大 A: B: C: D: 【正确答案】: B 【试题解析】 : 第2题:【 单选题】 如下图所示脚本运行的结果是( ) A:画一条直线 B:画一个三角形 C:画一个圆形 D:画一条虚线 【正确答案】: D 【试题解析】 : 第3…

【新书推荐】26.3 模块间的信息传递

模块间的信息传递主要表现为模块间过程调用时的参数传递。在第十一章介绍的过程调用参数传递原则和方法依然有效。少量的参数可以利用寄存器传递或堆栈传递&#xff0c;大量的参数可先组织在一个缓冲区中&#xff0c;然后利用寄存器或堆栈传递相应的指针。 如果利用约定的存储…

ES分片均衡策略分析与改进

从故障说起 某日早高峰收到 Elasticsearch 大量查询超时告警&#xff0c;不同于以往&#xff0c;查看 Elasticsearch 查询队列监控后发现&#xff0c;仅123节点存在大量查询请求堆积。 各节点查询队列堆积情况 查看节点监控发现&#xff0c;123节点的 IO 占用远高于其他节点。…

CcFrame Logo完成

Compact celerity framework CCFrame&#xff1a;一个快速开发、精简压缩的SAAS微服务后端架构 仅需要一台阿里云2核2G机器即可完整运行平台系统及其所有的运行及数据支持 微服务、远程-本地二级缓存架构、ES索引、队列、分库分表、集群定时器&#xff0c;一个都不能少 谁说2…

基于YOLOv8深度学习的木薯病害智能诊断与防治系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

【R语言实战】——fGARCH包在金融时序上的模拟应用

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…

【惠友小课堂】健康开学第一课,青少年脊柱侧弯了解一下?让孩子少走“弯”路

寒假结束迎来开学&#xff0c;家长们又开始了新一轮的“内卷”之旅&#xff0c;可在关心学业的同时&#xff0c;千万不能忽略孩子们的身体健康&#xff0c;脊柱侧弯已成为继肥胖症、近视之后我国儿童青少年的第三大健康“杀手”。 至于引起脊柱侧弯的原因&#xff0c;可能很多家…