深入解析鸿蒙系统的页面路由(Router)机制

news2024/11/25 4:28:12

鸿蒙系统以其独特的分布式架构和跨设备的统一体验而备受瞩目。在这个系统中,页面路由(Router)机制是连接应用各页面的关键组成部分。本文将深入探讨鸿蒙系统的页面路由,揭示其工作原理、特点以及在应用开发中的实际应用。

1. 实现

1.1. 两种跳转模式

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

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

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

1.2. 两种实例模式

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

  • Standard:标准实例模式,也是默认情况下的实例模式。每次调用该方法都会新建一个目标页,并压入栈顶。

  • Single:单实例模式。即如果目标页的url在页面栈中已经存在同url页面,则离栈顶最近的同url页面会被移动到栈顶,并重新加载;如果目标页的url在页面栈中不存在同url页面,则按照标准模式跳转。

2. 页面路由的工作原理

鸿蒙系统的页面路由基于一种轻量级的栈式管理结构。每个页面都有一个唯一的标识符,当页面切换时,页面路由根据标识符入栈或出栈,实现页面的切换和管理。

3. 具体实现

3.1. 引入Router模块

import router from '@ohos.router';

3.2. 代码示例

LoginPage.ets


import router from '@ohos.router';
import promptAction from '@ohos.promptAction';

@Entry
@Component
struct LoginPage {
  @State message: string = 'Login Page'

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)


        Button('跳转1')
          .width(100)
          .margin({ top: 10 })
          .onClick(() => {
            router.pushUrl({ url: 'pages/HomePage', params: { msg: 'hello world,我是上一个页面传递过来的' } },
              router.RouterMode.Standard, (err) => {
                if (err) {
                  promptAction.showToast({ message: `跳转失败:code is ${err.code}, message is ${err.message}` })
                  return;
                } else {
                  promptAction.showToast({ message: `跳转成功` })
                }

              }
            )

          })

        Button('跳转2')
          .width(100)
          .margin({ top: 10 })
          .onClick(() => {
            router.pushUrl({ url: 'pages/HomePage' },
              router.RouterMode.Single, (err) => {
                if (err) {
                  promptAction.showToast({ message: `跳转失败:code is ${err.code}, message is ${err.message}` })
                  return;
                } else {
                  promptAction.showToast({ message: `跳转成功` })
                }

              }
            )

          })

        Button('跳转3')
          .width(100)
          .margin({ top: 10 })
          .onClick(() => {
            router.replaceUrl({ url: 'pages/HomePage' },
              router.RouterMode.Single, (err) => {
                if (err) {
                  promptAction.showToast({ message: `跳转失败:code is ${err.code}, message is ${err.message}` })
                  return;
                } else {
                  promptAction.showToast({ message: `跳转成功` })
                }

              }
            )
          })

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

HomePage.ets


import router from '@ohos.router';
import promptAction from '@ohos.promptAction';

@Entry
@Component
struct HomePage {
  @State message: string = 'HomePage'
  @State msg: string = '';

  onPageShow() {
    // 获取传递过来的参数对象
    const params = router.getParams();
    if (params != null && this.msg != null) {
      // 获取info属性的值
      this.msg = params['msg'];
    } else {
      this.msg = '没有参数传递过来'
    }
  }

