Navigation组件适用于模块内和跨模块的路由切换,通过组件级路由能力实现更加自然流畅的转场体验,并提供多种标题栏样式来呈现更好的标题和内容联动效果。一次开发,多端部署场景下,Navigation组件能够自动适配窗口显示大小,在窗口较大的场景下自动切换分栏展示效果。

根页面设置

我们在Entry的入口处Index.ets使用Navigation当作根页面,这里会面临一个问题,怎么从启动页跳转到首页,并关闭启动页,使用首页一直留在页面栈中,不允许销毁,在前面的文章《鸿蒙Navigation处理启动页跳转到首页问题》中有介绍处理方法,在此不展开。在使用Navigation时,由于默认带有TitleBar和Toolbar,样式不好自定义,我们直接隐藏TitleBar和Toolbar,实际需要的话,可以自己实现。由于默认是Auto模式,以便于适配大屏设备,若我们在大屏设备上不使用分栏效果,可以强制设置单页面模式。

@Entry
@ComponentV2
struct Index {
nav: NavPathStack = new NavPathStack() build() {
Navigation(this.nav)
.mode(NavigationMode.Stack)
.hideToolBar(true)
.hideTitleBar(true)
.height('100%')
.width('100%')
}
}

系统路由表配置

接下来我们需要配置系统路由表,在resources/base/profile目录下新建一个json文件,例如router_map.json,并在里面配置相关的路由页面,例如我们配置一个弹窗页面和一个登录页面。

{
"routerMap": [
{
"name": "dialog",
"pageSourceFile": "src/main/ets/pages/dialog/DialogPage.ets",
"buildFunction": "dialogBuilder"
},
{
"name": "login",
"pageSourceFile": "src/main/ets/pages/login/LoginPage.ets",
"buildFunction": "loginBuilder"
}
]
}

在routerMap里面配置具体的页面,name为页面名称,使用push打开新页面时,传的name名称就是这里定义的。pageSourceFile为页面源文件,buildFunction为页面入口builder,通过源文件找到这个入口builder。在module.json5文件中有一个routerMap字段,值为我们前面定义的router_map.json

实现子页面

路由表字义好了后,我们需要实现具体的页面,这里分别实现一个弹窗页面和标准页面。弹窗示例如下,页面模式需要设置为NavDestinationMode.DIALOG

@Builder
function dialogBuilder() {
DialogPage()
}
@ComponentV2
export struct DialogPage {
build() {
NavDestination() {
Stack() {
Column() {
Text('弹窗标题')
Text('弹窗内容') Row() {
Text('取消').layoutWeight(1)
Text('确定').layoutWeight(1)
}
}
.width('80%')
.borderRadius(16)
.backgroundColor($r('app.color.start_window_background'))
}.width('100%').height('100%')
}.hideTitleBar(true).mode(NavDestinationMode.DIALOG)
}
}

标准登录页面如下,默认为标准模式,mode可以省略不设置

@Builder
function loginBuilder() {
LoginPage()
}
@ComponentV2
export struct LoginPage {
build() {
NavDestination() {
Column() {
Text('账号')
Text('密码')
Text('登录')
}
}
.width('100%')
.height('100%')
.hideTitleBar(true)
}
}

页面跳转操作

打开新页面

使用NavPathStack的pushPath或pushPathByName可以打开一个新页面,例如打开登录页面则是navPathStack.pushPathByName('login', undefined),显示一个弹窗则是navPathStack.pushPathByName('dialog', undefined)。可以发现使用Navigation来实现弹窗还是非常简单的,而且可以全局显示,不依赖于具体页面以及Context,而且弹窗还有显示隐藏等回调。

返回页面

使用NavPathStack的pop方法关闭当前页面,回到上一个页面,我们还可以使用popToName返回到指定的页面,也可以使用popToIndex返回到第几个页面,甚至还可以使用clear方法直接回到首页,使用起来还是非常方便的。

