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', // 目标urlparams: 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是可以直接导包的

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言例2-1:从键盘输入两个整数,计算其乘积

代码如下&#xff1a; //从键盘输入两个整数&#xff0c;计算其乘积 #include<stdio.h> int main(void) /*主函数*/ {int n1, n2, result; /*定义保存两个整数及其乘积的变量*/printf("please inp…

让手机变相机,微单变全画幅的外设-斯莫格摄影套装开箱

大家好&#xff0c;我是Circaboy&#xff0c;近期给我的手机和相机入了一整套专业的摄影外设套装&#xff0c;然后我发现专业设备加持下的摄影着实是比我之前的要好很多&#xff0c;所以我就写了个文章做个简单的介绍和专业外设加持下的摄影对比。 本次入手的是斯莫格摄影套装…

海南众乐科技--元宇宙场景星球乐园与上海普思签署战略投资协议

3月12日,上海普思投资有限公司与海南众乐科技有限公司正式签署了战略合作协议,上海普思投资有限公司首期投资180万元资金支持推动元宇宙场景项目星球乐园的开发。双方本着互利共赢的原则、达成长期、全面性的战略合作关系,推动数字场景业务共同发展。 星球乐园是海南众乐科技有…

AI新工具(20240313) 世界上第一个完全自主的AI软件工程师Devin 已经开始接外包了;又一个开源本地知识库问答系统

1: Cognition AI Devin 世界上第一个完全自主的AI软件工程师Devin 已经开始接外包了 Devin是世界上第一个完全自主的AI软件工程师&#xff0c;具备长期推理和规划的能力&#xff0c;能够执行复杂的工程任务&#xff0c;包括学习、修复错误、与用户实时合作等。Devin可以学习并…

Mysql 学习(十七)事务隔离级别和MVCC

前提准备 首先创建一个表&#xff1a; CREATE TABLE hero (number INT,name VARCHAR(100),country varchar(100),PRIMARY KEY (number) ) EngineInnoDB CHARSETutf8;INSERT INTO hero VALUES(1, 刘备, 蜀);事务隔离级别 mysql 是一个 客户端 和 服务器架构的软件&#xff0c…

SQL进阶(四):Window 函数技巧

目录 1. 课前小问答1. 什么是 Windows 函数&#xff1f;&#xff08;窗口函数&#xff09;2. Window 函数的功能强大之处在哪里呢&#xff1f; 2. 开始之前的准备3. Window 函数核心&#xff1a;frame3.1 “轴”的范围控制&#xff1a;frame 参数✍️ 小练习 1&#xff1a; 尝试…

Android基础开发-选择图片,发送彩信

发送图片彩信案例&#xff1a; 按住加号&#xff0c;选择相册&#xff0c;把相册选择的图片加载的应用中&#xff0c;点击发送彩信&#xff0c;选择短信&#xff0c;发送彩信。 代码如下&#xff1a; package com.example.client;import androidx.activity.result.ActivityRe…

【Hibernate-Validate】常用注解

常用注解: NotNull:被注释的元素(任何元素)必须不为 nul, 集合为空也是可以的。NotEmpty:用来校验字符串、集合、map、数组不能为null或也不能为空(字符串传入空格也不可以)(集合需至少包含一个元素)NotBlank:被注释的字符串的必须非空&#xff0c;空格也不行&#xff0c;空字…

英伟达昨夜股市暴增7%!市场为何如此兴奋?GTC大会的预期效应?

会议之眼 快讯 美东时间2024年3月12日&#xff0c;英伟达公司&#xff08;NVIDIA Corp&#xff0c;股票代码&#xff1a;NVDA&#xff09;迎来了一次令人瞩目的大反弹&#xff01;展现出强劲的增长势头。根据数据&#xff0c;当日收盘价为919.13美元&#xff0c;比前一交易日的…

Realsense 相机SDK学习(一)——librealsense使用方法及bug解决(不使用Ros)

一.介绍 realsense相机是一个intel开发出来的一款深度相机&#xff0c;我之前使用他来跑过slam&#xff0c;也配置过他的驱动&#xff0c;在此附上realsense的相机驱动安装方法&#xff1a;Ubuntu20.04安装Intelrealsense相机驱动&#xff08;涉及Linux内核降级&#xff09; …

【string一些函数用法的补充】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 string类对象的修改操作 我们来看 c_str 返回c格式的字符串的操作&#xff1a; 我们来看 rfind 和 substr 的操作&#xff1a; string类非成员函数 我们来看 r…

C语言经典算法学习-4

文章目录 21.最大访客数22.中序式转后序式&#xff08;前序式&#xff09;23.后序式的运算24.洗扑克牌&#xff08;乱数排列&#xff09;25.Craps赌博游戏 21.最大访客数 说明&#xff1a;现将举行一个餐会&#xff0c;让访客事先填写到达时间与离开时间&#xff0c;为了掌握座…