鸿蒙Harmony-页面路由(router)详解

news2024/11/26 20:27:29

慢慢理解世界,慢慢更新自己,希望你的每一个昨天,今天,和明天都会很快乐,你知道的,先好起来的从来都不是生活,而是你自己 

目录

一,定义

二,页面跳转

2.1使用router.pushUrl

2.2 使用router.replaceUrl

2.3 使用Single模式

2.4 带参数的跳转

 三,页面返回

 3.1返回到上一个页面

3.2 返回到指定页面

3.3返回到指定页面,并传递自定义参数信息

 四,页面返回前增加一个询问框

4.1系统默认询问框

4.2 自定义询问框

一,定义

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

Router适用于模块间与模块内页面切换,通过每个页面的url实现模块间解耦。模块内页面跳转时,为了实现更好的转场动效场景不建议使用该模块,推荐使用Navigation。

二,页面跳转

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

Router模块提供了两种跳转模式,分别是router.poshUrl()router.replaceUrl()。这两种模式决定了目标页面是否会替换当前页。

router.pushUrl():目标页面不会替换当前页,而是压入页面栈。这样可以保留当前页的状态,并且可以通过返回键或者调用router.back()方法返回到当前页。

router.replaceUrl():目标页面会替换当前页,并销毁当前页。这样可以释放当前页的资源,并且无法返回到当前页。

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

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

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

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

2.1使用router.pushUrl

1,添加页面路径

{
  "src": [
    "pages/Index",
    "pages/FirstPage",
    "pages/SecondPage"
  ]
}

2,编写第一个页面

import router from '@ohos.router'

@Entry
@Component
struct FirstPage {

  aboutToAppear(){
    console.error("yz---aboutToAppear")
  }

  onPageShow(){
    console.error("yz---onPageShow")
  }

  onBackPress(){
    console.error("yz---onBackPress")
  }

  aboutToDisappear(){
    console.error("yz---aboutToDisappear")
  }

  onPageHide(){
    console.error("yz---onPageHide")
  }

  onDestroy(){
    console.error("yz---onDestroy")
  }

  build() {
    Column() {
      Text("第一页")
      Text("跳转下一页").width("50%").height("30%")
        .onClick(()=>{
          router.pushUrl({ url: "pages/SecondPage"})
        })
    }.width("100%").height("100%")
  }
}

3,编写第二个页面

import router from '@ohos.router'

@Entry
@Component
struct SecondPage {

 
  build() {
    Column() {
      Text("第二页")
      Text("返回上一页").width("50%").height("30%")
        .onClick(()=>{
          router.pushUrl({ url: "pages/FirstPage"})
        })
    }.width("100%").height("100%")
  }
}

运行:

点击下一页

日志:

2.2 使用router.replaceUrl

import router from '@ohos.router'

@Entry
@Component
struct FirstPage {

  aboutToAppear(){
    console.error("yz---aboutToAppear")
  }

  onPageShow(){
    console.error("yz---onPageShow")
  }

  onBackPress(){
    console.error("yz---onBackPress")
  }

  aboutToDisappear(){
    console.error("yz---aboutToDisappear")
  }

  onPageHide(){
    console.error("yz---onPageHide")
  }

  onDestroy(){
    console.error("yz---onDestroy")
  }

  build() {
    Column() {
      Text("第一页")
      Text("跳转下一页").width("50%").height("30%")
        .onClick(()=>{
          router.replaceUrl({ url: "pages/SecondPage"})
        })
    }.width("100%").height("100%")
  }
}

日志输出:

2.3 使用Single模式

import router from '@ohos.router'

@Entry
@Component
struct FirstPage {

  aboutToAppear(){
    console.error("yz---aboutToAppear")
  }

  onPageShow(){
    console.error("yz---onPageShow")
  }

  onBackPress(){
    console.error("yz---onBackPress")
  }

  aboutToDisappear(){
    console.error("yz---aboutToDisappear")
  }

  onPageHide(){
    console.error("yz---onPageHide")
  }

  onDestroy(){
    console.error("yz---onDestroy")
  }

