HarmonyOS 5.0应用开发——Navigation实现页面路由

【高心星出品】

文章目录

      • Navigation实现页面路由
        • 完整的Navigation
          • 入口页面
          • 子页面
        • 页面跳转
        • 路由拦截
        • 其他的

Navigation实现页面路由

Navigation:路由导航的根视图容器,一般作为页面(@Entry)的根容器去使用,包括单页面(stack)、分栏(split)和自适应(auto)三种显示模式。Navigation组件适用于模块内和跨模块的路由切换,通过组件级路由能力实现更加自然流畅的转场体验,并提供多种标题栏样式来呈现更好的标题和内容联动效果。一次开发,多端部署场景下,Navigation组件能够自动适配窗口显示大小,在窗口较大的场景下自动切换分栏展示效果。

在这里插入图片描述

  1. Title:标题栏,通过title属性对标题栏进行设置。通过menus配置菜单
  2. NavContent:内容区域,默认首页显示导航内容(Navigation的子组件)或非首页显示(NavDestination的子组件),首页和非首页通过路由进行切换。
  3. ToolBar:工具栏,通过toolbarConfiguration实现对工具栏的配置,如果不配置此属性,ToolBar不显示。竖屏最多支持显示5个图标,多余的图标会被放入自动生成的更多图标。
  4. NavDestination:作为子页面的根容器,用于显示Navigation的内容区。具备两种类型:STANDARD(标准类型,NavDestination的生命周期跟随NavPathStack栈中标准NavDestination变化而改变),DIALOG(默认透明。不影响其他NavDestination的生命周期)。
  5. NavPathStack:Navigation路由栈,由于管理NavDestination组件的路由跳转。推荐使用NavPathStack配合navDestination属性进行页面路由。
完整的Navigation

要求入口页面必须是Navigation组件作为容器,子页面必须是NavDestinnation组件作为容器。由于我们将页面内容区的页面都添加了页面栈,所以在子页面拿到页面栈之后也可以实现子页面之间跳转。

在这里插入图片描述

入口页面
import { page1 } from '../viewmodel/page1'
import { page2 } from '../viewmodel/page2'@Entry
@Component
struct Index {// 菜单栏private menuitems:NavigationMenuItem[]=[{value:'菜单1',icon:'resources/base/media/startIcon.png',action:()=>{}},{value:'菜单2',icon:'resources/base/media/startIcon.png',action:()=>{}}]// 工具栏private toolbaritems:ToolbarItem[]=[{value:'工具1',icon:$r('app.media.startIcon'),action:()=>{}},{value:'工具2',icon:$r('app.media.startIcon'),action:()=>{}},{value:'工具3',icon:$r('app.media.startIcon'),action:()=>{}},{value:'工具4',icon:$r('app.media.startIcon'),action:()=>{}}]// 页面路由栈@Provide('pathstack') pathstack:NavPathStack=new NavPathStack()// 内容页@Builderpagemap(pagename:string){if(pagename=='page1'){page1()}else if(pagename=='page2'){page2()}}build() {Navigation(this.pathstack){Column({space:20}){Text('page1').fontSize(28).padding(10).border({width:2,color:Color.Red}).onClick(()=>{this.pathstack.pushPath({name:'page1'})}).width('100%')Text('page2').fontSize(28).padding(10).border({width:2,color:Color.Red}).onClick(()=>{this.pathstack.pushPath({name:'page2'})}).width('100%')}.width('100%').height('100%').backgroundColor(Color.Gray)}// 标题栏.title('主标题')// 菜单栏.menus(this.menuitems)// 工具栏.toolbarConfiguration(this.toolbaritems)// 内容页.navDestination(this.pagemap)}
}
子页面
/***作者:gxx*时间:2024/10/24 10:13*功能:**/
@Component
export struct page1 {
//   子页面拿到页面栈
@Consume('pathstack') pathstack:NavPathStackprivate menuitems: NavigationMenuItem[] = [{value: '菜单1',icon: 'resources/base/media/startIcon.png',action: () => {}},{value: '菜单2',icon: 'resources/base/media/startIcon.png',action: () => {}}]build() {NavDestination() {Column() {Text('page1').fontSize(28).fontWeight(FontWeight.Bolder)}.width('100%').height('100%').justifyContent(FlexAlign.Center)}.title('页面标题').menus(this.menuitems)}
}
页面跳转

普通页面跳转

pushpath和replacepath都可以实现页面跳转,他们的区别就是在页面栈中覆盖页面还是替换页面的区别,replacepath无法实现pop回调,因为当前页在跳转的时候已经被销毁。

// 子页面之间也可以跳转
this.pathstack.replacePath({name:'page1',onPop:(info)=>{console.log('gxxt ',JSON.stringify(info))}})
this.pathstack.pushPath({name:'page1',onPop:(info)=>{console.log('gxxt ',JSON.stringify(info))}})

