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.mzph.cn/pingmian/57684.shtml

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

相关文章

基于FPGA的以太网设计(五)

之前简单介绍并实现了ARP协议,今天简单介绍一下IP协议和ICMP协议。 1.IP协议 IP协议即Internet Protocol,是网络层的协议。 IP协议是TCP/IP协议族的核心协议,其主要包含两个方面: IP头部信息。IP头部信息出现在每个IP数据报中…

【操作系统】Linux之进程管理一

第1关:获取进程常见属性 ret.pidgetpid(); ret.ppidgetppid(); 第2关:进程创建操作-fork pid_t pid fork(); if(pid-1) printf("创建进程失败!"); else if(pid0) printf("Children"); else printf("Parent"); …

RWSENodeEncoder, KER_DIM_PE(lrgb文件中的encoders文件中的kernel.py)

该代码实现了一个基于核的节点编码器 KernelPENodeEncoder,用于在图神经网络中将特定的核函数编码(例如随机游走结构编码 RWSE)与节点特征相结合。通过将预先计算的核统计信息(如 RWSE 等)与原始节点特征结合,该编码器可以帮助模型捕捉图中节点的结构信息。该代码还定义了…

将 el-date-picker获取的时间数据转换成时间戳

在Vue.js中使用Element UI的el-date-picker组件时,你可以获取用户选择的日期并将其转换为时间戳。el-date-picker通常返回的是一个Date对象或一个格式化后的字符串(取决于你如何配置它)。下面是一个示例,展示了如何将el-date-pick…

AI 自学 Lesson2 - 回归(Regression)

目录 背景 数据集选择原因 一、回归概述 1. 常见的回归模型总结 2. 选择模型的依据 二、代码 1. 单变量线性回归 2. 多变量线性回归 3. L1 正则化 - Lasso 回归 4. L2 正则化 - 岭回归 5. 决策树&随机森林回归 6. 梯度提升回归 7. 模型评估 总结 背景 回归&…

Spring Cloud OAuth认证中心

在微服务架构中,由于不同的业务会拆分成不同的微服务,传统的单体项目一般是通过过滤器进行拦截校验,而微服务显然不可能分发到各个服务进行用户认证,这就需要由一个统一的地方来管理所有服务的认证信息,实现只登录一次…

西农数据结构第二次实习题目参考

T1 用顺序存储实现栈的初始化、入栈、出栈、取栈顶、判栈空操作。调用以上操作实现判断从键盘输入的括号序列是否匹配 输入描述 括导序列#(#为括号输入结束符号) 输出描述 匹配或不匹配 输入 {[()]}# 输出 匹配 #include <iostream> using namespace std; cons…

松脂醇-落叶松脂素还原酶(pinoresinol-lariciresinol reductase, PLR)克隆与鉴定-文献精读71

菘蓝中松脂醇-落叶松脂素还原酶编码基因IiPLR2的克隆与功能分析 摘要 松脂醇-落叶松脂素还原酶(pinoresinol-lariciresinol reductase, PLR)是植物中木脂素生物合成的关键酶&#xff0c;能连续催化两步反应分别生成落叶松脂素和开环异落叶松脂素。落叶松脂素等木脂素类成分是…

Unity SpriteEditor 中的图集处理功能

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正 因为unity不只能做3d&#xff0c;还有2d游戏需要大量编辑处理图片素材&#xff0c;所以需要了解Sprite&#xff08;精灵&…

KPaaS 集成平台低代码在跨境电商行业的应用

在全球化的经济浪潮中&#xff0c;跨境电商行业蓬勃发展&#xff0c;机遇与挑战并存。随着业务规模的不断扩大和市场竞争的日益激烈&#xff0c;跨境电商企业面临着诸多复杂的业务管理和技术难题。KPaaS 业务集成扩展平台以其低代码的创新特性&#xff0c;为跨境电商行业带来了…

头歌——人工智能(机器学习 --- 决策树2)

