HarmonyOS:Navigation 和 NavDestination 组件详解

🌐 导航系统架构概览

HarmonyOS 导航系统采用声明式UI+集中式路由管理架构:

🚀 核心组件详解
组件作用关键特性
Navigation导航容器管理页面栈、路由跳转、全局配置
NavPathStack导航状态控制器提供push/pop/clear等栈操作方法
NavDestination页面容器定义页面内容、绑定导航栈
mode属性控制导航显示模式Auto/Stack/Split三种模式
📁 完整文件结构

💻 核心代码实现

index.ets (主页面)

@Entry
@Component
struct Index {
  // ✅ 创建导航栈实例
  pathStack: NavPathStack = new NavPathStack()
  @State currentMode: NavigationMode = NavigationMode.Auto // 响应式模式控制
  
  build() {
    Navigation(this.pathStack) {
      Column() {
        Button('跳转到第二页')
          .onClick(() => {
            //  🚀 导航跳转
            this.pathStack.pushPath({
              name: 'Second',
              params: { id: 100 }  
            })
          })
          
        Button('切换模式')
          .onClick(() => {
            // 动态切换模式
            this.currentMode = (this.currentMode === NavigationMode.Stack) 
              ? NavigationMode.Split 
              : NavigationMode.Stack
          })
      }
    }
    // ✅ 关键:设置导航模式
    .mode(this.currentMode)
    .navBarVisibility(NavBarVisibility.Visible)
  }
  
  aboutToAppear() {
    // 设备自适应逻辑
    display.on('change', () => {
      const displayInfo = display.getDefaultDisplaySync()
      this.currentMode = displayInfo.width >= 600 
        ? NavigationMode.Split 
        : NavigationMode.Stack
    })
  }
}

Second.ets (二级页面)

@Builder
export function showPageBuilder() {
  Second()
}

@Component
struct Second {
  private pathStack?: NavPathStack
  
  build() {
    NavDestination() {
      Column() {
        Text('当前ID: ' + (this.pathStack?.getParams()?.id || 0))
        Button('返回首页')
          .onClick(() => this.pathStack?.pop())
      }
    }
    .onReady((ctx: NavDestinationContext) => {
      this.pathStack = ctx.pathStack
      console.log('接收参数:', ctx.params)
    })
  }
}

router_map.json (路由映射)

{
  "routerMap": [
    {
      "name": "Second",
      "pageSourceFile": "src/main/ets/Second.ets",
      "buildFunction": "showPageBuilder"
    }
  ]
}

module.json (全局配置)

{
  "module": {
    "routerMap": "$profile:router_map",
    "pages": "$profile:main_pages",
    "abilities": [
      {
        "supportSplit": true,
        "forcedSplit": false
      }
    ]
  }
}
📊 Navigation的mode属性详解
模式值说明适用场景动画效果
Auto自动模式(默认)通用设备自动切换动画
Stack堆栈模式手机设备右滑入/左滑出
Split分屏模式平板/折叠屏无过渡动画

模式切换逻辑

模式自适应代码

aboutToAppear() {
  display.on('change', () => {
    const displayInfo = display.getDefaultDisplaySync()
    this.currentMode = displayInfo.width >= 600 
      ? NavigationMode.Split 
      : NavigationMode.Stack
  })
}
🔗 导航流程解析

⚠️ 关键注意事项
  1. 栈绑定:必须在NavDestination的onReady中绑定父级导航栈

  2. 参数传递:使用pushPath(params)传参,通过getParams()获取

  3. 路由映射:router_map.json中的name必须与pushPath名称一致

  4. 模式限制:Split模式下左侧必须是NavDestination组件

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小风华~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值