【鸿蒙ArkUI路由/导航系列】二:Navigation基础路由操作,让页面跳转起来

【HarmonyOS】初识ArkUI——快速实现页面导航之Navigation 关于基本概念就不再多做介绍了,有需要的直接点击上面的链接进行了解即可,我们直接进入正题。HarmonyOS、ArkUI、Navigation、自定义导航栏、底部导航。OK,本期内容就到这里啦,下期再会! 阅读详情

在这篇文章中,将逐步的介绍,如何通过Navigation进行页面间的切换。

1、页面跳转的准备工作

首先,开发者需要创建一个NavPathStack对象并作为构造入参传给Navigation组件,以实现二者的绑定,后续的路由操作均基于该NavPathStack展开。

// BasicNavigation.ets

@Component
struct BasicNavigation {
  stack: NavPathStack = new NavPathStack()

  build() {
    // 将导航控制器NavPathStack 绑定至Navigation中。
    Navigation(this.stack) {
        // Navigation作为路由根容器,可以不显示任何内容
    }
  }
}

此时我们已经构建好了一个Navigation根容器并绑定了导航控制器NavPathStack,接下来我们需要构建显示的页面。

Step1、构建子页面

为每个NavDestination声明对外的实例化方法,如代码中的PageOneBuilder,执行该方法会创建一个BasicNavDestination的自定义组件,该组件就是一个Navigation的子页面。

// BasicNavDest.ets

// 组件实例化方法,该方法会创建BasicNavDestination自定义组件作为Navigation的页面
@Builder
export function PageOneBuilder() {
  BasicNavDestination({
    name: 'pageOne'
  });
}

// NavDestination组件
@Component
struct BasicNavDestination {
  name: string = 'NA'

  build() {
    NavDestination() {
        // 页面中的内容
    }
  }
}

Step2、配置Navigation路由表

将步骤一中写好的实例化方法与它的name(开发者自定义)写在路由表的配置文件中(entry/src/main/resources/base/profile/route_map.json开发者自行创建)。

// entry/src/main/resources/base/profile/route_map.json
{
  "routerMap": [
    {
      "name": "basicPageOne", // 路由页面的唯一标识符
      "pageSourceFile": "src/main/ets/pages/BasicFeature/BasicNavDest.ets", // 源码所在地址
      "buildFunction": "PageOneBuilder", // 页面的实例化方法名称
    },
  ]
}

Step3、使能Navigation路由表

将步骤二中创建的route_map.json配置为系统路由表。开发者需要在当前模块的module.json5中,为“module”的内容新增一个配置项,例如:

{
  "module": {
    "name": "entry",
    "type": "entry",
    "description": "$string:module_desc",
    "mainElement": "EntryAbility",
    "deviceTypes": [
      "phone"
    ],
    "pages": "$profile:main_pages",
    "routerMap": "$profile:route_map", // 新增这一行,使能路由表
    "abilities": [...]
  }
}

2、NavPathStack的获取

Navigation根容器和子页面以及路由表配置完成后,即可通过调用NavPathStack的api来实现页面之间的跳转。以下通过按钮点击来触发路由操作:

Button('跳转到basicPageOne')
  .width(330)
  .margin(7)
  .onClick(() => {
    this.stack.pushPath({name: 'basicPageOne'})
  })

对于没有分栏诉求的应用,推荐将Navigation的导航栏NavBar隐藏,基于NavDestination组件进行所有页面功能的开发,例如:

// BasicNavigation.ets

@Component
struct BasicNavigation {
  stack: NavPathStack = new NavPathStack()

  aboutToAppear(): void {
    // 2.将basicPageOne作为Navigation的首页显示
    this.stack.pushPath({name: 'basicPageOne'})
  }

  build() {
    Navigation(this.stack) {
        // Navigation作为路由根容器,可以不显示任何内容
    }
    // 1. 将Navigation导航栏NavBar进行隐藏
    .hideNavBar(true)
  }
}

这样一来,所有的操作均会基于NavDestination组件展开,开发者可以将导航控制器对象NavPathStack存在全局的AppStorage中,方便后续在其他NavDestination中的路由控制:

// BasicNavigation.ets

@Component
struct BasicNavigation {
  stack: NavPathStack = new NavPathStack()

