鸿蒙HarmonyOS-Navagation基本用法

Navagation基本用法

Navigation组件是路由导航的根视图容器,一般作为Page页面的根容器使用,其内部默认包含了标题栏,内容栏和公工具栏,其中内容区默认首页显示导航内容(Navigation的子组件)或非首页显示(NavDestination的子组件),首页和非首页通过路由进行切换

  • 使用Navigation跳转的组件不需要再使用Entry来修饰,普通组件即可
  • Navigation是一个导航组件,API9和API11的使用官方推荐方式各不相同

1. Navagation API9的用法-(Navigation-NavRouter-(其他组件+NavDestination的用法))

1. 1导航组件层次关系

组件作用层级规则
Navigation管理所有导航页面的根容器必须包含多个 NavRouter
NavRouter定义一个跳转入口必须配对 NavDestination
NavDestination目标页面内容

**1. **2 按钮覆盖问题

  • 代码现象跳转B 覆盖 跳转A
  • 根本原因
    NavRouter 内部放置多个直接同级组件时,仅最后一个组件会被渲染。
  • ArkUI规则
    一个 NavRouter 只能关联 一个触发元素 (如Button),如需多个跳转需使用多个 NavRouter

1.3 代码案例

@Entry
@Component
struct TestNavgationAPI9 {
  build() {

    Navigation() {
      // --------------------- 第一跳转入口 ---------------------
      NavRouter() { // ✅ 触发元素
        Button('跳转A')
        Button('跳转B') //放置的第二个界面会覆盖第一个
        //要跳转的界面
        NavDestination() { // ✅ 目标页面A
          Image($r('app.media.Coverpeople'))
            .width(50)
            .aspectRatio(1)
          // --------------------- 第二跳转入口 ---------------------
          NavRouter() { // ✅ 触发元素
            //第一个组件就是跳转的
            // --------------------- 第二跳转入口 ---------------------
            Text('我跳转啦') // ✅ 目标页面B
            NavDestination() {
              Text('第三个界面') // ✅ 目标页面C
            }

          }

        }

      }

    }
    .height('100%')
    .width('100%')
  }
}

1.4 效果展示

img

2.Navagation 10的用法

2.1 路由栈自主管理

  • NavPathStack

    核心方法:

    pushPath()    // 压入新页面(保留前页)
    replacePath() // 替换当前页面(销毁前页) 
    pop()         // 回到上一页
    

2.2 页面加载控制

  • navDestination(builder)
    通过 Builder 函数动态渲染路由目标:
  • 函数动态渲染路由目标:
.navDestination(this.navDesBuilder) // 动态路由映射
@Builder
navDesBuilder(name: string) {
  if (name === "pageTwo") {
    NavgationChild02() // 根据 name 组装对应页面
  }
}

2.3 跨组件通信

  • @Provide@Consume 装饰器

    // 父级定义提供值
    @Provide navPathStack: NavPathStack = new NavPathStack()
    // 子组件自动获取
    @Consume navPathStack: NavPathStack
    

    无需显式传递,自动向下注入。

2.4 实现步骤

1. 自己管理页面栈 创建一个页面栈 (用@Provide修饰,方便跨组件使用)
 @Provide
  navPathStack: NavPathStack = new NavPathStack()
2.将创建的页面栈实例传递给主界面
  • ps:这一步还是蛮关键的,很多页面不展示就是这个原因
    Navigation(this.navPathStack) {
      Text('这是第一页-首页')
      Button('去下一页')
        .onClick(() => {
          this.navPathStack.pushPath({
            name: 'pageOne'
          })
        })

    }
    .height('100%')
    .width('100%')
3.通过 Builder 函数动态渲染路由目标
1. 先创建一个自定义Builder
  @Builder
  myNavPathStackBuilder(name: string) {
      //根据传入的名字区渲染对应的页面
    if (name === 'pageOne') {
      Children01()

    } else if (name === 'pageTwo') {
      Children02()

    } else if (name === 'pageThree') {
      Children03()

    }
  }

2. 传入Builder
 .navDestination(this.navDesBuilder)
  • 不需要加括号,这里有个底层原因

    1. ArkUI 的 navDestination 机制
    • 设计逻辑:框架需要在导航时动态调用构建函数生成页面。若传递this.navDesBuilder()则:
      • 代码执行时立即运行该函数(而非按需调用)
      • 返回结果可能为 void 或非组件类型,导致渲染异常
    1. @Builder 函数的特性
    • 延迟执行@Builder 定义的 UI 编译时会转为独立闭包代码块

    • 调用时机:由 导航框架 在需要时(如pushPath)根据name参数触发构建

      this.navPathStack.pushPath({ name: 'pageTwo' });
      // ▶️ 此时 ArkUI 内部通过 `.navDestination` 关联的 Builder 按需执行
      