文章目录 第5关&#xff1a;基尼系数代码 第6关&#xff1a;预剪枝与后剪枝代码 第7关&#xff1a;鸢尾花识别代码 第5关&#xff1a;基尼系数 基尼系数 在ID3算法中我们使用了信息增益来选择特征&#xff0c;信息增益大的优先选择。在C4.5算法中&#xff0c;采用了信息增益率…

银河麒麟相关

最近安装了银河麒麟server版本&#xff0c;整理下遇到的一些小问题 1、vmware安装Kylin-Server-V10-SP3-General-Release-2303-X86_64虚拟机完成后&#xff0c;桌面窗口很小&#xff0c;安装vmwaretools后解决&#xff0c;下载地址http://softwareupdate.vmware.com/cds/vmw-de…

leetcode-71-简化路径

题解&#xff1a; 1、以"/"作为分隔符对字符串进行分割得到数组names; 2、初始化一个栈stack&#xff08;python中的栈使用列表实现&#xff09;&#xff1b; 3、遍历数组names&#xff1b;如果当前元素为".."且栈不为空&#xff0c;则将弹出栈顶元素&a…

网络安全行业10大副业汇总,总有一个适合你

网络安全行业这10大副业汇总 总有一个适合你 引言 在当今的网络安全行业中&#xff0c;除了全职工作外&#xff0c;许多师傅还通过副业来增加收入、不断拓展自身技能&#xff0c;并积累更多实际操作经验&#xff0c;为职业发展增添了无限可能。 本文提供了10种适合各种类型…

JavaWeb合集15-线程局部变量ThreadLocal

十五、ThreadLocal ThreadLocal并不是一个Thread,&#xff0c;而是Thread的局部变量。 ThreadLocal为每个线程提供单独一份存储空间&#xff0c;具有线程隔离的效果&#xff0c;只有在线程内才能获取到对应的值&#xff0c;线程外则不能访问。 场景&#xff1a;通过过滤器/过…

Android13关于获取外部存储文件的相关问题及解决方案记录

Android的学习路上... 测试设备&#xff1a;vivo X90s安卓版本&#xff1a; Android13开发环境&#xff1a;AndroidStudio FlamingoSDK&#xff1a;33 最近我在Android13的环境下尝试写一个文件选择器&#xff0c;以便日后的开发使用。但是我们知道&#xff0c;从Android13 (A…

django restful API

文章目录 项目地址一、django环境安装以及初识restful1.1 安装python 3.10的虚拟环境1.2 创建django工程文件1.3 创建一个book app1.4 序列化(Django JsonResponse)1.4.1创建一个Models1.4.2 创建django的超级用户admin1.4.3 添加serializers.py生成序列化器1.5 FBV创建视图1…

Vue3 + Element Plus 封装文本超出长度显示省略号,鼠标移上悬浮展示全部内容的组件

一、背景介绍&#xff1a; 基于Vue3 Element Plus的项目&#xff0c;多处出现展示超长文本&#xff0c;为了页面美观&#xff0c;笔者决定封装成Text组件&#xff0c;实现“文本超出长度显示省略号&#xff0c;鼠标移上悬浮展示全部内容”的功能。 二、封装的Text组件 <…

Mac 下安装FastDFS

首先我们需要下载相对应的安装包&#xff1a; libfastcommonFastDFS 下载完成后我们先将其解压到桌面。 1.安装libfastcommon 我们进入到libfastcommon-master目录中执行./make.sh和sudo ./make.sh install&#xff0c;具体代码如下&#xff1a; 2.安装FastDFS 同安装libfa…

用docker Desktop 下载使用thingsboard/tb-gateway

1、因为正常的docker pull thingsboard/tb-gateway 国内不行了&#xff0c;所以需要其它工具来下载 2、在win下用powershell管理员下运行 docker search thingsboard/tb-gateway 可以访问到了 docker pull thingsboard/tb-gateway就可以下载了 3、docker Desktop就可以看到…