鸿蒙Navigation路由导航-基本使用介绍

news2025/6/10 12:29:59

1. Navigation介绍

Navigation组件是路由导航的根视图容器,一般作为Page页面的根容器使用,其内部默认包含了标题栏、内容区和工具栏,其中内容区默认首页显示导航内容(Navigation的子组件)或非首页显示(NavDestination的子组件),首页和非首页通过路由进行切换。

官网文档地址:文档中心

本案例代码运行环境是API17

2. 案例代码

下面是基于官网示例代码修改而成的:

import { Gouwuche } from './Gouwuche';
​
@Entry
@Component
struct NavigationExample {
  private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
  @Provide pageInfo: NavPathStack = new NavPathStack();
  @State message: string = '';
​
  @Builder
  NavigationTitle() {
    Column() {
      Text('Title')
        .fontColor('#182431')
        .fontSize(35)
        .lineHeight(41)
        .fontWeight(700)
      if (this.message) {
        Text('子页面返回数据=' + this.message)
          .fontColor('#182431')
          .fontSize(16)
          .lineHeight(19)
          .opacity(0.4)
          .margin({ top: 2, bottom: 20 })
      }
    }
    .alignItems(HorizontalAlign.Start)
  }
​
  @Builder
  NavigationMenus() {
    Row({ space: 15 }) {
      Image($r('app.media.ic_public_add'))
        .width(24)
        .height(24)
        .fillColor('#ic_public_add')
        .onClick(() => {
          this.pageInfo.pushPathByName('Gouwuche', '18022223333', (info) => {
            //接收返回值
            this.message = info.result as string
          });
        })
      Image($r('app.media.ic_public_more'))
        .width(24)
        .height(24)
        .fillColor('#ic_public_add')
    }
    .margin({ top: 10 })
  }
​
  @Builder
  PagesMap(name: string) {
    if (name == 'Gouwuche') {
      Gouwuche()
    }
  }
​
  build() {
    Column() {
      Navigation(this.pageInfo) {
        TextInput({ placeholder: 'search...' })
          .width('100%')
          .height(40)
          .backgroundColor('#FFFFFF')
          .margin({ top: 8 })
​
        List({ space: 12, initialIndex: 0 }) {
          ForEach(this.arr, (item: number) => {
            ListItem() {
              Text('' + item)
                .width('100%')
                .height(72)
                .backgroundColor('#FFFFFF')
                .borderRadius(24)
                .fontSize(16)
                .fontWeight(500)
                .textAlign(TextAlign.Center)
            }
          }, (item: number) => item.toString())
        }
        .layoutWeight(1)
        .width('100%')
        .alignListItem(ListItemAlign.Center)
        .scrollBar(BarState.Off) //关闭滚动条
        .margin({ top: 12 })
      }
      .navDestination(this.PagesMap) //创建NavDestination组件。使用builder函数,基于name和param构造NavDestination组件
      .title(this.NavigationTitle) //设置页面标题
      .menus(this.NavigationMenus) //设置页面右上角菜单。不设置时不显示菜单项
      .titleMode(NavigationTitleMode.Full) // 设置页面标题栏显示模式
      .hideTitleBar(false, true) //设置是否隐藏标题栏
      .hideToolBar(false, true) //设置是否隐藏工具栏
      .mode(NavigationMode.Auto) //设置导航栏的显示模式,支持单栏(Stack)、分栏(Split)和自适应(Auto)
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#F1F3F5')
  }
}

Gouwuche.ets文件代码如下:

@Component
export struct Gouwuche {
  @State message: string = '购物车';
  @Consume pageInfo: NavPathStack
​
  aboutToAppear(): void {
    this.message = `${this.pageInfo.getParamByName('Gouwuche')}`
  }
​
  build() {
    NavDestination() {
      Column() {
        Row() {
          Text(this.message)
            .fontSize(30)
          Button('返回上一页')
            .onClick(() => {
              this.pageInfo.pop('hello:鸿蒙你好!')
            })
        }
      }
      .width('100%')
      .height('100%')
      .backgroundColor('#ff77f8bd')
    }
  }
}

实验现象:

  1. 点击页面右上角的加号,会跳转到【Gouwuche】页面,并且显示上一个页面传来的参数:18022223333

  2. 点击【Gouwuche】页面中的【返回上一页】的按钮,页面跳转回第一个页面,并且将字符【hello:鸿蒙你好!】传递给第一个页面了

通过上面实验,我们可以学会以下知识点

  1. 页面之间如何通过Navigation组件进行跳转

  2. 页面跳转时,如何来回传递数据

3. 实战

3.1. 需求

  1. 定义登录和注册页面,然后登录页面点击注册按钮,跳转到注册页面

  2. 注册页面输入账号和密码后,点击注册按钮,页面立马跳转到登录页面

