当前位置: 首页 > article >正文

HarmonyOS应用开发中的页面路由与数据传输

概述

在鸿蒙生态系统的开发进程中,“一次开发,多端部署”的设计理念值得推荐。此外,采用三层工程结构来设计APP的各个模块也是很不错的选择。关于三层工程结构的详细内容可查看以下链接:

HarmonyOS一次开发多端部署三巨头之界面级一多开发_一次开发多端部署的三个层次主要包括界面级一多、功能级一多和工程级一多 - CSDN博客

HarmonyOS一次开发多端部署三巨头之功能级一多开发和工程级一多开发 - CSDN博客

页面路由指的是在应用程序里达成不同页面间的跳转以及数据传递。当运用三层工程结构之后,页面的跳转大多为跨模块跳转,HarmonyOS提供了Router模块,借助不同的url地址,能够便捷地进行页面路由,轻松访问不同的页面。

页面跳转

在应用程序开发中,页面跳转是一个至关重要的组成部分。用户在使用应用程序时,经常需要在不同页面之间进行导航,并且有时需要将数据从一个页面传递到另一个页面。

Router模块提供了两种跳转模式,即router.pushNamedRoute()和router.replaceNamedRoute(),这两种模式决定了目标页面是否会替换当前页面。

  • router.pushNamedRoute():目标页面不会替换当前页面,而是被压入页面栈。这样可以保留当前页面的状态,并且用户可以通过返回键或者调用router.back()方法返回到当前页面。
  • router.replaceNamedRoute():目标页面会替换当前页面,并销毁当前页面。这样可以释放当前页面的资源,并且用户无法再返回到当前页面。

页面栈说明

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

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

  • Standard:标准实例模式,也是默认的实例模式。每次调用该方法都会新建一个目标页,并压入栈顶。
  • Single:单实例模式。即如果目标页的URL在页面栈中已经存在同URL页面,则离栈顶最近的同URL页面会被移动到栈顶,并重新加载;如果目标页的URL在页面栈中不存在同URL页面,则按照标准模式跳转。

实例说明

在使用页面路由Router相关功能之前,需要在代码中先导入Router模块。

import { router } from '@kit.ArkUI';
场景一:保留页面状态

有一个主页(Home)和一个详情页(Detail),希望从主页点击一个商品,跳转到详情页。同时,需要保留主页在页面栈中,以便返回时恢复状态。这种场景下,可以使用pushUrl()方法,并且使用Standard实例模式(或者省略)。

// 在Home页面中
function onJumpClick(): void {
  router.pushNamedRoute({
    name: 'pages/Detail' // 目标url
  }, router.RouterMode.Standard, (err) => {
    if (err) {
      console.error(`Invoke pushUrl failed, code is ${err.code}, message is ${err.message}`);
      return;
    }
    console.info('Invoke pushUrl succeeded.');
  });
}
场景二:销毁登录页

有一个登录页(Login)和一个个人中心页(Profile),希望从登录页成功登录后,跳转到个人中心页。同时,销毁登录页,在返回时直接退出应用。这种场景下,可以使用replaceUrl()方法,并且使用Standard实例模式(或者省略)。

// 在Login页面中
function onJumpClick(): void {
  router.replaceNamedRoute({
    name: 'pages/Profile' // 目标url
  }, router.RouterMode.Standard, (err) => {
    if (err) {
      console.error(`Invoke replaceUrl failed, code is ${err.code}, message is ${err.message}`);
      return;
    }
    console.info('Invoke replaceUrl succeeded.');
  })
}
场景三:单实例模式

有一个设置页(Setting)和一个主题切换页(Theme),希望从设置页点击主题选项,跳转到主题切换页。同时,需要保证每次只有一个主题切换页存在于页面栈中,在返回时直接回到设置页。这种场景下,可以使用pushNamedRoute()方法,并且使用Single实例模式。

// 在Setting页面中
function onJumpClick(): void {
  router.pushNamedRoute({
    name: 'pages/Theme' // 目标url
  }, router.RouterMode.Single, (err) => {
    if (err) {
      console.error(`Invoke pushUrl failed, code is ${err.code}, message is ${err.message}`);
      return;
    }
    console.info('Invoke pushUrl succeeded.');
  });
}
场景四:已查看结果的跳转

