首页 > 其他分享 >【鸿蒙开发】基础干货篇--7 “一篇带你掌握页面跳转”

【鸿蒙开发】基础干货篇--7 “一篇带你掌握页面跳转”

时间:2024-11-19 19:43:39浏览次数:3  
标签:鸿蒙 -- url 模块 跳转 router 路由 页面

系列文章目录

【鸿蒙开发】鸿蒙开发基础干货篇–1
【鸿蒙开发】基础干货篇–2 小白入门手册(内含Dev Eco安装教程和汉化插件安装)
【鸿蒙开发】基础干货篇–3 小白入门手册 (内含模拟器保姆级安装使用教程)
【鸿蒙开发】基础干货篇–4 小白入门手册(内含Stage模型工程目录结构和UIAbility 组件详解)
【鸿蒙开发】基础干货篇–5 “一篇带你掌握应用状态”
【鸿蒙开发】基础干货篇–6 “超简单持久化存储PersistentStorage”
【鸿蒙开发】“一篇带你掌握HAP、HAR、HSP”


文章目录


前言

在业务体系庞大或复杂的情况下,通常会将业务拆分成多个子业务模块,单个子业务模块为一个har/hsp。在该场景下,通常存在从主业务入口跳转到不同子页面模块,或从一个子业务模块A页面跳转到另一个子业务模块B页面的需求。如,从应用首页跳转到登录子业务模块页面。

针对不同场景,有三种解决方案,我们在下面为大家分别详细讲解。


一、页面路由 (@ohos.router)(不推荐)

页面路由指在应用程序中实现不同页面之间的跳转和数据传递。Router模块通过不同的url地址,可以方便地进行页面路由,轻松地访问不同的页面。

1.页面跳转

页面跳转是开发过程中的一个重要组成部分。在使用应用程序时,通常需要在不同的页面之间跳转,有时还需要将数据从一个页面传递到另一个页面。

Router模块提供了两种跳转模式,分别是router.pushUrl和router.replaceUrl。

  1. router.pushUrl:目标页面不会替换当前页,而是压入页面栈。这样可以保留当前页的状态,并且可以通过返回键或者调用router.back方法返回到当前页。
import { router } from '@kit.ArkUI';
// 在Home页面中
  router.pushUrl({
    url: 'pages/Detail' // 目标url
  });
  1. router.replaceUrl:目标页面会替换当前页,并销毁当前页。这样可以释放当前页的资源,并且无法返回到当前页。
