烟台网站建设陕西网站建设

乌鲁木齐市忆学创美文化传播有限公司 2026/09/09 18:57:24

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

HarmonyOS提供了Router模块,通过不同的url地址,可以方便地进行页面路由,轻松地访问不同的页面。

包的使用及引用

import router from '@ohos.router'

1.pushUrl-压栈跳转

pushUrl(options: RouterOptions): Promise<void>

场景: 如果我们从列表页跳转到详情页查看详情,点击返回还要继续查看列表页,可以使用pushUrl,打开详情页的同时,保留了列表页在栈中。

接下来测试一下:

(1)建立两个Page,HmList和HmDetail,如图所示。

(2)实现HmList的布局,代码如下。

classListItemInfo{

title:string=""

id:number=0

}

@Entry

@Component

structHmList{

@Statelist:ListItemInfo[]=Array.from(Array(100),(_:number,index:number)=>{

return{

title:`我是第${index + 1}个`,

id:index+1

}asListItemInfo

})

build(){

Column({space:20}){

Row(){

Text("列表数据")

.textAlign(TextAlign.Center)

.width('100%')

.height(40)

}.border({

color:'#f3f4f5',

width:{

bottom:1

}

})

List({space:10}){

ForEach(this.list,(item:ListItemInfo)=>{

ListItem(){

Row(){

Text(item.title)

Button("查看详情")

.height(30)

}.width('100%')

.justifyContent(FlexAlign.SpaceBetween)

.padding({

left:10,

right:10

})

}

})

}

}

}

}

实现效果,如图所示。

(3)实现HmDetail布局,代码如下:

@Entry

@Component

structHmDetail{

build(){

Column(){

Row(){

Text("详情页")

.width('100%')

.textAlign(TextAlign.Center)

}.height(40)

.border({

color:'#f3f4f5',

width:{

bottom:1

}

})

Column(){

Text("详情页")

.fontSize(50)

}

.layoutWeight(1)

.justifyContent(FlexAlign.Center)

}

.height('100%')

}

}

实现效果,如图所示。

(4)在HmList中导入router包,完成路由跳转

importrouterfrom'@ohos.router'

Button("查看详情").onClick(() => {

router.pushUrl({ url: 'pages/HmDetail' })

})

完整代码如下:

importrouterfrom'@ohos.router'

classListItemInfo{

title:string=""

id:number=0

}

@Entry

@Component

structHmList{

@Statelist:ListItemInfo[]=Array.from(Array(100),(_:number,index:number)=>{

return{

title:`我是第${index + 1}个`,

id:index+1

}asListItemInfo

})

build(){

Column({space:20}){

Row(){

Text("列表数据")

.textAlign(TextAlign.Center)

.width('100%')

.height(40)

}.border({

color:'#f3f4f5',

width:{

bottom:1

}

})

List({space:10}){

ForEach(this.list,(item:ListItemInfo)=>{

ListItem(){

Row(){

Text(item.title)

Button("查看详情").onClick(()=>{

router.pushUrl({url:'pages/HmDetail'})

})

.height(30)

}.width('100%')

.justifyContent(FlexAlign.SpaceBetween)

.padding({

left:10,

right:10

})

}

})

}

}

}

}

2.replaceUrl-替换跳转

有一个登录页(Login)和一个个人中心页(Profile),希望从登录页成功登录后,跳转到个人中心页。同时,销毁登录页,在返回时直接退出应用。

此时直接replaceUrl方法会在跳转的同时,销毁登录页,在上面的例子中,直接将pushUrl换成replaceUrl即可。

import router from '@ohos.router';

Button("查看详情").onClick(() => {

router.replaceUrl({ url: 'pages/HmDetail' })

})

})

总结

(1)当你需要跳转之后,还可以回到上一个页面,使用pushUrl,它会保留当前的页面,压一个新的页面

(2)当你跳转之后,上一个页面的任务已经完成,不需要返回,就可以使用replaceUrl

3.back返回

router.back() . 返回上一个页面,此时不需要参数,如果说你想要返回的时候带一些参数,需要params和url- 想要指定url.

(1)router.back()

在详情页加一个返回按钮,点击按钮调用router.back()。

importrouterfrom'@ohos.router'

Button("返回列表页")

.onClick(() => {

router.back()

})

添加一个返回按钮,完整代码如下:

