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

鸿蒙路由通信(路由跳转/参数传递)

路由通信:
在鸿蒙中路由提供了两种方案:
1、Natigation:这种方案是目前官方推荐我们使用,这种方案涵盖的内容比较多。底部tabbar,顶部菜单,返回等等。集合了页面中各种跳转、返回、菜单等功能。
2、router路由:router里也有类似于以前vue或者react框架中提供的路由对象。在代码中调用它的api来实现路由的跳转、返回、参数的传递。

router路由跳转:
1、pushUrl:代表跳转页面的时候,将老的地址和新的地址都加入到页面执行栈。可以实现跳转后的记录信息,可以返回到指定的页面。 
2、replaceUrl:目标页面会替换当前页,并销毁当前页。无法记录历史。无法返回跳转之前。

router的模式:
1、Standard:多实例模式,按照pushUrl来跳转,每次跳转路径都会放在执行栈当中,不会去管执行栈中是否存在同样的路由路径。
2、Single:单实例模式,按照pushUrl来跳转,每次跳转的路径都会在执行栈当中,如果下次访问同一个路径,默认将执行栈中存在的路径放在栈顶。
执行栈当中同样的路径只会存在一次。

跳转的API:
引入我们需要的router对象
import { router } from '@kit.ArkUI'
调用router进行页面跳转
.onClick(()=>{
    router.pushUrl({
    url:'pages/PageAdd'
    })
})
.onClick(()=>{
    router.replaceUrl({
    url:'pages/PageAdd'
    })
})
其中replaceUrl跳转过后无法实现返回到当前页面。
完整的写法:
.onClick(() => {
      router.pushUrl({
        url: 'pages/PageAdd'
      }, router.RouterMode.Standard, (err) => {
        if (err) {
          console.log('路由跳转失败')
        }
      })
    })
总结:
1、路由跳转过程中,可以只传递第一个参数。里面包含跳转的地址和传递参数。
2、路由跳转过程中,第二个参数可以省略。也可以加上。不写默认就是Standard模式。
3、参数三代表跳转结果。err值决定了是否有错误。

router 路由参数传递:
路由参数传递需要在前一个页面中传递的参数对象。
在后一个页面中接受传递过来的对象。
参数在传递过程中,对于参数类型是默认Object类型,在第二个页面中获取参数的时候,类型推断
只能推断结果为Object类型,造成后续使用的时候,ts无法明确参数格式。
页面一:
params就是路由传递参数的时候,默认属性。内容默认为Object,所以你可以传递任何结果。
.onClick(() => {
      router.pushUrl({
        url: 'pages/PageAdd',
    params:{value:item}
      }, router.RouterMode.Standard, (err) => {
        if (err) {
          console.log('路由跳转失败')
        }
      })
    })

页面二:
获取到参数也默认为object.
获取到的params变量默认为object类型。后续在使用的时候出现类型无法明确,进行报错。
params.value // 报错
为了解决我们路由传递参数的约束问题,我们在viewmodel/paramstyle.ets文件进行约束。其中用到了泛型的概念。
约束我们接受到的结果必须有value属性。
value属性由用户自己来定义。
export class ParamsType<T> {
  value:T
  constructor(value:T) {
    this.value = value
  }
}

aboutToAppear(): void {
    // 获取到路由传递过来的参数 params获取到的结果,默认类型是object
    const params = router.getParams()
    console.log(typeof params)
    // 告诉我们编辑器,我明确知道params对象数据类型为ParamsType
    const taskDetail = (params as ParamsType<TaskModel>).value
    console.log(taskDetail.taskName)
}
这段代码采用了工具类约束接受到路由结果。其中用到了类型断言的知识点。
类型断言:我告诉编辑器,我比你更明白我的代码数据类型。不用自己去推断类型。


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

相关文章:

  • <论文>时序大模型如何应用于金融领域?
  • 【解决】okhttp的java.lang.IllegalStateException: closed错误
  • [创业之路-243]:《华为双向指挥系统》-1-组织再造-企业不同组织形式下的指挥线的种类?
  • Ubuntu中使用miniconda安装R和R包devtools
  • CES Asia 2025科技盛宴,AI智能体成焦点
  • 【算法与数据结构】—— 回文问题
  • 搭建prometheus+grafana监控系统抓取Linux主机系统资源数据
  • 《框架程序设计》复习题解析-2
  • docker 自建rustdesk服务器测试
  • 51单片机和STM32集成蓝牙模块实用指南
  • 多个表单使用相同的 ref 和 rules,表单验证规则不生效
  • 前端开发:Web前端和HTML
  • Flutter 3.x 版本升级实战:让老项目焕发新生
  • 深入理解 Spring MVC 中的 @ModelAttribute 注解
  • 【Python学习系列】数据类型(二)
  • 《DOM NodeList》
  • Openstack持久存储-Swift,Cinder,Manila三者之间的区别
  • 【对象存储】-- s3:\\、s3n:\\、s3a:\\ 简介
  • 力扣 岛屿数量
  • 在线游戏靶场【overthewire.org】之linux基础练兵场
  • Github 2025-01-09 Go开源项目日报 Top10
  • docker--小白--导入timescaledb
  • 使用 WPF 和 C# 绘制图形
  • 稀疏编码 (Sparse Coding) 算法详解与PyTorch实现
  • linux:文件的创建/删除/复制/移动/查看/查找/权限/类型/压缩/打包
  • Android RIL(Radio Interface Layer)全面概述和知识要点(3万字长文)