  3. 登录页面显示刚注册的账号和密码信息

3.2. 编码

登录页面代码如下:

import { RegisterPage } from './RegisterPage';
​
/**
 * 登录页面
 */
@Entry
@Component
struct LoginPage {
  @Provide pageInfo: NavPathStack = new NavPathStack();
  @State registerInfo: string = '';
​
  @Builder
  PagesMap(name: string) {
    if (name == 'Register') {
      RegisterPage()
    }
  }
​
  build() {
    Navigation(this.pageInfo) {
      Column({ space: 20 }) {
​
        TextInput({ placeholder: '请输入登录账号' })
          .width('90%')
          .backgroundColor('#ffdddddd')
​
        TextInput({ placeholder: '请输入登录密码' })
          .width('90%')
          .backgroundColor('#ffdddddd')
​
        Row({ space: 20 }) {
          Button('登录')
          Button('注册')
            .onClick(() => {
              this.pageInfo.pushPathByName('Register', '', (info) => {
                //接收返回值
                this.registerInfo = info.result as string
              });
            })
        }
​
        //显示注册账号密码信息
        if (this.registerInfo) {
          Text(this.registerInfo)
            .fontSize(16)
        }
      }
    }
    .title('登录页面')
    .navDestination(this.PagesMap)
​
  }
}

页面预览效果如下:

image-20250604211902760

注册页面代码如下:

/** 
 * 注册页面
 */
@Component
export struct RegisterPage {
  @State username: string = ''; //登录账号
  @State password: string = ''; //登录密码
  @Consume pageInfo: NavPathStack
​
  build() {
    NavDestination() {
      Column({ space: 15 }) {
        TextInput({ placeholder: '请输入登录账号' })
          .width('90%')
          .backgroundColor('#ffdddddd')
          .onChange((value: string) => {
            this.username = value;
          })
​
        TextInput({ placeholder: '请输入登录密码' })
          .width('90%')
          .backgroundColor('#ffdddddd')
          .onChange((value: string) => {
            this.password = value;
          })
​
        Row() {
          Button('注册')
            .onClick(() => {
              this.pageInfo.pop('账号:' + this.username + ',密码:' + this.password)
            })
        }
      }
      .width('100%')
      .height('100%')
    }
    .title('注册页面')
  }
}

页面效果如下图所示:

image-20250604212058674

点击注册按钮后,会立马跳转到登录按钮,如下:

image-20250604212124651

小结

大家也可以做一些其他页面跳转的测试,页面之间也可以写到对象参数,转成JSON串进行传递,然后接收方再转成对象即可,大家可以参考官网API多做尝试!

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

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

相关文章

CMS内容管理系统的设计与实现:多站点模式的实现

在一套内容管理系统中,其实有很多站点,比如企业门户网站,产品手册,知识帮助手册等,因此会需要多个站点,甚至PC、mobile、ipad各有一个站点。 每个站点关联的有站点所在目录及所属的域名。 一、站点表设计…

ZYNQ学习记录FPGA(二)Verilog语言

一、Verilog简介 1.1 HDL(Hardware Description language) 在解释HDL之前,先来了解一下数字系统设计的流程:逻辑设计 -> 电路实现 -> 系统验证。 逻辑设计又称前端,在这个过程中就需要用到HDL,正文…

Java中HashMap底层原理深度解析:从数据结构到红黑树优化

一、HashMap概述与核心特性 HashMap作为Java集合框架中最常用的数据结构之一,是基于哈希表的Map接口非同步实现。它允许使用null键和null值(但只能有一个null键),并且不保证映射顺序的恒久不变。与Hashtable相比,Hash…

【记录坑点问题】IDEA运行:maven-resources-production:XX: OOM: Java heap space

问题:IDEA出现maven-resources-production:operation-service: java.lang.OutOfMemoryError: Java heap space 解决方案:将编译的堆内存增加一点 位置:设置setting-》构建菜单build-》编译器Complier

【阅读笔记】MemOS: 大语言模型内存增强生成操作系统

核心速览 研究背景 ​​研究问题​​:这篇文章要解决的问题是当前大型语言模型(LLMs)在处理内存方面的局限性。LLMs虽然在语言感知和生成方面表现出色,但缺乏统一的、结构化的内存架构。现有的方法如检索增强生成(RA…

【笔记】AI Agent 项目 SUNA 部署 之 Docker 构建记录

#工作记录 构建过程记录 Microsoft Windows [Version 10.0.27871.1000] (c) Microsoft Corporation. All rights reserved.(suna-py3.12) F:\PythonProjects\suna>python setup.py --admin███████╗██╗ ██╗███╗ ██╗ █████╗ ██╔════╝…

五、jmeter脚本参数化

目录 1、脚本参数化 1.1 用户定义的变量 1.1.1 添加及引用方式 1.1.2 测试得出用户定义变量的特点 1.2 用户参数 1.2.1 概念 1.2.2 位置不同效果不同 1.2.3、用户参数的勾选框 - 每次迭代更新一次 总结用户定义的变量、用户参数 1.3 csv数据文件参数化 1、脚本参数化 …

python基础语法Ⅰ

python基础语法Ⅰ 常量和表达式变量是什么变量的语法1.定义变量使用变量 变量的类型1.整数2.浮点数(小数)3.字符串4.布尔5.其他 动态类型特征注释注释是什么注释的语法1.行注释2.文档字符串 注释的规范 常量和表达式 我们可以把python当作一个计算器,来进行一些算术…

C++11 constexpr和字面类型:从入门到精通

文章目录 引言一、constexpr的基本概念与使用1.1 constexpr的定义与作用1.2 constexpr变量1.3 constexpr函数1.4 constexpr在类构造函数中的应用1.5 constexpr的优势 二、字面类型的基本概念与使用2.1 字面类型的定义与作用2.2 字面类型的应用场景2.2.1 常量定义2.2.2 模板参数…

EEG-fNIRS联合成像在跨频率耦合研究中的创新应用

摘要 神经影像技术对医学科学产生了深远的影响,推动了许多神经系统疾病研究的进展并改善了其诊断方法。在此背景下,基于神经血管耦合现象的多模态神经影像方法,通过融合各自优势来提供有关大脑皮层神经活动的互补信息。在这里,本研…

C++中vector类型的介绍和使用

文章目录 一、vector 类型的简介1.1 基本介绍1.2 常见用法示例1.3 常见成员函数简表 二、vector 数据的插入2.1 push_back() —— 在尾部插入一个元素2.2 emplace_back() —— 在尾部“就地”构造对象2.3 insert() —— 在任意位置插入一个或多个元素2.4 emplace() —— 在任意…

CVE-2023-25194源码分析与漏洞复现(Kafka JNDI注入)

漏洞概述 漏洞名称:Apache Kafka Connect JNDI注入导致的远程代码执行漏洞 CVE编号:CVE-2023-25194 CVSS评分:8.8 影响版本:Apache Kafka 2.3.0 - 3.3.2 修复版本:≥ 3.4.0 漏洞类型:反序列化导致的远程代…

Copilot for Xcode (iOS的 AI辅助编程)

Copilot for Xcode 简介Copilot下载与安装 体验环境要求下载最新的安装包安装登录系统权限设置 AI辅助编程生成注释代码补全简单需求代码生成辅助编程行间代码生成注释联想 代码生成 总结 简介 尝试使用了Copilot,它能根据上下文补全代码,快速生成常用…

Axure零基础跟我学:展开与收回

亲爱的小伙伴,如有帮助请订阅专栏!跟着老师每课一练,系统学习Axure交互设计课程! Axure产品经理精品视频课https://edu.csdn.net/course/detail/40420 课程主题:Axure菜单展开与收回 课程视频:

RabbitMQ 各类交换机

为什么要用交换机? 交换机用来路由消息。如果直发队列,这个消息就被处理消失了,那别的队列也需要这个消息怎么办?那就要用到交换机 交换机类型 1,fanout:广播 特点 广播所有消息​​:将消息…

高保真组件库:开关

一:制作关状态 拖入一个矩形作为关闭的底色:44 x 22,填充灰色CCCCCC,圆角23,边框宽度0,文本为”关“,右对齐,边距2,2,6,2,文本颜色白色FFFFFF。 拖拽一个椭圆,尺寸18 x 18,边框为0。3. 全选转为动态面板状态1命名为”关“。 二:制作开状态 复制关状态并命名为”开…

未授权访问事件频发,我们应当如何应对?

在当下,数据已成为企业和组织的核心资产,是推动业务发展、决策制定以及创新的关键驱动力。然而,未授权访问这一隐匿的安全威胁,正如同高悬的达摩克利斯之剑,时刻威胁着数据的安全,一旦触发,便可…

欢乐熊大话蓝牙知识17:多连接 BLE 怎么设计服务不会乱?分层思维来救场!

多连接 BLE 怎么设计服务不会乱?分层思维来救场! 作者按: 你是不是也遇到过 BLE 多连接时,调试现场像网吧“掉线风暴”? 温度传感器连上了,心率带丢了;一边 OTA 更新,一边通知卡壳。…

Element-Plus:popconfirm与tooltip一起使用不生效?

你们好&#xff0c;我是金金金。 场景 我正在使用Element-plus组件库当中的el-popconfirm和el-tooltip&#xff0c;产品要求是两个需要结合一起使用&#xff0c;也就是鼠标悬浮上去有提示文字&#xff0c;并且点击之后需要出现气泡确认框 代码 <el-popconfirm title"是…

Selenium 查找页面元素的方式

Selenium 查找页面元素的方式 Selenium 提供了多种方法来查找网页中的元素&#xff0c;以下是主要的定位方式&#xff1a; 基本定位方式 通过ID定位 driver.find_element(By.ID, "element_id")通过Name定位 driver.find_element(By.NAME, "element_name"…