importrouterfrom'@ohos.router'

@Entry

@Component

structHmDetail{

build(){

Column(){

Row(){

Text("详情页")

.width('100%')

.textAlign(TextAlign.Center)

}.height(40)

.border({

color:'#f3f4f5',

width:{

bottom:1

}

})

Column(){

Text("详情页")

.fontSize(50)

Button("返回列表页")

.onClick(()=>{

router.back()

})

}

.layoutWeight(1)

.justifyContent(FlexAlign.Center)

}

.height('100%')

}

}

实现效果,如图所示。

4.路由参数

如果需要在跳转时,传递一些数据给目标页,比如列表页到详情页,想把id传过去,就可以使用路由传参的模式。

(1)修改HmList.ets文件,代码如下:

Button("查看详情").onClick(()=>{

router.pushUrl({

url:'pages/HmDetail',

params:{

id:item.id

}

})

})

(2)修改HmDetail.ets文件,子组件接收参数,代码如下:

importrouterfrom'@ohos.router'

classRouterParams{

id:number=0

}

@Entry

@Component

structHmDetail{

@State

detailId:number=0

aboutToAppear(){

constparams=router.getParams()asRouterParams

if(params?.id){

this.detailId=params?.id

}

}

build(){

Column(){

Row(){

Text("详情页")

.width('100%')

.textAlign(TextAlign.Center)

}.height(40)

.border({

color:'#f3f4f5',

width:{

bottom:1

}

})

Column(){

Text("详情页"+this.detailId)

.fontSize(50)

Button("返回列表页")

.onClick(()=>{

router.back()

})

}

.layoutWeight(1)

.justifyContent(FlexAlign.Center)

}

.height('100%')

}

}

实现效果,如图所示。

router.back() 同样可以传递参数给上一级的路由,上一级路由应该在onPageShow里面接收详情页面返回传参。

(1)HmDetail.ets文件,详情组件添加“返回列表页带参数”按钮,代码如下:

Button("返回列表页带参数")

.onClick(() => {

router.back({

url: 'pages/HmList',

params: {

backId: this.detailId

}

})

})

(2)父组件接受参数,HmList.ets文件,代码如下:

class BackRouterParams {

backId: number = 0

}

onPageShow() {

const params = router.getParams() as BackRouterParams

if(params?.backId) {

AlertDialog.show({

message: params.backId.toString()

})

}

}

完整代码如下:

importrouterfrom'@ohos.router'

classListItemInfo{

title:string=""

id:number=0

}

classBackRouterParams{

backId:number=0

}

@Entry

@Component

structHmList{

@Statelist:ListItemInfo[]=Array.from(Array(100),(_:number,index:number)=>{

return{

title:`我是第${index + 1}个`,

id:index+1

}asListItemInfo

})

onPageShow(){

constparams=router.getParams()asBackRouterParams

if(params?.backId){

AlertDialog.show({

message:params.backId.toString()

})

}

}

build(){

Column({space:20}){

Row(){

Text("列表数据")

.textAlign(TextAlign.Center)

.width('100%')

.height(40)

}.border({

color:'#f3f4f5',

width:{

bottom:1

}

})

List({space:10}){

ForEach(this.list,(item:ListItemInfo)=>{

ListItem(){

Row(){

Text(item.title)

Button("查看详情").onClick(()=>{

// router.pushUrl({ url: 'pages/HmDetail' })

// router.replaceUrl({ url: 'pages/HmDetail' })

router.pushUrl({

url:'pages/HmDetail',

params:{

id:item.id

}

})

})

.height(30)

}.width('100%')

.justifyContent(FlexAlign.SpaceBetween)

.padding({

left:10,

right:10

})

}

})

}

}

}

}

实现效果,如图所示。

->

总结:

(1)传参用params对象,里面可以传任意内容,key/value由开发者自己定义。

(2)接收端采用router.getParams()获取对象,需要通过class来定义参数的结构,接收之后通过类型断言as指定为具体类型。

(3)如果是通过pushUrl的方式跳转的,返回上一个页面时,aboutToAppear不会执行,需要使用onPageShow来监听当前页面的显示钩子函数。

5.路由模式

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

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

简单理解一下就是:

(1)Standard-只要push,页面栈里面就会加一项,不管之前加没加过。

(2)Single- 之前加过,不会加新的页面,会把之前加过的页面加出来。