3.跳转的实现
  1. 通过点击事件调用当前navPathStack实例pushPath方法
  2. 传入你要跳转页面的名字,进行跳转
 Button('去下一页')
        .onClick(() => {
          this.navPathStack.pushPath({
            name: 'pageOne'
          })
        })
4.子界面的定义
@Component
struct Children01 {
    //接收主界面传递过来的页面栈
  @Consume navPathStack: NavPathStack
  build() {
    NavDestination() {
      Column({ space: 5 }) {
        Text('这是我从主页跳转的第一个界面')
          .fontSize(24)
          .fontWeight(500)
        Button('跳转到第二个页面去')
          .onClick(() => {
            this.navPathStack.pushPath({
              name: 'pageTwo'
            })
          })
      }
    }

  }
}
@Component
struct Children02 {
  @Consume
  navPathStack: NavPathStack

  build() {
    NavDestination() {
      Column({ space: 5 }) {
        Text('这是我从主页跳转的第二个界面')
          .fontSize(24)
          .fontWeight(500)
        Button('跳转到第三个页面去')
          .onClick(() => {
            this.navPathStack.pushPath({
              name: 'pageThree'
            })
          })
      }
    }

  }
}

@Component
struct Children03 {
  @Consume
  navPathStack: NavPathStack

  build() {
    NavDestination() {
      Column() {
        Text('这是我从主页跳转的第三个界面')
          .fontSize(24)
          .fontWeight(500)
      }

    }

  }
}
5.效果展示

img

3.NavagationAPI10使用的补充内容

3.1 常见的API

配置组合代码示例效果描述
默认状态Navigation() .title('主标题')标题栏显示 “主标题”,采用 Free 模式
精简模式+隐藏标题Navigation() .titleMode(NavigationTitleMode.Mini) .hideTitleBar(true)标题栏完全不可见
子页面独立配置NavDestination() .title('子页标题') .hideTitleBar(true)

3.2 传参获取参数的实现

1.定义数据结构
interface hobby {
  name: string,
  hobby: string
}
2.即将跳转页面传入参数
   NavDestination() {
      Column({ space: 5 }) {
        Text('这是我从主页跳转的第二个界面')
          .fontSize(24)
          .fontWeight(500)
        Button('跳转到第三个页面去')
          .onClick(() => {
            this.navPathStack.pushPath({
              name: 'pageThree',
              param: { name: '猫猫球', hobby: '喜欢玩毛线球' } as hobby
            })
          })
      }
    }
3.跳转的页面接收数据
@Component
struct Children03 {
  @State
  hobby: hobby[] = [] as hobby[]
  @Consume
  navPathStack: NavPathStack

  aboutToAppear(): void {
    this.hobby = this.navPathStack.getParamByName('pageThree') as hobby[]
    promptAction.showToast({
      message: JSON.stringify(this.hobby)
    })
  }

  build() {
    NavDestination() {
      Column() {
        Text('这是我从主页跳转的第三个界面')
        Text('这是我获取的数据')
        Text(this.hobby[0].name)
        Text(this.hobby[0].hobby)
          .fontWeight(500)
      }

    }

  }
}
4.效果展示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/981897.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

相控阵扫盲

下图展示天线增益 在仰角为0度的情况下随着方位角的变化而变化。需要注意到的是在天线视轴方向上的高增益主瓣上还有几个低增益旁瓣 阵列因子乘以新的阵元方向图会形成指向性更强的波速

CDefView::_OnFSNotify函数分析