这里面的onpop是可选参数,如果设置了意味着在目标页可以通过调用页面栈的pop方法回到当前页,并且将返回值带过来,相当于带返回值的跳转。

.onBackPressed(()=>{this.pathstack.pop(result)return true})

此处result为目标页返回给当前页的返回值。

跳转携带数据

跳转的时候可以携带数据,通过param可以设置这些数据,并在目标页中获取。

.onClick(()=>{this.pathstack.pushPath({name:'page1',param:'来自首页的信息'})
})

这里携带了字符串类型的数据作为param。

.onReady((cxt)=>{let param= cxt.pathInfo.param as stringpromptAction.showToast({message:param})
})

可以在子页面的NavDestination的onready中获取携带过来的数据。

路由拦截

路由跳转中可以进行拦截处理,常用于路由重定向。比如主页面跳转到page1的时候,携带的数据为page2,重定向到page2.

.onClick(()=>{this.pathstack.pushPath({name:'page1',param:'page2'})
})

在首页跳转到page1页面。

aboutToAppear(): void {// 设置拦截器this.pathstack.setInterception({willShow:(from:NavDestinationContext|NavBar,to:NavDestinationContext|NavBar)=> {// 回到主页面的时候to是navbarif (typeof to == 'string') {return} else {let cxt = to as NavDestinationContext// 如果跳转到page1 但是携带数据是page2 就跳转到page2if (cxt.pathInfo.name == 'page1') {if (cxt.pathInfo.param == 'page2') {//移除page1this.pathstack.pop()this.pathstack.pushPath({ name: 'page2',param:'pagex' })}}}}})
}

在主页定义了页面栈的拦截器,只要跳转的目标是page1并且携带了数据page2,就将page1移除,重定向到page2,就相当于从主页直接跳转到了page2.

其他的

在主页中可以设置标题为mini并关闭后退按钮,从而保持界面统一化。

.titleMode(NavigationTitleMode.Mini)
.hideBackButton(true)

在子页中可以在生命周期方法onReady中拿到当前子页的上下文环境context,里面包含了页面路由的相关信息。

.onReady((cxt)=>{let param= cxt.pathInfo.param as stringpromptAction.showToast({message:param})
})

在子页中点击后退图标或者按后退键都是执行了NavDestination的onBackpress生命周期函数,我们可以重写该函数。

.onBackPressed(()=>{this.pathstack.pop('gxx')return true
})

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

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

相关文章

iPhone SE 4:定了

万众期待的iPhone SE 4,近日传来了确定的消息。 近日,屏幕供应链分析师Ross Young透露:iPhone SE 4的屏幕面板,预计在 11 月份开始出货,并将于 2025 年年初正式发布。 来了来了,终于来了。 和以往不同&am…

【C++打怪之路Lv12】-- 模板进阶

#1024程序员节|征文# 🌈 个人主页:白子寰 🔥 分类专栏:重生之我在学Linux,C打怪之路,python从入门到精通,数据结构,C语言,C语言题集👈 希望得到您…

【jvm】堆的内部结构

