鸿蒙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() { // ✅ 目标页面AImage($r('app.media.Coverpeople')).width(50).aspectRatio(1)// --------------------- 第二跳转入口 ---------------------NavRouter() { // ✅ 触发元素//第一个组件就是跳转的// --------------------- 第二跳转入口 ---------------------Text('我跳转啦') // ✅ 目标页面BNavDestination() {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修饰,方便跨组件使用)
 @ProvidenavPathStack: NavPathStack = new NavPathStack()
2.将创建的页面栈实例传递给主界面
  • ps:这一步还是蛮关键的,很多页面不展示就是这个原因
    Navigation(this.navPathStack) {Text('这是第一页-首页')Button('去下一页').onClick(() => {this.navPathStack.pushPath({name: 'pageOne'})})}.height('100%').width('100%')
3.通过 Builder 函数动态渲染路由目标
1. 先创建一个自定义Builder
  @BuildermyNavPathStackBuilder(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: NavPathStackbuild() {NavDestination() {Column({ space: 5 }) {Text('这是我从主页跳转的第一个界面').fontSize(24).fontWeight(500)Button('跳转到第二个页面去').onClick(() => {this.navPathStack.pushPath({name: 'pageTwo'})})}}}
}
@Component
struct Children02 {@ConsumenavPathStack: NavPathStackbuild() {NavDestination() {Column({ space: 5 }) {Text('这是我从主页跳转的第二个界面').fontSize(24).fontWeight(500)Button('跳转到第三个页面去').onClick(() => {this.navPathStack.pushPath({name: 'pageThree'})})}}}
}@Component
struct Children03 {@ConsumenavPathStack: NavPathStackbuild() {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 {@Statehobby: hobby[] = [] as hobby[]@ConsumenavPathStack: NavPathStackaboutToAppear(): 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.效果展示

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初阶数据结构(C语言实现)——4.1栈

目录 1.栈1.1栈的概念及结构1.2 栈的实现1.1.0 栈的初始化1.1.1 销毁1.1.2 入栈1.1.3 出栈1.1.4 获取栈中有效元素个数1.1.5 检测栈是否为空,如果为空返回非零结果,如果不为空返回01.1.6 获取栈顶元素1.1.7 验证 附录 栈的C语言实现源码.h文件.c文件test…

计算光学成像与光学计算概论

计算光学成像所涉及研究的内容非常广泛,虽然计算光学成像的研究内容是发散的,但目的都是一致的:如何让相机记录到客观实物更丰富的信息,延伸并扩展人眼的视觉感知。总的来说,计算光学成像现阶段已经取得了很多令人振奋…

什么样的物联网框架适合开展共享自助KTV唱歌项目?

现在物联网的广泛应用,也让更多用户们看到了它的实力,也使得共享经济遍地开花。其中共享自助唱歌设备也备受欢迎,那么适合开展共享自助KTV唱歌项目的物联网框架都应具备哪些特点呢? 智能化与自动化管理 物联网技术在共享KTV中的应…

机器视觉选型中,不同焦距的镜头成像视野有什么不同?

不同焦距的镜头成像视野的差异主要体现在视角范围和透视效果上。焦距越长,视角越窄,能捕捉的景物范围越小;焦距越短,视角越广,覆盖的景物范围越大。以下是具体分析: 焦距与视角的关系 焦距(Foc…

Linux16-数据库、HTML

数据库: 数据存储: 变量、数组、链表-------------》内存 :程序运行结束、掉电数据丢失 文件 : 外存:程序运行结束、掉电数据不丢失 数据库: …

开源订货系统哪个好 三大订货系统源码推荐

在数字化转型加速的今天,企业对订货系统的需求日益增长。一款优质的订货系统源码不仅能提升供应链效率,还能通过二次开发满足个性化业务需求。这里结合 “标准化、易扩展” 两大核心要求,为您精选三款主流订货系统源码,助您快速搭…

行为模式---迭代器模式

概念 迭代器模式是设计模式的行为模式,它的主要设计思想是提供一个可以操作聚合对象(容器或者复杂数据类型)表示(迭代器类)。通过迭代器类去访问操作聚合对象可以隐藏内部表示,也可以使客户端可以统一处理…

Maven的学习以及安装配置 2024/3/1 idea

1. Maven的安装 1.1 首先查看编程工具合适的Maven版本 我使用的是2024/3/1 版本的idea,接下来我会用这个版本的idea进行演示。idea没有汉化的也可以参考我的步骤。 1、打开idea的设置,搜索Maven,进入Maven设置。 我们可以看到,…

基于 Docker 的跨平台镜像构建与增量更新实战指南

引言:破解容器化两大核心问题 在实际开发中,我们常常面临两个棘手问题: 跨平台兼容性:如何在Windows平台开发的镜像,无缝运行在 ARM64 服务器?更新效率低下:每次代码调整都要重新安装全部依赖…

支付通道开通对接一般需要多少钱

不少老板都想开通AIP线上接口,但是不知道这个成本到底是多少? 其实目前第三方支付公司对外提供了标准的线上接入技术方案,一般以API、SDK等形式。因此,商户在完成签约审核后,可以顺利拿到技术的密钥,正常调用第三方支…

什么是 spring 的循环依赖?

什么是 spring 的循环依赖? 首先,认识一下什么是循环依赖,举个例子:A 对象被 Spring 管理,并且引入的 B 对象,同样的 B 对象也被 Spring 管理,并且也引入的 A 对象。这种相互被引用的情况&#…

thrift软件、.thrif文件和thrift协议是什么关系,有什么用

Thrift软件、.thrift文件和Thrift协议是Apache Thrift框架的三个核心组成部分,它们协同实现跨语言服务的高效开发与通信。以下是三者关系及作用的详细解析: 一、核心组件关系 1. Thrift软件(框架) • 定位:Apache Th…

STM32旋转编码器驱动详解:方向判断、卡死处理与代码分析 | 零基础入门STM32第四十八步

主题内容教学目的/扩展视频旋转编码器电路原理,跳线设置,结构分析。驱动程序与调用。熟悉电路和驱动程序。 师从洋桃电子,杜洋老师 📑文章目录 一、旋转编码器原理与驱动结构1.1 旋转编码器工作原理1.2 驱动程序结构 二、方向判断…

elementplus的cascader级联选择器在懒加载且多选时的一些问题分析

1. 背景 在之前做的一个项目中使用到了element的级联选择器,并且是需要懒加载、多选、父子不关联等等,在选的时候当然没问题,但是回显的时候就会回显不出来,相信大部分伙伴都遇到过这个问题。我在以前出过一篇文章写过关于级联选…

【Python运维】用Python自动化AWS资源管理:利用boto3实现高效管理S3桶和EC2实例

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着云计算的普及,AWS(Amazon Web Services)已经成为许多企业和开发者首选的云平台。为了提高工作效率,自动化管理AWS资源成为了一个热…

淘宝关键字搜索接口爬虫测试实战指南

在电商数据分析和市场研究中,通过关键字搜索获取淘宝商品信息是一项重要任务。淘宝开放平台提供了 item_search 接口,允许开发者通过关键字搜索商品,并获取商品列表及相关信息。本文将详细介绍如何设计并测试一个基于该接口的爬虫程序&#x…

【Linux实践系列】:用c语言实现一个shell外壳程序

🔥本文专栏:Linux Linux实践项目 🌸博主主页:努力努力再努力wz 那么今天我们就要进入Linux的实践环节,那么我们之前学习了进程控制相关的几个知识点,比如进程的终止以及进程的等待和进程的替换,…

⭐算法OJ⭐N-皇后问题 II【回溯剪枝】(C++实现)N-Queens II

⭐算法OJ⭐N-皇后问题【回溯剪枝】(C实现)N-Queens 问题描述 The n-queens puzzle is the problem of placing n n n queens on an n n n \times n nn chessboard such that no two queens attack each other. Given an integer n, return the num…

03.06 QT

一、使用QSlider设计一个进度条&#xff0c;并让其通过线程自己动起来 程序代码&#xff1a; <1> Widget.h: #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QThread> #include "mythread.h"QT_BEGIN_NAMESPACE namespace Ui {…

Spring WebFlux 中 WebSocket 使用 DataBuffer 的注意事项

以下是修改后的完整文档&#xff0c;包含在多个多线程环境中使用 retain() 和 release() 方法的示例&#xff0c;且确保在 finally 块中调用 release()&#xff1a; 在 Spring WebFlux 中&#xff0c;WebSocketMessage 主要用于表示 WebSocket 的消息载体&#xff0c;其中 getP…