  build() {
    Row() {
      Column() {

        Text(this.msg)
          .fontSize(20)

        Button('返回上一页').onClick(() => {
          router.back()
        })

        Button('返回指定页面')
          .margin({ top: 10 })
          .onClick(() => {
            router.back({
              url: 'pages/Index'
            })
          })

        Button('页面返回询问框')
          .margin({ top: 10 })
          .onClick(() => {

            // 调用router.showAlertBeforeBackPage()方法,设置返回询问框的信息
            try {
              router.showAlertBeforeBackPage({
                message: '您还没有完成支付,确定要返回吗?' // 设置询问框的内容
              });
            } catch (err) {
              console.error(`Invoke showAlertBeforeBackPage failed, code is ${err.code}, message is ${err.message}`);
            }
            router.back()
          })


        Button('页面返回询问框自定义')
          .margin({ top: 10 })
          .onClick(() => {

            // 弹出自定义的询问框
            promptAction.showDialog({
              message: '您还没有完成支付,确定要返回吗?',
              buttons: [
                {
                  text: '取消',
                  color: '#FF0000'
                },
                {
                  text: '确认',
                  color: '#0099FF'
                }
              ]
            }).then((result) => {
              if (result.index === 0) {
                // 用户点击了“取消”按钮
                console.info('User canceled the operation.');
              } else if (result.index === 1) {
                // 用户点击了“确认”按钮
                console.info('User confirmed the operation.');
                // 调用router.back()方法,返回上一个页面
                router.back();
              }
            }).catch((err) => {
              console.error(`Invoke showDialog failed, code is ${err.code}, message is ${err.message}`);
            })
          })

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

为了能让大家更好的学习鸿蒙 (OpenHarmony) 开发技术,这边特意整理了《鸿蒙 (OpenHarmony)开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙 (OpenHarmony)开发学习手册》:https://qr21.cn/FV7h05

入门必看:https://qr21.cn/FV7h05
1.  应用开发导读(ArkTS)
2.  ……

HarmonyOS 概念:https://qr21.cn/FV7h05

  1. 系统定义
  2. 技术架构
  3. 技术特性
  4. 系统安全

如何快速入门:https://qr21.cn/FV7h05
1.  基本概念
2.  构建第一个ArkTS应用
3.  构建第一个JS应用
4.  ……

开发基础知识:https://qr21.cn/FV7h05
1.  应用基础知识
2.  配置文件
3.  应用数据管理
4.  应用安全管理
5.  应用隐私保护
6.  三方应用调用管控机制
7.  资源分类与访问
8.  学习ArkTS语言
9.  ……

基于ArkTS 开发:https://qr21.cn/FV7h05
1.  Ability开发
2.  UI开发
3.  公共事件与通知
4.  窗口管理
5.  媒体
6.  安全
7.  网络与链接
8.  电话服务
9.  数据管理
10.  后台任务(Background Task)管理
11.  设备管理
12.  设备使用信息统计
13.  DFX
14.  国际化开发
15.  折叠屏系列
16.  ……

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

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

相关文章

同比跌超39%!春节楼市进一步冷却

楼市偏冷的基调延续。今年春节假期楼市热度进一步冷却。从各线城市的销售面积来看,正月初一至初六,30城楼市商品房平均成交面积继续下滑至2019年以来新低,较去年下滑39.2%,其中一线、三线均呈现大幅下滑,而二线城市成交…

Python算法题集_验证二叉搜索树

Python算法题集_验证二叉搜索树 题98:验证二叉搜索树1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【DFS递归】2) 改进版一【DFS递归终止检测】3) 改进版二【BFS迭代终止检测】 4. 最优算法 本文为Python算法题集之一的代码示例 题…

vue-ESlint (六)

代码规范 代码规范:一套写代码的约定规则。例如:"赋值符号的左右是否需要空格" "一句结束是否是要加;" . 老话说:"没有规矩不成方圆" → 正规的团队 需要 统一的编码风格 JavaScript Standard Style 规范说…

Linux文件操作类命令 touch | stat | cp | scp | alias | mv | dd | cat | head | tail

touch 1.创建空文件(只有元数据信息,没有数据段内容)touch 1.txt 2.对创建或已经存在的文件改变元数据信息的时间记录值-d 改变创建时间touch -d 20240101 1.txt -a改变访问时间 -m改变修改时间stat 查看元数据信息 Blocks是512字…

【CV论文精读】【BEV感知】BEVFormer:通过时空Transformer学习多摄像机图像的鸟瞰图表示

【CV论文精读】BEVFormer Learning Bird’s-Eye-View Representation from Multi-Camera Images via Spatiotemporal Transformers BEVFormer:通过时空Transformer学习多摄像机图像的鸟瞰图表示 图1:我们提出了BEVFormer,这是一种自动驾驶的…

2024年最新onlyfans虚拟信用卡订阅教程

一、Onlyfans是什么? OnlyFans是一个允许创作者分享自己的独家内容的平台,简称o站。这个平台允许创作者创建一个订阅服务,粉丝需要支付费用才能访问其独家内容。 本文将教你如何使用虚拟卡在OnlyFans上进行充值。 二、如何使用虚拟卡支付 O…

nba2k23 中国梦之队面补名单

nba2k23 中国梦之队面补名单 提示:本面补为名单形式,内含中国国家队2000、2008、2015、2019面补名单,安装后多队同时存在。 下载地址: https://www.changyouzuhao.cn/12759.html

OpenCV-41 使用掩膜的直方图

一、掩膜 掩膜即为与原图大小一致的黑底白框图。 如何生成掩膜? 先生成一个全黑的和原始图片大小一样大的图片。mask np.zeros(img.shape, np.uint8)将想要的区域通过索引方式设置为255.mask[100:200, 200:300] 示例代码如下: import cv2 import ma…

WINCC如何新增下单菜单,切换显示页面

杭州工控赖工 首先我们先看一下,显示的效果,通过下拉菜单,切换主显示页面。如图一: 图1 显示效果 第一步: 通过元件新增一个组合框,见图2; 组合框的设置,设置下拉框的长宽及组合数…

- 项目落地 - 《选择项目工具的方法论》

本文属于专栏《构建工业级QPS百万级服务》 提纲: 选择大概率能完成业务目标的工具选择最适合的工具制作最适合的工具 本文所说的项目工具,泛指业务软件开发,所依赖的第三方提供的成熟的资源。包括但不限于开发语言、编辑工具、编译工具、三方…

深入解析ESP32C3(3)- bootloader启动流程

ESP32C3启动流程可以分为如下3 个步骤: 一级引导程序(PBL):被固化在了ESP32-C3 内部的ROM 中,它会从flash 的0x0 偏移地址处加载二级引导程序至RAM (IRAM & DRAM) 中。二级引导程序(SBL):从flash 中加载分区表和主程序镜像至…

2.13:C语言测试题

21.(b) 6 22.(b) cd 23.b) 5 4 1 3 2 栈:先进后出 24. b,c,d:10,12,120 25.2,5 26.越界访问,可能正常输出,可能段错误 27. 0,41 28. a)11 b) 320 29. aab; ba-b; aa-b; 30. p150x801005; p250x810…