import { router } from '@kit.ArkUI';
// 在Home页面中
router.replaceUrl({
  url: 'pages/Profile' // 目标url
}

效果示例:
在这里插入图片描述

注意:页面栈的最大容量为32个页面。如果超过这个限制,可以调用router.clear方法清空历史页面栈,释放内存空间。

Router模块提供了两种实例模式,分别是Standard和Single。这两种模式决定了目标url是否会对应多个实例。

  • Standard:多实例模式,也是默认情况下的跳转模式。目标页面会被添加到页面栈顶,无论栈中是否存在相同url的页面。

  • Single:单实例模式。如果目标页面的url已经存在于页面栈中,则会将离栈顶最近的同url页面移动到栈顶,该页面成为新建页。如果目标页面的url在页面栈中不存在同url页面,则按照默认的多实例模式进行跳转。

2.页面返回

当用户在一个页面完成操作后,通常需要返回到上一个页面或者指定页面,这就需要用到页面返回功能。在返回的过程中,可能需要将数据传递给目标页面,这就需要用到数据传递功能。

  1. 返回到上一个页面。
import { router } from '@kit.ArkUI';
router.back();
  1. 返回到指定页面。
// 返回普通页面
import { router } from '@kit.ArkUI';
router.back({
 url: 'pages/Home'
});
//返回命名路由页面
import { router } from '@kit.ArkUI';
router.back({
  url: 'myPage' //myPage为返回的命名路由页面别名
});
  1. 返回到指定页面,并传递自定义参数信息。
import { router } from '@kit.ArkUI';
router.back({
  url: 'pages/Home',
  params: {
    info: '来自Home页'
  }
});

效果示例:
在这里插入图片描述

3.页面返回前增加一个询问框

在开发应用时,为了避免用户误操作或者丢失数据,有时候需要在用户从一个页面返回到另一个页面之前,弹出一个询问框,让用户确认是否要执行这个操作。

为了实现这个功能,可以使用页面路由Router模块提供的两个方法:router.showAlertBeforeBackPage和router.back来实现这个功能。

如果想要在目标界面开启页面返回询问框,需要在调用router.back方法之前,通过调用router.showAlertBeforeBackPage方法设置返回询问框的信息。例如,在支付页面中定义一个返回按钮的点击事件处理函数:

import { router } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';

// 定义一个返回按钮的点击事件处理函数
function onBackClick(): void {
  // 调用router.showAlertBeforeBackPage()方法,设置返回询问框的信息
    router.showAlertBeforeBackPage({
      message: '您还没有完成支付,确定要返回吗?' // 设置询问框的内容
    });
  // 调用router.back()方法,返回上一个页面
  router.back();
}

效果展示:
在这里插入图片描述

二、使用navigation组件跳转

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

Navigation组件主要包含​导航页(NavBar)和子页(NavDestination)。导航页由标题栏(Titlebar,包含菜单栏menu)、内容区(Navigation子组件)和工具栏(Toolbar)组成

1.路由操作

Navigation路由相关的操作都是基于页面栈NavPathStack提供的方法进行,每个Navigation都需要创建并传入一个NavPathStack对象,用于管理页面。主要涉及页面跳转、页面返回、页面替换、页面删除、参数获取、路由拦截等功能。

注意:

2.页面跳转

注意事项:
1.主页要被Navigation容器包裹。
2.目标跳转的子页要被NavDestination容器包裹。
3.被@entry修饰的主页要创建一个被@Provide修饰的NavPathStack页面栈对象
4.子页通过 @Consume 继承NavPathStack页面栈对象

主页 >代码如下(示例):


@Entry 
@Component 
struct NavigationPage { 
 **@Provide('pathStack') pathStack: NavPathStack = new NavPathStack();** 
  build() { 
    Navigation(this.pathStack) { 
      ...
    } 
    .navDestination(this.pageMap) 
  } 
}

子页 >代码如下(示例):


@Component 
export struct LoginPage { 

  **@Consume('pathStack') pathStack: NavPathStack;** 
 
  build() { 
    NavDestination() { 
    ...
    } 
    .onBackPressed(() => { 
      this.pathStack.pop(); 
      return true; 
    }) 
  } 
}

三、使用基于navigation组件的自定义路由框架跳转

第二种方法各个模块间将存在非常复杂的依赖关系,当模块间跳转需求增多时,甚至会导致多个har/hsp间循环依赖。为了解决模块间的强耦合关系,并且提升页面加载性能,推荐使用自定义路由框架。该方案的整体思路如下:

  1. 自定义一个路由管理模块RouterModule,各个需要使用路由功能的模块均依赖此模块。

  2. 路由管理模块RouterModule内部定义路由栈NavPathStack,并对NavPathStack进行封装,对外提供路由能力。

  3. 在使用Navigation组件时,需将Navigation组件对应的NavPathStack注册到路由管理模块中。通过路由管理模块RouterModule的NavPathStack对路由能力进行控制。
    各个路由页面不再提供组件,转为提供@builder封装的构建函数,再通过WrappedBuilder封装进行传递使用。

  4. 各个路由页面将模块名称、路由名称、WrappedBuilder封装后的构建函数注册到路由管理模块RouterModule的路由表中。

  5. 当路由需要跳转到指定路由时,调用路由管理模块RouterModule的push方法。该方法对指定的模块的路由页面动态导入,并完成路由跳转。


总结

以上就是今天要讲的内容,本文仅仅简单三种页面跳转解决方案使用。大家自行选取学习。晚安啦希望大家开开心心有个好梦

标签:鸿蒙,--,url,模块,跳转,router,路由,页面
From: https://blog.csdn.net/i20021209/article/details/143892087

相关文章

  • Flutter用PageView.builder和bottomNavigationBar做出底部小圆点效果
    import'package:flutter/material.dart';voidmain(){runApp(App());}classAppextendsStatelessWidget{@overrideWidgetbuild(BuildContextcontext){//TODO:implementbuildreturnMaterialApp(debugShowCheckedModeBanner:fal......
  • 基于STM32的独立按键控制LED灯Proteus仿真设计(仿真+程序+设计报告+讲解视频)
    基于STM32的独立按键控制LED灯Proteus仿真设计(仿真+程序+设计报告+讲解视频)仿真图proteus8.9程序编译器:keil5编程语言:C语言设计编号:C00951.主要功能1.使用Proteus仿真软件和STM32F103系列芯片设按键扫描电路。2.开始仿真后LED1和LED2点亮,按键控制熄灭/点亮3.使用......
  • 2024年11月一区SCI-逃离优化算法Escape Algorithm-附Matlab免费代码
    引言本期介绍了一种受人群疏散行为的启发的元启发式优化算法,称为逃离优化算法EscapeAlgorithm,ESC。该算法于2024年11月最新发表在JCR1区,中科院2区TopSCI期刊 ArtificialIntelligenceReview。ESC的灵感来自于人们在紧急疏散期间的行为。本节解释人群疏散系统的背景,以及......
  • code
    快速排序代码https://www.acwing.com/problem/content/description/787/voidQuickSort(intq[],intlow,inthigh){//递归的终止情况if(low>=high)return;//第一步:分解为子问题intpivot=q[low+high>>1],i=low-1,j=high+1;......
  • 【淘汰9成NLP工程师的常识题】多头注意力相对于多头注意力有什么优势?
    【淘汰9成NLP工程师的常识题】多头注意力相对于多头注意力有什么优势?重要性:★★★......
  • SS241119C. 甜果(sugar)
    SS241119C.甜果(sugar)题意有\(n\)个人,每个人初始有\(a_i\)颗糖果,有\(n\)个事件,事件\(i\)是如果\(a_i>a_{b_i}\),那么\(a_i':=a_i+w_i\)。问所有事件以随机的排列的顺序依次发生后,每个人的期望糖果数量。思路即求每个事发生的概率\(p_i\),那么\(ans_i=a_i......
  • 将 WPF 嵌入到 MFC 中,无法响应键盘输入
    在将WPF窗口嵌入到MFC窗口中中提到,可以将WPF嵌入到MFC窗口中,但遗留了一个没有发现的问题,WPF界面,无法响应键盘的输入。示例源码已经在https://gitee.com/Jasongrass/DemoPark/tree/master/Code/Embed_WPF_to_MFC/MFCMerge......
  • [考试记录] 2024.11.19 noip模拟赛17
    T1选取字符串warning❗:本题解前缀含量过高。挺典的kmp。考虑到题目中的串都是一个串的前缀,那么所选出来的串,他们的前缀一定是最短的那个串。不妨直接枚举每一个前缀,也就是枚举每一个串,看他们是否可以作为前缀出现,hash即可,复杂度\(\mathcal{O}(N^2)\)。换个思路,考虑有多......
  • 实验4
    实验任务2Gradecalc.hpp代码点击查看代码#include<iostream>#include<vector>#include<string>#include<algorithm>#include<numeric>#include<iomanip>usingstd::vector;usingstd::string;usingstd::cin;usingstd::cout;us......
  • MATH36031 A Fox and A R abbit
    MATH36031Project2-deadline22ndNovember2024,time1100hrs.Inthisproject,thedynamicsbetweenafoxandarabbitwillbeinvestigated,bysolvingdifferentialequationsmodellingtheirpositionsatdifferenttimes.Theinitialconfigurationissho......