进入CDefView::_OnFSNotify函数时状态栏 _UpdateStatusBar函数之后增加一个对象,变成7个对象。 LRESULT CDefView::_OnFSNotify(LONG lNotification, LPCITEMIDLIST* ppidl) { LPITEMIDLIST pidl; LPCITEMIDLIST pidlItem; // we may be registered for no…

人工智能之数学基础:矩阵的秩

本文重点 矩阵的秩,作为矩阵理论中的一个核心概念,是连接矩阵性质与应用的重要桥梁。本文我们将学习矩阵秩的概念,通过矩阵的秩可以判断矩阵是否可逆等等,所以矩阵的秩是非常重要的一个概念。 矩阵秩的概念 秩定义为矩阵A的线性独立的行(或列)的最大数目。也就是说,如…

告别GitHub连不上!一分钟快速访问方案

一、当GitHub抽风时,你是否也这样崩溃过? 😡 npm install卡在node-sass半小时不动😭 git clone到90%突然fatal: early EOF🤬 改了半天hosts文件,第二天又失效了... 根本原因:传统代理需要复杂…

安装微软最新原版系统,配置好系统驱动并保留OOBE全新体验

记录一种安装原版系统,并在用户使用前安装好所有驱动,以及配置好网络和工作环境,但不影响用户全新体验的方法。 前言 有的时候我们可能会遇到这样一种情况: 需要给别人安装一个微软官网正版的全新系统,用户开机要有OO…

《导游职业资格考试:巧用答题技巧,实现分数飞跃》

《导游职业资格考试:巧用答题技巧,实现分数飞跃》 在导游职业资格考试中,掌握答题技巧能显著提升成绩。选择题方面,运用排除法是关键。对于考查导游基础知识的题目,如果选项中出现与历史事实不符、地理常识错误等明显…

嵌入式L6计算机网络

Telnet不加密 socket是应用层和下面的内核

C++、C#、python调用OpenCV进行图像处理耗时对比

C、C#、python调用OpenCV进行图像处理耗时对比 一、前言二、环境介绍三、耗时对比3.1读写jpg、bmp图片耗时对比3.2灰度化、阈值分割、膨胀腐蚀耗时对比 附录(1)imread函数以不同模式读取图片(2)OpenCV读取图片格式与PIL读取图片格…

【ubuntu20】--- 搭建 gerrit 最新最详细

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。 【ubuntu20】--- 搭建 gerrit 最新最详细…

制服小程序的“滑手”:禁用页面左右滑动全攻略

哈哈,看来你已经很聪明地发现了小程序中左右滑动的“顽皮”行为!😄 没错,我们可以通过设置 disableScroll 属性来“管教”它,同时结合 CSS 样式让页面既禁得住横向“乱跑”,又能顺畅地上下滚动。你的方案已…

ASP .NET Core 学习(.NET9)Serilog日志整合

Serilog 是一个功能强大的 .NET 日志库,以其简洁的配置和灵活的输出方式而受到开发者喜爱。支持多种日志输出目标(如控制台、文件、数据库等),并且可以通过结构化日志的方式记录丰富的上下文信息,便于后续的日志分析和…

**NET400协议网关全系型号:多场景·全兼容工业物联解决方案**

行业痛点 工业现场需适配多样场景、差异化PLC协议、弹性扩展需求: 单一型号无法覆盖小规模车间到大型工厂的复杂组网;老旧系统升级需硬件兼容与数据平滑迁移;设备点位从数十到上千,需灵活选型控制成本。 NET400系列部分型号 按…

excel vlookup的精确查询、模糊查询、反向查询、多列查询

目录 入门 精确查询 模糊查询 反向查询 (搭配 if 函数) 多列查询 (搭配 match 函数) 入门 精确查询 需求: 查找 学生编号是008 所在的班级 操作: 在I2单元格输入公式如下,VLOOKUP(H2,B1:E12,4,FALSE), 得出结果 看一下vlookup 公式每一个参数应该怎么写? 语法: vlookup…

计算机组成原理:计算机系统层次结构

文章目录 计算机系统的组成计算机硬件冯诺依曼计算机主要特点 组成部分冯诺依曼计算机结构现代计算机结构 计算机软件计算机程序语言的发展 软件和硬件功能的逻辑等价性计算机系统的层次结构 计算机系统的组成 硬件系统和软件系统共同构成了一个完整的计算机系统。 硬件是指有…

探秘基带算法:从原理到5G时代的通信变革【二】Viterbi解码

文章目录 二、关键算法原理剖析2.1 Viterbi 解码2.1.1 卷积码与网格图基础**卷积码****网格图****生成多项式****理想情况下解码过程** 2.1.2 Viterbi 算法核心思想2.1.3 路径度量与状态转移机制2.1.4 算法流程与关键步骤详解2.1.5 译码算法举例与复杂度分析2.1.6 算法代码示例…

uniapp对接打印机和电子秤

uniapp对接打印机和电子秤 连接电子秤和打印机,最难的不是连接蓝牙和电子成,而是打印机。因为打印机涉及到向打印机写数据操作,然后这个写的数据需要做一个编码转换。难就难在编码转换。如果是java那就是一句代码的事情,而js就没有…

Java-实现PDF合同模板填写内容并导出PDF文件

可用于公司用户合同导出pdf文件 效果图 一、导入所需要jar包 <!--生成PDF--><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.11</version></dependency><dependency&…

如何排查服务器内存泄漏问题

服务器内存泄漏是一种常见的问题&#xff0c;可能导致系统性能下降甚至系统崩溃。以下是一般情况下用于排查服务器内存泄漏问题的步骤&#xff1a; 排查服务器内存泄漏问题的步骤&#xff1a; 监控系统资源&#xff1a; 使用系统监控工具&#xff08;如top、htop、free&#x…

Tampermonkey篡改猴官网,油猴脚本插件电脑版入口(含教程)

Tampermonkey&#xff08;篡改猴&#xff09;是一款功能强大的浏览器扩展工具&#xff0c;自2010年发布以来&#xff0c;已成为全球超过1000万用户的首选脚本管理器。它通过运行用户自定义的JavaScript脚本&#xff0c;赋予用户深度定制网页的能力&#xff0c;涵盖广告拦截、界…

Java高频面试之集合-03

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;说说ArrayList和LinkedList的区别 ArrayList 与 LinkedList 的详细对比 一、底层数据结构 特性ArrayListLinkedList存…