鸿蒙Navigation入门使用的更多相关文章

  1. Android开发 navigation入门详解

    前言 Google 在2018年推出了 Android Jetpack,在Jetpack里有一种管理fragment的新架构模式,那就是navigation. 字面意思是导航,但是除了做APP引导页面 ...

  2. Android Navigation使用

    简介 Navigation导航编辑器旨在简化Android开发中导航的实现,可以帮助我们很好的处理Activity和fragment之间通过FragmentTransaction交互的复杂性,也可以很 ...

  3. Android开发 navigation的跳转动画实现

    前言 此篇博客只简短的介绍navigation如何添加跳转页面的动画属性,如果你还为接触了解过navigation.建议你看我另一篇博客Android开发 navigation入门详解 创建动画xml ...

  4. ROS机器人程序设计(原书第2版)补充资料 (捌) 第八章 导航功能包集入门 navigation

    ROS机器人程序设计(原书第2版)补充资料 (捌) 第八章 导航功能包集入门 navigation 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中 ...

  5. Android Navigation 架构组件入门教程

    Android Navigation 架构组件入门教程 版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:https://www.cnblogs.com/cavalier-/p/1 ...

  6. 鸿蒙OS前端开发入门指南:网络图片_Image渲染网络图片

    目录: 1.开启明文传输 2.权限申请 3.引入http插件 4.案例展示 5.<鸿蒙OS前端开发入门指南>文章合集 开启明文传输 在config.json配置文件添加如下配置(如果不开启 ...

  7. SuperMap iClient for JavaScript 新手入门

    地理信息系统(英语:Geographic Information System,缩写:GIS)是一门综合性学科,结合地理学与地图学,已经广泛的应用在不同的领域,是用于输入.存储.查询.分析和显示地理数 ...

  8. Struts2的经典入门

    一:Struts2的起源与背景 在了解Struts2之前我们先来聊聊Struts1,我们都知道在很长的一段时间内,所有的MVC框架中,Struts1他是处于一个超级大咖的地位,无论是从市场角度和使用的 ...

  9. Struts2入门(一)——环境搭建和简单例子(Struts2 2.5.2版本)

    一.前言 1.了解三大框架 什么是框架? 框架是一种规范,一种规则,一种把技术组织起来的规则,这就是框架. 什么是三大框架(SSH),Struts.hibernate和spring的作用是什么? St ...

  10. 【Bootstrap Demo】入门例子创建

    本文简单介绍下如何来使用 Bootstrap,通过引入 Bootstrap,来实现一个最基本的入门例子. 在前一篇博文[Bootstrap]1.初识Bootstrap 基础之上,我们完全可以更加方便快 ...

随机推荐

  1. Python的OpenCV转换图像大小

    在Python中,使用OpenCV库来转换图像大小是一个常见的操作,它可以帮助你调整图像到特定的尺寸,以适应不同的应用场景,比如图像预处理.模型输入等.下面是一个详细的代码示例,展示了如何使用Open ...

  2. LaTeX hyperref 包去掉链接方框

    \usepackage[hidelinks]{hyperref}

  3. Go channel 介绍

    Go 语言(Golang)中的 chan 是通道(channel)的缩写,用于在不同的 goroutine 之间进行通信.通道允许你在 goroutine 之间传递数据,从而实现同步和共享内存.下面是 ...

  4. 【Git代码仓库】之合并分支代码操作到主干代码上(界面版/命令版)

    一.代码管理仓库,合并分支代码到主干(界面版*) 1.从远程Git代码仓库克隆到本地 # Git克隆 git clone git@e.coding.net:XXX/SQM/SC_WEB_Project ...

  5. Python新手爬虫二:爬取搜狗图片(动态)

    经过上一期爬取豆瓣影评成功后,感觉爬虫还不错,于是想爬点图片来玩玩... 搜狗图片地址:https://pic.sogou.com/?from=category 先上最后成功的源码(在D盘下创建sou ...

  6. python 读取mysqlDB中指定的表名的DDL语句

    注意: 1. 此python文件不要起名为mysql,会跟import的包名重复,python mysql.py运行报错 2.如果需要带端口号,请加database后加上, port="33 ...

  7. 如何高效的阅读paper--三遍阅读法

    第一遍 1.阅读文章的标题.摘要和介绍 2.阅读每一节的标题和副标题 3.阅读总结 4.浏览参考文献,看看是否有曾经读过的文章 在完成第一遍后,应该做到: 1.能够说出该篇论文的类型 2.能够说出文章 ...

  8. sicp每日一题[1.44]

    Exercise 1.44 The idea of smoothing a function is an important concept in signal processing. If f is ...

  9. 使用 nuxi init 创建全新 Nuxt 项目

    title: 使用 nuxi init 创建全新 Nuxt 项目 date: 2024/9/6 updated: 2024/9/6 author: cmdragon excerpt: 摘要:本文介绍了 ...

  10. C语言实现一个走迷宫小游戏(深度优先算法)

    补充一下,先前文章末尾给出的下载链接的完整代码含有部分C++的语法(使用Dev-C++并且文件扩展名为.cpp的没有影响),如果有的朋友使用的语言标准是VC6的话可能不支持,所以在修改过后再上传一版, ...