  aboutToAppear(): void {
    // 1.将当前导航控制器对象存储至AppStorage中,可以在同应用内的任意地方获取
    AppStorage.setOrCreate<NavPathStack>('basicNavigationStack', this.stack)
    this.stack.pushPath({name: 'basicPageOne'})
  }

  build() {
    Navigation(this.stack) {
       // Navigation作为路由根容器,可以不显示任何内容
    }
    .hideNavBar(true)
  }
}
// BasicNavDest.ets

@Component
struct BasicNavDestination {
  name: string = 'NA'
  // 2.在Navdestination中获取导航控制器
  stack: NavPathStack = AppStorage.get<NavPathStack>('basicNavigationStack')!

  build() {
    NavDestination() {
        // 页面内容 
    }   
  }
}

此外,还有其他的获取NavPathStack的方式,参见系列后续章节。

3、路由操作方法

navigation框架有三种主要的路由操作:push、pop、replace,下文会分别介绍。

3.1 Push

push操作用以创建一个新的页面视图。主要分为两种,带有异步返回结果的pushDestination和不带返回结果的pushPath。

如果push过程发生了错误,pushPath会跳转到一个空白的页面,pushDestination则会将该错误携带错误码返回给开发者。相应的,如果跳转成功,pushDestination会将成功的结果返回给开发者。示例如下:

// BasicNavDest.ets

Button('pushDestination跳转basicPageOne')
  .width(330)
  .margin(7)
  .onClick(() => {
    // pushDestination会带有异步结果返回
    this.stack.pushDestination({name: 'basicPageOne'})
      .then(() => {
        // .then分支表明本次跳转成功,没有发生错误
        console.log('AceNavigation', 'pushDestination跳转basicPageOne', 'success!')
      })
      .catch((err: Object) => {
        // .catch分支表明本次跳转失败,错误信息包含在入参err中
        console.log('AceNavigation', 'pushDestination跳转basicPageOne', 'failed!')
        console.log('AceNavigation', '-- err info: ' + JSON.stringify(err))
      })
  })
Button('pushPath跳转basicPageOne')
  .width(330)
  .margin(7)
  .onClick(() => {
    // pushPath不带有返回结果
    this.stack.pushPath({name: 'basicPageOne'})
  })

除了是否返回结果外,pushPath与pushDestination在用法上没有区别。开发者还可以通过传入NavigationOptions参数来控制本次push的行为,例如,实现一个单实例跳转、无动画跳转:

// BasicNavDest.ets

Button('单实例、无动画跳转basicPageOne')
  .width(330)
  .margin(7)
  .onClick(() => {
    // 指定launchMode为MOVE_TO_TOP_SINGLETON,会复用Index最大的同名页面;指定animated为false则会禁用本次跳转的动画。
    this.stack.pushPath({name: 'basicPageOne'}, {launchMode: LaunchMode.MOVE_TO_TOP_SINGLETON, animated: false})
  })

3.2 Pop

pop操作用以删除Navigation导航栈顶页面,可以传入参数来控制是否禁用动画。例如:

// BasicNavDest.ets

Button('Pop有动画pop')
  .width(330)
  .margin(7)
  .onClick(() => {
    // 接口无参数传递时默认有动画
    this.stack.pop()
  })
Button('Pop无动画pop')
  .width(330)
  .margin(7)
  .onClick(() => {
    // 传递animated参数为false时,本次操作会禁用动画
    this.stack.pop(false)
  })
  

3.3 Replace

replace操作会用一个新的页面替换当前NavPathStack栈顶页面,如下示例:

// BasicNavDest.ets

Button('replace跳转basicPageOne')
  .width(330)
  .margin(7)
  .onClick(() => {
    // 使用basicPageOne替换当前栈顶页面
    this.stack.replacePath({name: 'basicPageOne'})
  })
Button('replace跳转basicPageTwo')
  .width(330)
  .margin(7)
  .onClick(() => {
    // 使用basicPageTwo替换当前栈顶页面。basicPageTwo上文示例中没有创建,请参照basicPageOne自行实现。
    this.stack.replacePath({name: 'basicPageTwo'})
  })

2.1.3章节的动画示例分别如下(push&&pop、replace):

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Navigation组件 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Navigation组件。 阅读详情

相关推荐

HarmonyOS 鸿蒙 ArkTS ArkUI 页面之间切换转换动画设置

