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 → 空

注意事项:

  1. 传递的参数对象会被序列化,不要传递函数或循环引用对象
  2. 页面必须在 main_pages.json 中注册
  3. 使用 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中正确定义,且跳转路径区分大小写。

回到顶部