mysql 2-16

安全等于<> 最大最小LEAST,GREATEST BETWEEN AND 条件一是下限 IN LIKE关键字 转移字符 逻辑运算符 位运算符 排序数据 升序降序&#xff0c;默认升序 二级排序 8.0新特性 小拓展 多表查询 多表查询 别名 多表查询的分类 非等值连接 自连接 内连接与外连接 sql92实现外连…

在JavaScript中的防抖函数 - 通过在React中构建自动完成功能来解释

当你将一个新应用推向生产环境时&#xff0c;你希望确保它用户友好。网站的性能是用户体验的关键部分。每个用户都希望网站及其内容能够快速加载。每一秒都是宝贵的&#xff0c;可能导致用户再也不会访问你的网站。 在本指南中&#xff0c;我们将了解JavaScript中一个非常重要…

17.3.1.3 灰度

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 灰度的算法主要有以下三种&#xff1a; 1、最大值法: 原图像&#xff1a;颜色值color&#xff08;R&#xff0c;G&#xff0c;B&a…

第2讲springsecurity+vue通用权限系统

阿里云 maven阿里云镜像 <?xml version"1.0" encoding"UTF-8"?><!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for addition…

【PyQt】13-对话框

文章目录 前言一、知识储备二、详细展开2.1 通用对话框-QDialog2.1 消息类型对话框-QMessageBox运行结果 2.2 输入对话框 QInputDilog运行结果 2.3 字体对话框-QFontDialog运行结果 2.4 颜色对话框运行结果 2.5 文件对话框运行结果 总结 前言 1、四种形式的对话框。 2、警告框…

如何让Obsidian实现电脑端和安卓端同步

Obsidian是一款知名的笔记软件&#xff0c;支持Markdown语法&#xff0c;它允许用户在多个设备之间同步文件。要在安卓设备上实现同步&#xff0c;可以使用remote save插件&#xff0c;以下是具体操作步骤&#xff1a; 首先是安装电脑端的obsidian&#xff0c;然后依次下载obs…

《Go 简易速速上手小册》第6章:错误处理和测试(2024 最新版)

文章目录 6.1 错误处理机制 - Go 语言中的优雅回旋6.1.1 基础知识讲解6.1.2 重点案例&#xff1a;文件读取器功能描述实现代码 6.1.3 拓展案例 1&#xff1a;网络请求处理器功能描述实现代码 6.1.4 拓展案例 2&#xff1a;数据库查询执行器功能描述实现代码 6.2 编写可测试的代…

GPT SOVITS项目 一分钟克隆 (文字输出)

步骤流程&#xff1a;&#xff08;首先使用UVR 提取人声文件&#xff0c;然后按下面步骤进行&#xff09; 注意这里提交的音频是参考的音频