首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >HarmonyOS 路由与导航

HarmonyOS 路由与导航

作者头像
程序猿的栖息地
发布2026-07-07 15:27:42
发布2026-07-07 15:27:42
70
举报

HarmonyOS 路由与导航参考页面路由

Router 基础路由(传统方式)

代码语言:javascript
复制
import router from '@ohos.router'
 
// 跳转到新页面
router.pushUrl({
 url: 'pages/DetailPage',
 params: { id: '123', name: '商品详情' }
})
 
// 替换当前页面(不可返回)
router.replaceUrl({
 url: 'pages/LoginPage',
 params: { from: 'home' }
})
 
// 返回上一页
router.back()
router.back({ url: 'pages/HomePage' }) // 返回到指定页面
 
// 获取路由参数
const params = router.getParams() as Record<string, Object>
const id = params?.['id'] as string
 
// 清除所有页面记录并跳转(适用于登录后跳主页)
router.clear()
 
// 跳转前判断
router.enableAlertBeforeBackPage({ message: '确定要离开吗?' })

Navigation 导航组件(推荐方式,API 12+)

Navigation 是更现代的导航方案,支持 NavDestination 子页面、转场动画、路由栈管理。

代码语言:javascript
复制
@Entry
@Component
struct MainPage {
 @Provide('navPathStack') pathStack: NavPathStack = new NavPathStack()
 
 build() {
 Navigation(this.pathStack) {
 Column() {
 Text('首页内容')
 Button('去详情').onClick(() => {
 this.pathStack.pushPath({ name: 'DetailPage', param: { id: '123' } })
 })
 }
 }
 .title('主页')
 .navBarHidden(false)
 .mode(NavigationMode.Stack)
 }
}

NavDestination 子页面

代码语言:javascript
复制
// 在页面路由配置中注册
// main_pages.json 或 NavPathMap 中配置映射
 
@Builder
function DetailPageBuilder(name: string, param: Object) {
 DetailPage()
}
 
@Component
struct DetailPage {
 @Consume('navPathStack') pathStack: NavPathStack
 @State detailData: DetailInfo = new DetailInfo()
 
 aboutToAppear() {
 const param = this.pathStack.getParamByName('DetailPage') as Record<string, Object>
 const id = param?.['id'] as string
 this.loadDetail(id)
 }
 
 build() {
 NavDestination() {
 Column() {
 Text('详情页内容')
 Button('返回').onClick(() => {
 this.pathStack.pop()
 })
 }
 }
 .title('详情')
 .hideBackButton(false)
 .onShown(() => { console.info('DetailPage shown') })
 .onHidden(() => { console.info('DetailPage hidden') })
 }
}

NavPathStack 路由栈操作

代码语言:javascript
复制
// pushPath — 推入新路由
this.pathStack.pushPath({ name: 'DetailPage', param: { id: '123' } })
 
// pushPathByName — 按名称推入
this.pathStack.pushPathByName('SettingPage', { tab: 'account' })
 
// pop — 返回上一页
this.pathStack.pop()
 
// popToName — 返回到指定页面
this.pathStack.popToName('HomePage')
 
// popToIndex — 返回到指定索引
this.pathStack.popToIndex(1)
 
// clear — 清空路由栈
this.pathStack.clear()
 
// replacePath — 替换当前路由
this.pathStack.replacePath({ name: 'LoginPage' })
 
// getParent — 获取父页面参数
const parentParam = this.pathStack.getParent()
 
// getParamByName — 获取指定页面参数
const param = this.pathStack.getParamByName('DetailPage')
 
// getAllPathName — 获取所有路由名称
const names = this.pathStack.getAllPathName()
 
// size — 当前栈大小
const stackSize = this.pathStack.size()

路由转场动画