HarmonyOS 鸿蒙 ArkTS ArkUI 页面之间切换转换动画设置

特创数字 2843

HarmonyOS ArkUI实战开发-页面跳转(Router、Ability)

页面跳转可以分为页面内跳转和页面间跳转,页面内跳转是指所跳转的页面在同一个 Ability 内部,它们之间的跳转可以使用 Router 或者 Navigator 的方式;页面间跳转是指所跳转的页面属与不同的 Ability ,这种跳转需要借助 featureAbility 实现,跳转示意图如下所示:

1 2625

鸿蒙开发基础 —— ArkUI 组件:Router切换Navigation

从API version 12版本开始,Navigation支持系统跨模块的路由表方案,整体设计是将路由表方案下沉到系统中管理,即在需要路由的各个业务模块(HSP/HAR)中独立配置router_map.json文件,在触发路由跳转时,应用只需要通过NavPathStack进行路由跳转,此时系统会自动完成路由模块的动态加载、组件构建,并完成路由跳转功能,从而实现了开发层面的模块解耦。Router原生没有提供路由拦截的能力,开发者需要自行封装路由跳转接口,并在自己封装的接口中做路由拦截的判断并重定向路由。

guangxishaoji的博客 1243

ArkUI-Navigation

Navigation通过事件提供自定义转场动画的能力。构建一个自定义转场动画工具类,通过map管理各个页面自定义动画对象,页面创建的时候注册自定义转场动画,页面销毁的时候解注册。实现一个转场协议对象NavigationAnimatedTransition,其中timeout属性表示转场结束的超时时间,默认为1000ms,transition属性为自定义的转场动画方法,开发者要在这里实现自己的转场动画逻辑,系统会在转场开始时调用该方法,onTransitionEnd为转场结束时的回调。

gitzzp的博客 2042

ArkUI中的Navigation全面解析:构建高效导航体系(一)

本文介绍了鸿蒙开发中自定义Navigation组件的关键功能。Navigation作为路由导航的根视图容器,支持单栏、分栏和自适应三种显示模式,可根据屏幕宽度自动切换布局。文章详细讲解了标题栏样式设置(Mini/Full/Free模式)、菜单栏和工具栏配置方法,以及基于NavPathStack的路由操作,包括页面跳转、返回、替换、删除等核心功能。此外还介绍了参数获取、路由拦截和单例跳转等高级特性,帮助开发者实现灵活的路由管理和页面复用。所有代码示例均在DevEco Studio 5.1.1上验证通过。

我叫柱子哥 1126

鸿蒙开发基础 —— ArkUI 组件:页面路由 (@ohos.router)(不推荐)

自定义询问框的方式,可以使用弹窗 promptAction.showDialog 或者自定义弹窗实现。这样可以让应用界面与系统默认询问框有所区别,提高应用的用户体验度。本文以弹窗为例,介绍如何实现自定义询问框。在使用页面路由Router相关功能之前,需要在代码中先导入Router模块。// 弹出自定义的询问框message: '您还没有完成支付,确定要返回吗?',buttons: [text: '取消',},text: '确认',// 用户点击了“取消”按钮。

guangxishaoji的博客 895

【鸿蒙ArkUI路由/导航系列】〇:ArkUI Navigation组件全面解析:从基础导航到高级路由的实践

【鸿蒙ArkUI路由/导航系列】一:ArkUI路由原理简介,认识Navigation组件详细阐述了Navigation作为导航容器的角色,支持全局及局部导航,并具有单栏(Stack)、分栏(Split)及自适应(Auto)三种显示模式。Navigation组件由导航栏(NavBar)和子页(NavDestination)构成,通过NavPathStack管理子页切换。文章还介绍了Navigation的高级特性,如自定义转场动画、路由拦截及生命周期管理,为开发者提供了全面的Navigation组件使用指南。

Alan_rust的博客 2296

鸿蒙OpenHarmony【组件导航 (Navigation)】 ArkUI

组件导航(Navigation)主要用于实现页面间以及组件内部的页面跳转,支持在不同组件间传递跳转参数,提供灵活的跳转栈操作,从而更便捷地实现对不同页面的访问和复用。本文将从组件导航(Navigation)的显示模式、路由操作、子页面管理、跨包跳转以及跳转动效等几个方面进行详细介绍。