  build() {
    Column() {
      Text("第一页")
      Text("跳转下一页").width("50%").height("30%")
        .onClick(()=>{
          router.pushUrl({ url: "pages/SecondPage"},router.RouterMode.Single)
        })
    }.width("100%").height("100%")
  }
}

运行输出:

2.4 带参数的跳转

如果需要在跳转时传递一些数据给目标页面,则可以在调用Router模块的方法时,添加一个params属性,并指定一个对象作为参数。

1,定义一个data类:

import YuanZhen from './YuanZhen';

export default class Data {
  id: number = 0;
  info: YuanZhen|null = null;

  constructor(id: number, info: YuanZhen) {
    this.id = id;
    this.info = info;
  }
}

2,在第一页传递参数,跳转下一页

import router from '@ohos.router'
import Data from './bean/Data'
import YuanZhen from './bean/YuanZhen'

@Entry
@Component
struct FirstPage {

  @State yuanZhen:YuanZhen =new YuanZhen("袁震",18)

  aboutToAppear(){
    console.error("yz---aboutToAppear")
  }

  onPageShow(){
    console.error("yz---onPageShow")
  }

  onBackPress(){
    console.error("yz---onBackPress")
  }

  aboutToDisappear(){
    console.error("yz---aboutToDisappear")
  }

  onPageHide(){
    console.error("yz---onPageHide")
  }

  onDestroy(){
    console.error("yz---onDestroy")
  }

  build() {
    Column() {
      Text("第一页")
      Text("跳转下一页").width("50%").height("30%")
        .onClick(()=>{
          router.pushUrl({ url: "pages/SecondPage", params: new Data(222,this.yuanZhen)},router.RouterMode.Single)
        })
    }.width("100%").height("100%")
  }
}

3,在第二页接收第一页的参数并展示

import router from '@ohos.router'
import Data from './bean/Data'
import YuanZhen from './bean/YuanZhen'

@Entry
@Component
struct SecondPage {
  yuanZhen : YuanZhen =new YuanZhen("袁震2",10)
  aboutToAppear(){
    let params:Data  =router.getParams() as Data
    this.yuanZhen =params.info as YuanZhen
  }

  build() {
    Column() {
      Text("第二页:name:"+this.yuanZhen.name+",age:"+this.yuanZhen.age)
      Text("返回上一页").width("50%").height("30%")
        .onClick(()=>{
          router.replaceUrl({ url: "pages/FirstPage"})
        })
    }.width("100%").height("100%")
  }
}

跳转到第二页后展示第一页传过来的数据 

 三,页面返回

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

 3.1返回到上一个页面

import router from '@ohos.router'
import Data from './bean/Data'
import YuanZhen from './bean/YuanZhen'

@Entry
@Component
struct SecondPage {
  yuanZhen : YuanZhen =new YuanZhen("袁震2",10)
  aboutToAppear(){
    let params:Data  =router.getParams() as Data
    this.yuanZhen =params.info as YuanZhen
  }

  build() {
    Column() {
      Text("第二页:name:"+this.yuanZhen.name+",age:"+this.yuanZhen.age)
      Text("返回上一页").width("50%").height("30%")
        .onClick(()=>{
          router.back()
        })
    }.width("100%").height("100%")
  }
}

3.2 返回到指定页面

import router from '@ohos.router'
import Data from './bean/Data'
import YuanZhen from './bean/YuanZhen'

@Entry
@Component
struct SecondPage {
  yuanZhen : YuanZhen =new YuanZhen("袁震2",10)
  aboutToAppear(){
    let params:Data  =router.getParams() as Data
    this.yuanZhen =params.info as YuanZhen
  }

  build() {
    Column() {
      Text("第二页:name:"+this.yuanZhen.name+",age:"+this.yuanZhen.age)
      Text("返回上一页").width("50%").height("30%")
        .onClick(()=>{
          router.back({url:'pages/FirstPage'})
        })
    }.width("100%").height("100%")
  }
}

3.3返回到指定页面,并传递自定义参数信息

import router from '@ohos.router'
import Data from './bean/Data'
import YuanZhen from './bean/YuanZhen'