目录 1. 说明2. 年轻代(Young Generation)2.1 说明2.2 Eden区2.3 Survivor区 3. 老年代(Old Generation)3.1 说明3.2 对象存放3.3 垃圾回收 4. jdk7及之前5. jdk8及之后 1. 说明 1.JVM堆的内部结构主要包括年轻代(You…

SpringBoot poi-tl通过模板占位符生成word文件

简介: 开发中我们需要通过在word中使用占位符来动态渲染一些数据,本文讲解poi-tl实现动态生成word文档,包括表格循环,对象嵌套。 poi-tl官网文档 Poi-tl Documentation 1. word格式 这是我的test.word 这是导出后的out.docx文件 …

详解Pectra升级:如何影响以太坊价值及利益相关者

Pectra很可能是最后几个会直接影响用户和ETH持有者的升级之一。 原文:Galaxy Research;编译:Golem;编辑:郝方舟 出品 | Odaily星球日报(ID:o-daily) 编者按:以太坊 Pectr…

了解 WebSocket

了解 WebSocket 轮询方式、短轮询长轮询SSE WebSocket为什么说 WebSocket 是基于 Http 协议的?如何通过 Sec-WebSocket-Key 与 验证 Sec-WebSocket-Accept验证 demo SpringBoot 中使用 WebSocket引入依赖增加 WebSocketConfig修改 ServerEndpointConfig定义 ServerE…

保研考研机试攻略:python笔记(1)

🐨🐨🐨宝子们好呀 ~ 我来更新欠大家的python笔记了,从这一篇开始我们来学下python,当然,如果只是想应对机试并且应试语言以C和C为主,那么大家对python了解一点就好,重点可以看高分篇…

易基因:Nat Commun:ATAC-seq等揭示恒河猴大脑高分辨率解剖区域的转录组和开放染色质图谱

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 恒河猴是神经科学研究中常用的模型动物,其大脑结构和功能与人类大脑相似。大脑中复杂的遗传网络是灵长类动物行为、认知和情感的基础,一直是神经科学的核心。大脑…

禾川SV-X2E A伺服驱动器参数设置——脉冲型

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家!人工智能学习网站 前言: 大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任…

【Android】基础回顾--四大组件

1. 四大组件是什么? 四大组件:Activity、Service、BroadcastReceiver、ContentProvider。 2. 四大组件的生命周期和简单用法 Activity: 特殊情况下的生命周期: 典型的生命周期好像没什么可说的,主要说一下特殊情况…

基于Datawhale开源量化投资学习指南(11):LightGBM在量化选股中的优化与实战

1. 概述 在前几篇文章中,我们初步探讨了如何通过LightGBM模型进行量化选股,并进行了一些简单的特征工程和模型训练。在这一篇文章中,我们将进一步深入,通过优化超参数和实现交叉验证来提高模型的效果,并最终通过回测分…

C++ | Leetcode C++题解之第516题最长回文子序列

题目&#xff1a; 题解&#xff1a; class Solution { public:int longestPalindromeSubseq(string s) {int n s.length();vector<vector<int>> dp(n, vector<int>(n));for (int i n - 1; i > 0; i--) {dp[i][i] 1;char c1 s[i];for (int j i 1; j…

2-135 基于matlab的有限差分法计算电位分布

基于matlab的有限差分法计算电位分布&#xff0c;设置目标尺寸的矩形区域&#xff0c;设置矩形区域内的网格数量&#xff0c;根据网格位置在区域内设置电位&#xff0c;实现电位分布计算。程序已调通&#xff0c;可直接运行。 下载源程序请点链接&#xff1a;2-135 基于matlab…

微信小程序的日期区间选择组件的封装和使用

组件化开发是一种将大型软件系统分解为更小、更易于管理和复用的独立模块或组件的方法。这种方法在现代软件开发中越来越受到重视&#xff0c;尤其是在前端开发领域。微信小程序的日期区间选择组件的使用 wxml 代码 <view><view bind:tap"chooseData">…

【Redis】内存淘汰策略

文章目录 什么是内存淘汰策略设置Redis最大内存执行内存淘汰策略的流程Redis的八大内存淘汰策略深入源码进行理解内存淘汰策略流程 什么是内存淘汰策略 Redis内存淘汰策略是指当Redis的内存使用达到其配置的最大内存限制&#xff08;maxmemory&#xff09;时&#xff0c;Redis…

论文笔记(五十)Segmentation-driven 6D Object Pose Estimation

Segmentation-driven 6D Object Pose Estimation 文章概括摘要1. 引言2. 相关工作3. 方法3.1 网络架构3.2 分割流3.3 回归流3.4 推理策略 4. 实验4.1 评估 Occluded-LINEMOD4.1.1 与最先进技术的比较4.1.2 不同融合策略的比较4.1.3 与人体姿态方法的比较 4.2 在YCB-Video上的评…

uniapp使用easyinput文本框显示输入的字数和限制的字数

uniapp使用easyinput文本框显示输入的字数和限制的字数 先上效果图&#xff1a; 整体代码如下&#xff1a; <template><view class"nameInfoContent"><uni-easyinput class"uni-mt-5" suffixIcon"checkmarkempty" v-model&quo…

【MyBatis源码】SqlSessionFactoryBuilder源码分析

文章目录 概述类结构从 InputStream 创建 SqlSessionFactoryXMLConfigBuilder构建ConfigurationXMLConfigBuilder初始化方法parse()方法parseConfiguration属性&#xff08;properties&#xff09; 概述 SqlSessionFactory 是 MyBatis 的核心接口之一&#xff0c;提供创建 Sql…

vue通过JSON文件生成WPML文件源码

可以使用封装的json解析器进行JSON数据获取&#xff0c;读取点的经度、维度、高程等数据&#xff0c;再使用对应的WPML文件生成函数使用该源码下载WPML文件&#xff08;固定WPML生成&#xff1a;js模板式生成大疆上云wpml文件&#xff08;含详细注释&#xff0c;已封装成函数&a…

(7) cuda异常处理

文章目录 上节概要异常处理代码 上节概要 上一节 block_width 64的时候&#xff0c;64644096 > 1024&#xff08;一个block里面最多只能有1024个线程&#xff0c;所以这里计算会有问题&#xff09; 异常处理 __FILE__: 编译器内部定义的一个宏。表示的是当前文件的文件…