adsjgfjha123123的博客 1504

ArkUI设置组件导航和页面路由

Navigation通过customNavContentTransition事件提供自定义转场动画的能力,通过如下三步可以定义一个自定义的转场动画。构建一个自定义转场动画工具类CustomNavigationUtils,通过一个Map管理各个页面自定义动画对象CustomTransition,页面在创建的时候将自己的自定义转场动画对象注册进去,销毁的时候解注册;

W20240618_优快云的博客 2652

HarmonyOS-ArkUI Navigation (导航组件)-第一部分

Row(){Text('菜单1')Text('菜单2')Text('菜单3')Text('菜单4')Text('菜单5')build() {Column(){.margin({top: 20,})})//设置为分栏模式//设置顶部标题.title("主标题")// 设置顶部菜单栏//设置底部工具栏。

童年纸飞机的博客 1488

鸿蒙开发基础 —— ArkUI 组件:组件导航 (Navigation)(推荐)

Navigation通过 customNavContentTransition 事件提供自定义转场动画的能力,通过如下三步可以定义一个自定义的转场动画。构建一个自定义转场动画工具类CustomNavigationUtils,通过一个Map管理各个页面自定义动画对象CustomTransition,页面在创建的时候将自己的自定义转场动画对象注册进去,销毁的时候解注册;

guangxishaoji的博客 1047

HarmonyOS基础:鸿蒙系统组件导航Navigation

鸿蒙导航组件Navigation导航

康宝的博客 2007

【鸿蒙基于API 13实战开发】—— ArkUI 组件:Router切换Navigation

从ArkUI组件树层级上来看,原先由Router管理的page在页面栈管理节点stage的下面。Navigation作为导航容器组件,可以挂载在单个page节点下,

shangkangba的博客 1226

HarmonyOS笔记5:ArkUI框架的Navigation导航组件

在移动应用中需要在不同的页面进行切换跳转。这种切换和跳转有两种方式:页面路由和Navigation组件实现导航。HarmonyOS推荐使用Navigation实现页面跳转。在本文简单介绍ArkUI框架的Navigation导航组件。

userhu2012的博客 1802

自监督学习与上下文赌博机融合:视觉决策中的协同优化与实战指南

在机器学习领域,自监督学习(Self-Supervised Learning)通过设计前置任务从无标注数据中学习通用表征,已成为解决标注数据稀缺问题的关键技术。其核心原理是利用数据自身的结构生成监督信号,训练编码器提取鲁棒特征。上下文赌博机(Contextual Bandits)作为强化学习的简化分支,专注于在给定上下文信息下做出单步最优决策,平衡探索与利用,广泛应用于推荐系统、广告投放等场景。将两者结合,构建端到端的协同训练框架,能让视觉表征的优化直接服务于最终的决策目标,同时利用自监督任务作为正则化项提

weixin_33721344的博客 520

word 2013 长篇文档排版案例教程

office 2013 制作长文格式模板

1万+

【鸿蒙ArkUI路由/导航系列】一:ArkUI路由原理简介,认识Navigation组件

本文介绍了华为鸿蒙系统中的Navigation导航容器及其相关组件。Navigation作为路由导航的根视图容器,支持单栏、分栏和自适应三种显示模式,通过NavPathStack控制器管理子页面栈。系统包含三个核心组件:1)Navigation导航容器,作为全局或局部导航使用;2)NavBar导航栏,可控制显隐和布局;3)NavDestination子页容器,支持页面生命周期、转场动画等功能。三者协同工作,通过NavPathStack实现路由切换、页面管理等功能,支持开发者在不同场景下灵活构建导航架构。

Alan_rust的博客 1019

Windows平台高效BLE调试工具开发指南

本文为开发者提供了一份在Windows平台上开发高效BLE调试工具的详细指南。文章深入探讨了使用32feet.NET库进行蓝牙低功耗设备扫描、连接、数据通信及进阶功能开发的实战经验,旨在帮助开发者打造功能自定义、性能优化的专属调试利器,显著提升物联网和嵌入式设备的调试效率。

weixin_29201933的博客 256

HarmonyOS7 页面导航:Navigation 组件比 Router 好在哪?我用了才知道