@Entry
@Component
struct SecondPage {
  yuanZhen : YuanZhen =new YuanZhen("袁震2",10)
  aboutToAppear(){
    let params:Data  =router.getParams() as Data
    this.yuanZhen =params.info as YuanZhen
  }

  build() {
    Column() {
      Text("第二页:name:"+this.yuanZhen.name+",age:"+this.yuanZhen.age)
      Text("返回上一页").width("50%").height("30%")
        .onClick(()=>{
          router.back({
            url:'pages/FirstPage',
            params: {
            info: '来自第二页'
          }})
        })
    }.width("100%").height("100%")
  }
}

这种方式不仅可以返回到指定页面,还可以在返回的同时传递自定义参数信息。这些参数信息可以在目标页面中通过调用router.getParams()方法进行获取和解析。

在目标页面中,在需要获取参数的位置调用router.getParams()方法即可:

import router from '@ohos.router'
import Data from './bean/Data'
import YuanZhen from './bean/YuanZhen'

@Entry
@Component
struct FirstPage {

  @State yuanZhen:YuanZhen =new YuanZhen("袁震",18)

  aboutToAppear(){
    console.error("yz---aboutToAppear")
  }

  onPageShow(){
    console.error("yz---onPageShow:"+JSON.stringify(router.getParams()))
  }

  onBackPress(){
    console.error("yz---onBackPress")
  }

  aboutToDisappear(){
    console.error("yz---aboutToDisappear")
  }

  onPageHide(){
    console.error("yz---onPageHide")
  }

  onDestroy(){
    console.error("yz---onDestroy")
  }

  build() {
    Column() {
      Text("第一页")
      Text("跳转下一页").width("50%").height("30%")
        .onClick(()=>{
          router.pushUrl({ url: "pages/SecondPage", params: new Data(222,this.yuanZhen)},router.RouterMode.Single)
        })
    }.width("100%").height("100%")
  }
}

输出:

 注意:

当使用router.back()方法返回到指定页面时,原栈顶页面(包括)到指定页面(不包括)之间的所有页面栈都将从栈中弹出并销毁。

另外,如果使用router.back()方法返回到原来的页面,原页面不会被重复创建,因此使用@State声明的变量不会重复声明,也不会触发页面的aboutToAppear()生命周期回调。如果需要在原页面中使用返回页面传递的自定义参数,可以在需要的位置进行参数解析。例如,在onPageShow()生命周期回调中进行参数解析。

 四,页面返回前增加一个询问框

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

4.1系统默认询问框

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

如果想要在目标界面开启页面返回询问框,需要在调用router.back()方法之前,通过调用​​​​​​​router.showAlertBeforeBackPage()方法设置返回询问框的信息

import router from '@ohos.router'
import Data from './bean/Data'
import YuanZhen from './bean/YuanZhen'

@Entry
@Component
struct SecondPage {
  yuanZhen : YuanZhen =new YuanZhen("袁震2",10)
  aboutToAppear(){
    let params:Data  =router.getParams() as Data
    this.yuanZhen =params.info as YuanZhen
  }

  build() {
    Column() {
      Text("第二页:name:"+this.yuanZhen.name+",age:"+this.yuanZhen.age)
      Text("返回上一页").width("50%").height("30%")
        .onClick(()=>{
          router.showAlertBeforeBackPage({message:"确认退出吗?"})
          router.back({
            url:'pages/FirstPage',
            params: {
            info: '来自第二页'
          }})
        })
    }.width("100%").height("100%")
  }
}

 

4.2 自定义询问框

自定义询问框的方式,可以使用弹窗或者自定义弹窗实现。这样可以让应用界面与系统默认询问框有所区别,提高应用的用户体验度。

import router from '@ohos.router'
import Data from './bean/Data'
import YuanZhen from './bean/YuanZhen'
import promptAction from '@ohos.promptAction'

@Entry
@Component
struct SecondPage {
  yuanZhen : YuanZhen =new YuanZhen("袁震2",10)
  aboutToAppear(){
    let params:Data  =router.getParams() as Data
    this.yuanZhen =params.info as YuanZhen
  }

