HarmonyOS鸿蒙Next中如何实现页面跳转和参数传递?router的完整使用方法
HarmonyOS鸿蒙Next中如何实现页面跳转和参数传递?router的完整使用方法 问题描述
- HarmonyOS 5.0,DevEco Studio 5.0
- 需要从列表页跳转到详情页,并传递数据
- 不清楚router的具体用法和参数获取方式
希望了解router的完整使用方法,包括跳转、传参、返回等操作
3 回复
解决方案
1. 导入router模块
import router from '@ohos.router'
2. 基础页面跳转
// 方式1:pushUrl - 跳转到新页面(保留当前页面在栈中)
router.pushUrl({
url: 'pages/DetailPage'
})
// 方式2:replaceUrl - 替换当前页面(不保留当前页面)
router.replaceUrl({
url: 'pages/DetailPage'
})
3. 带参数跳转
// 列表页 - 跳转并传递参数
@Entry
@Component
struct ListPage {
goToDetail(item: ItemData) {
router.pushUrl({
url: 'pages/DetailPage',
params: {
id: item.id,
title: item.title,
data: item // 可以传递对象
}
})
}
build() {
List() {
ForEach(this.dataList, (item: ItemData) => {
ListItem() {
Text(item.title)
.onClick(() => this.goToDetail(item))
}
})
}
}
}
4. 接收页面参数
// 定义参数类型接口
interface DetailParams {
id: string
title: string
data?: ItemData
}
@Entry
@Component
struct DetailPage {
@State itemId: string = ''
@State itemTitle: string = ''
aboutToAppear(): void {
// 获取路由参数
const params = router.getParams() as DetailParams
if (params) {
this.itemId = params.id
this.itemTitle = params.title
console.info('接收到参数:', JSON.stringify(params))
}
}
build() {
Column() {
Text(`ID: ${this.itemId}`)
Text(`标题: ${this.itemTitle}`)
}
}
}
5. 返回上一页
// 简单返回
router.back()
// 返回并传递数据
router.back({
url: 'pages/ListPage',
params: {
result: 'success',
updatedData: this.editedData
}
})
6. 监听返回结果
@Entry
@Component
struct ListPage {
onPageShow(): void {
// 页面重新显示时检查返回参数
const params = router.getParams() as ResultParams
if (params?.result === 'success') {
// 处理返回结果
this.refreshData()
}
}
}
7. 页面配置 main_pages.json
确保目标页面已在配置文件中注册:
{
"src": [
"pages/Index",
"pages/ListPage",
"pages/DetailPage",
"pages/EditPage"
]
}
8. 完整示例
列表页 ListPage.ets:
import router from '@ohos.router'
interface ItemData {
id: string
title: string
content: string
}
@Entry
@Component
struct ListPage {
@State dataList: ItemData[] = [
{ id: '1', title: '项目一', content: '内容一' },
{ id: '2', title: '项目二', content: '内容二' }
]
build() {
Navigation() {
List({ space: 12 }) {
ForEach(this.dataList, (item: ItemData) => {
ListItem() {
Row() {
Text(item.title)
.fontSize(16)
Blank()
Image($r('app.media.ic_arrow_right'))
.width(20)
.height(20)
}
.width('100%')
.padding(16)
.backgroundColor('#FFFFFF')
.borderRadius(8)
.onClick(() => {
router.pushUrl({
url: 'pages/DetailPage',
params: { id: item.id, title: item.title, content: item.content }
})
})
}
}, (item: ItemData) => item.id)
}
.padding(16)
}
.title('列表')
}
}
详情页 DetailPage.ets:
import router from '@ohos.router'
interface DetailParams {
id: string
title: string
content: string
}
@Entry
@Component
struct DetailPage {
@State params: DetailParams = { id: '', title: '', content: '' }
aboutToAppear(): void {
const routerParams = router.getParams() as DetailParams
if (routerParams) {
this.params = routerParams
}
}
build() {
Navigation() {
Column({ space: 16 }) {
Text(this.params.title)
.fontSize(24)
.fontWeight(FontWeight.Bold)
Text(this.params.content)
.fontSize(16)
Button('返回')
.onClick(() => router.back())
}
.padding(16)
}
.title('详情')
}
}
9. 路由模式对比
| 方法 | 说明 | 页面栈变化 |
|---|---|---|
pushUrl |
跳转新页面 | A → A, B |
replaceUrl |
替换当前页面 | A → B |
back |
返回上一页 | A, B → A |
clear |
清空页面栈 | A, B, C → 空 |
注意事项:
- 传递的参数对象会被序列化,不要传递函数或循环引用对象
- 页面必须在 main_pages.json 中注册
- 使用 TypeScript 接口定义参数类型,避免类型错误
更多关于HarmonyOS鸿蒙Next中如何实现页面跳转和参数传递?router的完整使用方法的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,页面跳转和参数传递主要通过router模块实现。使用router.pushUrl()进行页面跳转,可在params中传递参数。示例代码:
import { router } from '@kit.ArkUI';
router.pushUrl({
url: 'pages/NextPage',
params: { id: 123, name: 'test' }
})
目标页面通过router.getParams()获取参数。使用router.back()返回上一页。页面路由需在module.json5中配置路由信息。
在HarmonyOS Next中,页面路由由@ohos.router模块提供。以下是基于API 12+的router完整使用方法,涵盖跳转、传参和返回。
1. 基础跳转
首先在module.json5中配置路由:
"pages": "pages/Index", // 首页
"routing": [
{
"name": "DetailPage",
"path": "pages/Detail"
}
]
跳转方式:
import { router } from '@ohos.router';
// 普通跳转(压栈)
router.pushUrl({
url: 'pages/Detail'
});
// 替换当前页(不压栈)
router.replaceUrl({
url: 'pages/Detail'
});
2. 参数传递与接收
传递参数:
router.pushUrl({
url: 'pages/Detail',
params: {
id: 1001,
title: '商品详情',
data: { price: 299.00 }
}
});
接收参数(详情页):
import { router } from '@ohos.router';
// 获取所有参数
const params = router.getParams();
console.log(params.id); // 1001
console.log(params.title); // '商品详情'
// 监听参数变化(页面已存在时)
router.addObserver((params) => {
console.log('参数更新:', params);
});
3. 路由模式
// 标准模式(默认)
router.pushUrl({
url: 'pages/Detail',
mode: router.RouterMode.Standard
});
// 单例模式(复用页面)
router.pushUrl({
url: 'pages/Detail',
mode: router.RouterMode.Single
});
4. 返回操作
// 返回上一页
router.back();
// 返回指定页面
router.back({
url: 'pages/Index'
});
// 带参数返回
router.back({
url: 'pages/Index',
params: {
refresh: true
}
});
5. 完整示例
列表页:
import { router } from '@ohos.router';
function navigateToDetail(item: any) {
router.pushUrl({
url: 'pages/Detail',
params: {
id: item.id,
name: item.name,
extra: item.data
}
});
}
详情页:
import { router } from '@ohos.router';
@Entry
@Component
struct DetailPage {
@State id: string = '';
@State name: string = '';
onPageShow() {
const params = router.getParams();
this.id = params.id;
this.name = params.name;
}
// 返回并传递结果
goBack() {
router.back({
params: {
result: '操作成功'
}
});
}
}
关键点:
- 使用
router.pushUrl进行页面跳转,router.replaceUrl替换页面 - 参数通过
params对象传递,支持复杂对象 - 通过
router.getParams()获取参数,建议在onPageShow生命周期处理 - 单例模式适合详情页等场景,避免重复创建页面实例
- 返回时可携带参数供原页面使用
注意:页面路径需在module.json5中正确定义,且跳转路径区分大小写。