有一个搜索结果列表页(SearchResult)和一个搜索结果详情页(SearchDetail),希望从搜索结果列表页点击某一项结果,跳转到搜索结果详情页。同时,如果该结果已经被查看过,则不需要再新建一个详情页,而是直接跳转到已经存在的详情页。这种场景下,可以使用replaceUrl()方法,并且使用Single实例模式。

// 在SearchResult页面中
function onJumpClick(): void {
  router.replaceNamedRoute({
    name: 'pages/SearchDetail' // 目标url
  }, router.RouterMode.Single, (err) => {
    if (err) {
      console.error(`Invoke replaceUrl failed, code is ${err.code}, message is ${err.message}`);
      return;
    }
    console.info('Invoke replaceUrl succeeded.');
  })
}

参数传递

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

class DataModelInfo {
  age: number;
}

class DataModel {
  id: number;
  info: DataModelInfo;
}

function onJumpClick(): void {
  // 在Home页面中
  let paramsInfo: DataModel = {
    id: 123,
    info: {
      age: 20
    }
  };

  router.pushUrl({
    url: 'pages/Detail', // 目标url
    params: paramsInfo // 添加params属性,传递自定义参数
  }, (err) => {
    if (err) {
      console.error(`Invoke pushUrl failed, code is ${err.code}, message is ${err.message}`);
      return;
    }
    console.info('Invoke pushUrl succeeded.');
  })
}

在目标页中,可以通过调用Router模块的getParams()方法来获取传递过来的参数。例如:

const params = router.getParams(); // 获取传递过来的参数对象
const id = params['id']; // 获取id属性的值
const age = params['info'].age; // 获取age属性的值

页面返回

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

在使用页面路由Router相关功能之前,需要在代码中先导入Router模块。

import { router } from '@kit.ArkUI';
方式一:返回上一页

可以使用router.back()方法返回到上一个页面。这种方式会返回到上一个页面,即上一个页面在页面栈中的位置。但是,上一个页面必须存在于页面栈中才能够返回,否则该方法将无效。

router.back();
方式二:返回指定页面

可以使用router.back({ url: ‘pages/Home’ })方法返回到指定页面。这种方式可以返回到指定页面,需要指定目标页的路径。目标页必须存在于页面栈中才能够返回。

方式三:返回指定页面并传递参数

可以使用router.back({ url: ‘pages/Home’, params: { info: ‘来自Home页’ } })方法返回到指定页面,并传递自定义参数信息。这些参数信息可以在目标页中通过调用router.getParams()方法进行获取和解析。

在目标页中,在需要获取参数的位置调用router.getParams()方法即可,例如在onPageShow()生命周期回调中:

onPageShow() {
  const params = router.getParams(); // 获取传递过来的参数对象
  const info = params['info']; // 获取info属性的值
}

说明

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

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


http://www.kler.cn/a/409427.html

相关文章:

  • 51c多模态~合集3
  • Python和C++急性损伤空间结构
  • Axios案例练习
  • python如何解压缩文件或文件夹
  • Spring Boot + ActiveMQ Artemis:快速实现高效消息队列处理功能
  • Swift 实现查找链表入环点:快慢指针法
  • C语言之为表达式计算器实现定义变量和使用变量功能
  • 大数据的数据整合
  • 【linux】插入新硬盘如何配置:格式化、分区、自动挂载(Ubuntu)
  • 表格数据处理中大语言模型的微调优化策略研究
  • Python 使用 OpenCV 将 MP4 转换为 GIF图
  • 新华三H3CNE网络工程师认证—子接口技术
  • 任子行网络安全审计系统 log_fw_ips_scan_jsondata SQL注入漏洞复现
  • java基础(一):JDK、JRE、JVM、类库等概念,java跨平台实现原理
  • On-Chip-Network之Topology
  • Pytorch自定义算子反向传播
  • cirros-0.3.4-x86_64-disk.img
  • 【Linux】使用nohup命令实现不挂断的后台运行
  • ECharts柱状图-带圆角的堆积柱状图,附视频讲解与代码下载
  • [Leetcode小记] 3233. 统计不是特殊数字的数字数量
  • shell脚本-笔记27
  • 《CSDN及其旗下产品:构建中国IT行业的知识与技术生态》
  • Java开发经验——SpringRestTemplate常见错误
  • 【C++】static修饰的“静态成员函数“--静态成员在哪定义?静态成员函数的作用?
  • 【论文笔记】Improved Baselines with Visual Instruction Tuning
  • 掌握移动端性能测试利器:深入JMeter手机录制功能