测试- 在detail页面再push到list页,分别使用单例模式和标准模式测试。

Button("标准模式")

.onClick(() => {

router.pushUrl({

url: 'pages/HmList'

})

})

Button("单例模式")

.onClick(() => {

router.pushUrl({

url: 'pages/HmList'

}, router.RouterMode.Single)

})

这里会发现 使用single模式路由返回时的list已经不存在了,因为单例模式只要存在不会再压栈。

HmDetail.ets文件,完整代码如下:

importrouterfrom'@ohos.router'

classRouterParams{

id:number=0

}

@Entry

@Component

structHmDetail{

@State

detailId:number=0

aboutToAppear(){

constparams=router.getParams()asRouterParams

if(params?.id){

this.detailId=params?.id

}

}

build(){

Column(){

Row(){

Text("详情页")

.width('100%')

.textAlign(TextAlign.Center)

}.height(40)

.border({

color:'#f3f4f5',

width:{

bottom:1

}

})

Column(){

Text("详情页"+this.detailId)

.fontSize(50)

Button("返回列表页")

.onClick(()=>{

router.back()

})

Button("返回列表页带参数")

.onClick(()=>{

router.back({

url:'pages/HmList',

params:{

backId:this.detailId

}

})

})

Button("标准模式")

.onClick(()=>{

router.pushUrl({

url:'pages/HmList'

})

})

Button("单例模式")

.onClick(()=>{

router.pushUrl({

url:'pages/HmList'

},router.RouterMode.Single)

})

}

.layoutWeight(1)

.justifyContent(FlexAlign.Center)

}

.height('100%')

}

}

实现效果,如图所示。

欢迎加入课程班级,考取鸿蒙认证:

https://developer.huawei.com/consumer/cn/training/classDetail/d43582bb30b34f548c16c127cb3be104?type=1?ha_source=hmosclass&ha_sourceId=89000248

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

外贸网站建设商务网站建设

让界面“呼吸”起来:用 QTimer::singleShot 实现控件的优雅延时启用你有没有遇到过这样的场景?用户刚打开一个设置向导,还没看清提示文字

2026/06/30 10:37:21

网站建设模板宝应网站建设

活动目录站点、复制与架构管理全解析在企业网络环境中,活动目录(Active Directory,简称AD)的有效管理至关重要,它涉及到站点与复制的管理以及活动目录域服务架构的管理。下面我们将详细介绍相

2026/06/30 14:09:39

贵阳网站建设盐城网站建设

故障恢复机制:意外中断后可从断点继续生成音频在播客制作、有声书合成和虚拟角色对话等长时语音生成场景中,一个看似微小的技术缺陷——“一旦中断就得重来”——往往成为压垮生产效率

2026/06/30 10:37:52

机票网站建设南昌网站建设公司

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等

2026/06/30 11:02:23

律师网站建设门户网站建设

HTML表单上传图片交由GLM-4.6V-Flash-WEB进行云端分析在今天的Web应用开发中,一个越来越常见的需求是:让用户像提问一样理解一张照片。比如,

2026/06/30 10:45:51

重庆网站建设绵阳网站建设

还在为网络不稳定导致语音识别失败而烦恼吗?🤔 今天我要向你介绍一个革命性的解决方案——基于OpenAI Whisper和TensorFlow Lite的Android离线

2026/06/30 12:18:30

网站建设费用河南网站建设公司

在前端开发中,事件绑定是交互逻辑实现的核心基础,而(click)点击事件作为最常用的事件类型,更是贯穿于各类项目的开发场景中。与此同时,事件对象

2026/06/30 10:24:19

网站建设方案书成都建设网站

快速体验打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容:开发一个针对电商网站的字体检测分析工具,重点功能:

2026/06/30 13:11:04

石家庄网站建设永康网站建设

由于微软更新策略变更,出厂预装系统是无法禁用更新功能的,在联网检测到版本较低的情况下微软将强制推送更新通知。那么如何彻底禁止Windows 11自动更新? win11更新怎

2026/06/30 10:14:19

牡丹江网站建设郑州建设网站

Langchain-Chatchat与BI工具集成实现智能数据分析问答在企业数据爆炸式增长的今天,一个常见的场景是:业务经理打开Power BI仪表盘,面对密

2026/06/30 12:21:30