• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

wkin

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

鸿蒙app开发·Navigation组件

Navigation定义:主要用于实现页面间以及组件内部的页面跳转,支持在不同组件间传递跳转参数。其分为导航页和子页,导航页又叫Navbar,是Navigation包含的子组件,子页是NavDestination包含的子组件。

简单实现:

①根页面代码(注释版:可以实现多层跳转)

@Entry  // 标记为入口组件,表示这是应用的根组件
@Component  // 标记为自定义组件
struct Navigation1 {
  // 使用@Provide装饰器提供NavPathStack实例,命名为'stack'
  // 这个栈将被用于管理导航路径,并可以被子组件访问
  @Provide('stack') stack: NavPathStack = new NavPathStack()

  build() {
    // 创建Navigation组件,传入路径栈实例
    Navigation(this.stack) {
      // Navigation的子组件,这里是一个Text组件
      Text("hello word")
        .backgroundColor(Color.Red)  // 设置背景色为红色
        .fontSize(36)  // 设置字体大小为36
        .onClick(() => {  // 点击事件处理
          try {
            // 点击时尝试推入新路径
            // 参数说明:
            // 'Navigation2' - 目标页面名称
            // '你好世界' - 传递给目标页面的参数
            // true - 是否启用页面转场动画
            this.stack.pushPathByName('Navigation2', '你好世界', true)
          } catch (e) {
            // 捕获并打印可能的错误
            console.error('this is error:', JSON.stringify(e))
          }
        })
    }
    // Navigation组件的属性设置
    .title('标题')  // 设置导航栏标题
    .titleMode(NavigationTitleMode.Mini)  // 设置标题显示模式为Mini
    .hideBackButton(true)  // 隐藏返回按钮
  }
}

②目标页面代码(注释版)

// 定义一个页面构建器装饰器,用于创建Navigation2实例
@Builder
export function PageBuilder() {
  Navigation2() // 创建Navigation2组件实例
}

// 导航目标页面组件
@Component
export struct Navigation2 {
  // 页面名称状态变量,用于动态显示标题
  @State name: string = '';

  // 通过@Consume装饰器共享父组件提供的NavPathStack实例
  @Consume('stack') stack: NavPathStack;

  build() {
    // 创建导航目标容器
    NavDestination() {
      // 这里可以添加页面内容组件
      // 例如:Text(this.name).fontSize(20)
    }
    .width('100%')    // 设置宽度100%
    .height('100%')   // 设置高度100%

    // 页面准备就绪通过上下文获取参数
    .onReady((context: NavDestinationContext) => {
      try {
        // 从导航上下文中获取传递的参数
        this.name = context.pathInfo.param as string;
        console.log('接收到的参数:', JSON.stringify(context.pathInfo.param));

        // 检查参数有效性
        if (typeof this.name !== 'string') {
          console.error('无效的参数类型:', typeof context.pathInfo.param);
          this.name = '默认标题'; // 设置默认值
        }
      } catch (e) {
        console.error('参数解析错误:', JSON.stringify(e));
        this.name = '错误页面';
      }
    })

    // 设置导航栏标题(动态绑定name状态变量)
    .title(this.name)

    // 可添加的其他导航配置
    .hideBackButton(false) // 显示返回按钮
  }
}

③配置页面参数关系

image

资源文件参数:

a、在resources/base/profile目录下新建json文件:

{
  "routerMap": [
    {
      "name": "Navigation2",
      "pageSourceFile": "src/main/ets/pages/Navigation2.ets",
      "buildFunction": "PageBuilder",
      "data": {
        "description": "this is pageOne"
      }
    }
  ]
}

b、module.json5文件“module”模块中加入:

"routerMap": "$profile:nav_map",

④跳转与参数的接收

跳转:参数是字符串/自定义复杂类型

@Provide('stack') stack: NavPathStack = new NavPathStack()
...
this.stack.pushPathByName('Navigation2', 参数, true)

接收:①通过NavDestinationContext上下文获取‘param’参数

@Consume('stack') stack: NavPathStack;
...
NavDestination() {}
    .onReady((context: NavDestinationContext) => {
        // 从导航上下文中获取传递的参数
        this.name = context.pathInfo.param as 类型;}

②通过NavPathStack接收

@Consume('stack') stack: NavPathStack;
...

NavDestination() {}
    .onReady(() => {

this.massge = this.stack.getParamByName('Navigation2')[0]

})

扩展:

除了使用路由配置文件进行跳转,Navigation还支持使用属性navDestination进行pageMap 跳转,无需创建 router_map.json 文件,重点集中在 @Builder 函数上(仅适用于一层跳转)。

根页面代码如下:

// 导入Page1Builder构建器
import {Page1Builder} from "./page1"

@Entry  
@Component
struct Index {
  @State message: string = 'Hello World1111';
  @Provide stack: NavPathStack = new NavPathStack()  // 提供导航路径栈实例,用于管理页面栈

  // 页面映射构建器,根据页面名称返回对应的页面组件
  @Builder
  pageMap(pageName: string) {
    if (pageName === 'page1') {
      // 如果页面名称是'page1',则返回Page1Builder构建的页面
      Page1Builder()
    }
    // 可以继续添加其他页面的判断...
  }

  build() {
    // 使用Navigation组件作为根布局
    Navigation(this.stack) {
      // 定义一个按钮,点击后跳转到page1页面
      Button(this.message)
        .onClick(() => {
          // 使用pushPathByName方法导航到名为'page1'的页面
          // 参数说明:
          // 第一个参数:目标页面名称
          // 第二个参数:可选,传递给目标页面的参数
          // 第三个参数:可选,导航模式
          this.stack.pushPathByName('page1', null, null)
        })
    }
    .height('100%')
    .width('100%')
    .navDestination(this.pageMap)  // 设置页面映射关系,将页面名称映射到实际组件
  }
}

子路由页面:

// 页面组件定义
@Component
struct Page {
  @State message: string = 'Hello World222';
  @Consume stack: NavPathStack  // 消费上层提供的导航栈实例

  build() {
    // 使用NavDestination作为页面容器
    NavDestination() {
      Button(this.message)
        .onClick(() => {
          // 调用导航栈的pop方法返回上一页
          this.stack.pop()
        })
    }
    .width('100%')
    .height('100%')
  }
}

// 页面构建器导出函数
@Builder export function Page1Builder() {
  // 返回Page组件实例
  Page()
}

未完待添加

posted on 2025-04-08 22:13  带头大哥d小弟  阅读(129)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3