项目刚启动的时候,页面导航我直接用了,毕竟 API 简单,三行代码搞定跳转。等到页面多了要加底部 Tab、要传参、要做登录拦截……才发现 Router 根本撑不住这些需求,改得我怀疑人生。Router 不是不能用,是用了之后路越走越窄。后来全面切到 Navigation 组件,才知道什么叫"专业的事交给专业的工具"。今天把这两种方案掰开了对比,帮你少走弯路。Router 适合页面极少、不需要导航栏、不需要拦截的简单场景。但凡你的项目有点规模,Navigation 就是更好的选择。

qq_37048082的博客 3132

linux上使用tun/tap设备模拟一个虚拟网卡,并将该虚拟网卡连接到新创建的网桥上

tun/tap设备是操作系统内核中的虚拟网络设备,是用软件模拟的网络设备,提供与硬件网络设备完全相同的功能。主要用于用户空间和内核空间传递报文。tun/tap对于硬件网络设备而言,一端连接的是物理网络,一端连接的是网络协议栈。对于tun/tap设备而言,一端连接的是应用程序(通过 字符设备文件),一端连接的是网络协议栈。

糖果墙的博客 6411

OpenHarmony实战开发-如何实现文件分布式同步编辑

在分布式文件场景中,分布式设备管理包含了分布式设备搜索、分布式设备列表弹窗、远端设备拉起三部分。首先在分布式组网内搜索设备,然后把设备展示到分布式设备列表弹窗中,最后根据用户的选择拉起远端设备。两台设备组网的分布式场景是工作中常常需要的。这样的分布式场景有助于加快工作效率,减少工作中的冗余,本例将为大家介绍如何实现上述功能。​ (2)订阅分布式数据变化:通过this.distributedObject.on(‘status’, this.statusCallback)监听分布式数据对象的变更。

2401_82546228的博客 751

鸿蒙UI(ArkUI-方舟UI框架)- 设置组件导航和页面路由

组件导航(Navigation)和页面路由(@ohos.router)均支持应用内的页面跳转,但组件导航支持在组件内部进行跳转,使用更灵活。组件导航具备更强的一次开发多端部署能力,可以进行更加灵活的页面栈操作,同时支持更丰富的动效和生命周期。因此,推荐使用组件导航(Navigation)来实现页面跳转以及组件内的跳转,以获得更佳的使用体验。具体示例代码可以参考Navigation自定义转场示例。

xianKOG的博客 1952

UE5实战:如何用Georeference插件搞定百度地图坐标转换(附完整代码)

本文详细解析了在UE5中使用Georeference插件实现百度地图坐标转换的全流程,包括BD-09到UE内部坐标的转换算法、UTM投影配置及性能优化技巧。通过完整代码示例和实战案例,帮助开发者高效解决数字孪生项目中的地理坐标转换难题。

weixin_30955617的博客 94

【鸿蒙ArkUI路由/导航系列】十二:Navigation路由拦截

摘要: 本文介绍了HarmonyOS中Navigation组件的路由拦截功能,通过setInterception回调实现跳转逻辑的灵活控制,无需修改原始路由代码。以电商App为例,未登录用户访问支付页时,通过willShow拦截跳转至登录页,登录后自动返回原页面,避免重复代码和模块耦合。示例代码展示了主页面、产品页、支付页和登录页的联动实现,包括全局登录状态管理(AppStorage)和路由信息传递。该方案提升了开发效率,降低了维护成本,适用于需权限校验的复杂路由场景。(150字) 关键词: Harmony

Alan_rust的博客 823

【Photoshop JSX脚本】强大的事件监听器脚本 - event_listener.jsx

新手第一次了解的事件监听一定是ScriptingListener.8bi插件,如果你对此插件有了基本运用,那么现在了解一款更方便的时间监听脚本event_listener.jsx。不再像ScriptingListener.8bi插件那样晦涩难懂。 1、准备event_listener.jsx文件到 F:\Program Files\Adobe Photoshop 2020\Presets\...

Greless的后花园 8207

IsaacLab从入门到精通(二) 导入自定义机器人

IsaacLab系列第二讲,导入自定义的机器人及设置

DejaWu33的博客 8466
上一篇: 【鸿蒙ArkUI路由/导航系列】一:ArkUI路由原理简介,认识Navigation组件
下一篇: 【鸿蒙ArkUI路由/导航系列】三:NavDestination标题栏和工具栏,丰富页面信息
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值