  build() {
    Column() {
      Text("第二页:name:"+this.yuanZhen.name+",age:"+this.yuanZhen.age)
      Text("返回上一页").width("50%").height("30%")
        .onClick(()=>{
          promptAction.showDialog({message:"您确认退出吗",buttons:[{text:"不确认",color:"#232"},{text:"确认",color:"#262"}]})
            .then((result:promptAction.ShowDialogSuccessResponse)=>{
              if(result.index==0){
                // 用户点击了“取消”按钮
              }else if(result.index==1){
                router.back()
              }
            })
            .catch((error:Error)=>{
              console.error("yz----返回错误")
            })


        })
    }.width("100%").height("100%")
  }
}

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

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

相关文章

您没有专业应用组许可,请联系系统管理员分配许可!

项目场景: 金蝶云星空客户端 问题描述 您没有专业应用组许可,请联系系统管理员分配许可! 解决方案: 第一步:使用管理员账号登录, 第二步:查询用户》勾选指定用户》注册用户同步

分类预测 | Matlab实现KPCA-EBWO-SVM分类预测,基于核主成分分析和改进的白鲸优化算法优化支持向量机分类预测

分类预测 | Matlab实现KPCA-EBWO-SVM分类预测,基于核主成分分析和改进的白鲸优化算法优化支持向量机分类预测 目录 分类预测 | Matlab实现KPCA-EBWO-SVM分类预测,基于核主成分分析和改进的白鲸优化算法优化支持向量机分类预测分类效果基本描述程序设计参…

Microsoft Word 删除空行

Microsoft Word 删除空行 1. 删除空行1.1. 替换1.2. 段落标记 References 1. 删除空行 1.1. 替换 1.2. 段落标记 特殊格式 -> 段落标记 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

python PyQt5的学习

一、安装与配置 1、环境: python3.7 2、相关模块 pip install pyqt5 pyqt5-tools pyqt5designer 可以加个镜像 -i https://pypi.tuna.tsinghua.edu.cn/simple3、配置设计器 python的pyqt5提供了一个设计器,便于ui的设计 界面是这样的&#xff1a…

django后台手机号加密存储

需求: 1 :员工在填写用户的手机号时,直接填写,在django后台中输入 2:当员工在后台确认要存储到数据库时,后台将会把手机号进行加密存储,当数据库被黑之后,手机号字段为加密字符 3&am…

51单片机_智能家居终端

实物演示效果: https://www.bilibili.com/video/BV1bh4y1A7ZW/?vd_source6ff7cd03af95cd504b60511ef9373a1d 51单片机是否适合做多功能智能家居控制系统?51单片机的芯片是否具有与WiFi通信的能力?如果有的话,具体有哪些芯片啊&a…

day4:多点通信与域套接字

思维导图 使用tftp实现简单文件的上传 #include <head.h> #define SER_PORT 69 #define SER_IP "192.168.125.223" int link_file() {int sfdsocket(AF_INET,SOCK_DGRAM,0);if(sfd-1){perror("socket error");return -1;}return sfd; } int filedow…

从0开始python学习-49.pytest之日志封装和allure封装

目录 日志封装 1. 在pytest.ini中配置日志的格式 2. 生成日志对象--在请求封装中写 3. 把日志写入文件--在请求封装中写 allure封装 1. 在yaml用例中写入需要的模块、接口等内容 2. 在测试用例封装的函数中通过allure.dynamic的方法写入需要的数据 日志封装 1. 在pytest.…

【动态规划】【数学】【C++算法】18赛车

作者推荐 视频算法专题 本文涉及知识点 动态规划 数学 LeetCode818赛车 你的赛车可以从位置 0 开始&#xff0c;并且速度为 1 &#xff0c;在一条无限长的数轴上行驶。赛车也可以向负方向行驶。赛车可以按照由加速指令 ‘A’ 和倒车指令 ‘R’ 组成的指令序列自动行驶。 当…

EI级 | Matlab实现VMD-TCN-BiLSTM变分模态分解结合时间卷积双向长短期记忆神经网络多变量光伏功率时间序列预测