代码语言:javascript
复制
// Navigation 级别配置
Navigation(this.pathStack) {
 // 内容
}
.navDestination(this.PageBuilder)
.customNavContentTransition((from: NavContentInfo, to: NavContentInfo) => {
 // 自定义转场动画
 return { transitionDuration: 300 }
})
 
// NavDestination 级别配置
NavDestination() {
 // 内容
}
.transition(TransitionEffect.OPACITY)

Tab 导航

底部 Tab 导航

代码语言:javascript
复制
@Entry
@Component
struct MainTab {
 @State currentTab: number = 0
 
 @Builder
 TabBuilder(title: string, icon: Resource, index: number) {
 Column() {
 Image(icon).width(24).height(24)
 .fillColor(this.currentTab === index ? '#007DFF' : '#999999')
 Text(title).fontSize(12)
 .fontColor(this.currentTab === index ? '#007DFF' : '#999999')
 }
 }
 
 build() {
 Tabs({ barPosition: BarPosition.End, index: $this.currentTab }) {
 TabContent() { HomePage() }
 .tabBar(this.TabBuilder('首页', $r('app.media.home'), 0))
 
 TabContent() { CategoryPage() }
 .tabBar(this.TabBuilder('分类', $r('app.media.category'), 1))
 
 TabContent() { MessagePage() }
 .tabBar(this.TabBuilder('消息', $r('app.media.message'), 2))
 
 TabContent() { ProfilePage() }
 .tabBar(this.TabBuilder('我的', $r('app.media.profile'), 3))
 }
 .scrollable(false)
 .barMode(BarMode.Fixed)
 }
}

页面生命周期

代码语言:javascript
复制
@Entry
@Component
struct DetailPage {
 // 页面生命周期回调
 aboutToAppear() {
 console.info('页面即将显示 — 初始化数据')
 this.loadData()
 }
 
 aboutToDisappear() {
 console.info('页面即将销毁 — 清理资源')
 }
 
 onPageShow() {
 console.info('页面每次显示时调用 — 包括从其他页面返回')
 }
 
 onPageHide() {
 console.info('页面每次隐藏时调用')
 }
 
 onBackPress(): boolean {
 console.info('返回键按下 — 返回 true 可拦截返回')
 if (this.hasUnsavedChanges) {
 this.showSaveDialog()
 return true // 拦截返回
 }
 return false // 允许返回
 }
 
 build() {
 Column() { Text('Detail Page') }
 }
}

组件生命周期

代码语言:javascript
复制
@Component
struct MyComponent {
 aboutToAppear() {
 // 组件即将挂载 — 适合初始化
 }
 aboutToDisappear() {
 // 组件即将卸载 — 适合清理
 }
 onDidAppear() {
 // 组件已显示(API 12+)
 }
 onDidDisappear() {
 // 组件已隐藏(API 12+)
 }
 
 build() { Column() { Text('Component') } }
}

路由配置文件

main_pages.json

代码语言:javascript
复制
{
 ”src”: [
 ”pages/Index”,
 ”pages/HomePage”,
 ”pages/DetailPage”,
 ”pages/SettingPage”,
 ”pages/LoginPage”
 ]
}

路径映射配置(Navigation 模式)

代码语言:javascript
复制
// 在入口页面或全局配置中
@Builder
function PageBuilder(name: string, param: Object) {
 if (name === 'HomePage') {
 HomePage()
 } else if (name === 'DetailPage') {
 DetailPage()
 } else if (name === 'SettingPage') {
 SettingPage()
 }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-07-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿的栖息地 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • HarmonyOS 路由与导航参考页面路由
  • Router 基础路由(传统方式)
  • Navigation 导航组件(推荐方式,API 12+)
  • NavDestination 子页面
  • NavPathStack 路由栈操作
  • 路由转场动画
  • Tab 导航
  • 底部 Tab 导航
  • 页面生命周期
  • 组件生命周期
  • 路由配置文件
  • main_pages.json
  • 路径映射配置(Navigation 模式)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档