EI级 | Matlab实现VMD-TCN-BiLSTM变分模态分解结合时间卷积双向长短期记忆神经网络多变量光伏功率时间序列预测 目录 EI级 | Matlab实现VMD-TCN-BiLSTM变分模态分解结合时间卷积双向长短期记忆神经网络多变量光伏功率时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基…

开发实践7_project

要求&#xff1a; 表单类&#xff0c;上传img到服务器某路径&#xff0c;再显示在网页。 结果&#xff1a; &#xff08;图片 网页来源 无水印 不能明确出处&#xff09; upload_app form.py // class UploadForm(forms.Form):img forms.ImageField(label"img"…

macOS 13(本机)golang程序交叉编译成 ARM架构

## 背景 golang程序&#xff08;JuiceFS&#xff09;需要支持ARM64架构&#xff0c;重新编译&#xff1b; 本地环境&#xff1a;macOS&#xff1a;13 ## 操作 安装交叉编译工具&#xff1a; brew install FiloSottile/musl-cross/musl-cross --with-aarch64 可以在 /usr/l…

Codeforces Round 919 (Div. 2) A~E

A. Satisfying Constraints(模拟) 题意&#xff1a; 给出 n n n个限制条件&#xff0c;问有多少个数字 k k k同时满足这些限制条件。 限制条件分为以下三种&#xff1a; k k k必须大于等于给出的一些数字 x x x k k k必须小于等于给出的一些数字 x x x k k k不能与给出的…

DP读书:《openEuler操作系统》(七)FSCK与VFS虚拟文件系统

10min速通FSCK、原子操作与VFS 文件系统检查器1.检查inode表1) 遍历所有inode2) 修复多次引用数据块 2.检查目录结构3.检查目录的连接1) 检查根目录确保存在2) 遍历所有目录的inode,有问题的连接到/lostfound 4.检查引用次数5.检查位图一致性 日志1.主要的数据结构1) 原子操作描…

YOLOv5改进 | 检测头篇 | 利用DynamicHead增加辅助检测头进行针对性检测(让小目标无所遁形)

一、本文介绍 本文给大家带来的改进机制是针对性的改进,针对于小目标检测增加P2层,利用DynamicHead(原版本一比一复现,全网独一份,不同于网上魔改版本)进行检测,其中我们增加P2层其拥有更高的分辨率,这使得模型能够更好地捕捉到小尺寸目标的细节。在这些的基础上配合Dyn…

昇思MindSpore技术公开课——第三课:GPT

1、学习总结 1.1Unsupervised Language Modelling GPT代表“生成预训练”&#xff08;Generative Pre-trained Transformer&#xff09;。GPT模型是由OpenAI公司开发的一种基于Transformer架构的人工智能语言模型。它在大规模文本数据上进行预训练&#xff0c;学习了丰富的语…

uni-app中代理的两种配置方式

方式一: 在项目的 manifest.json 文件中点击 源码视图 在最底部的vue版本下编写代理代码 方式二: 在项目中创建 vue.config.js 文件然后进行配置 在页面中发起请求 完整的url&#xff1a;http://c.m.163.com/recommend/getChanListNews?channelT1457068979049&size10 …

【开源】基于JAVA的河南软件客服系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统管理人员2.2 业务操作人员 三、系统展示四、核心代码4.1 查询客户4.2 新增客户跟进情况4.3 查询客户历史4.4 新增服务派单4.5 新增客户服务费 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的河…

C++11 的新特性 ——final override default

链接&#xff1a;final 说明符 (C11 起) - cppreference.com 目录 final的使用 1、不能使用 "final" 修饰符声明非虚函数 2、无法重写基类的“final”函数 "A::foo" 3、不能将“final”类类型用作基类 override 的使用 &#xff1a; 重写父类的虚函数…

前端:布局(用于div中有多行元素,一行只显示四个,最左或最右要紧贴父div,最顶层和最底层也要紧贴父div)

效果 一、flex实现 html <!DOCTYPE html> <html><head><title>Flexbox Layout</title><style>.container {display: flex;flex-wrap: wrap;justify-content: space-between;gap: 10px;border: 1px solid red;}.box {flex: 1 0 calc(25% …