【鸿蒙 HarmonyOS 4.0】路由router

news/2024/7/21 10:37:56 标签: harmonyos, 华为

一、介绍

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

二、页面跳转

2.1、两种跳转模式:

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

2.2、两种实例模式

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

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

2.3、使用步骤

2.3.1、导入Router模块

import router from '@ohos.router';

2.3.2、利用router实现跳转、返回等操作

2.3.2.1、不带参数传递的场景

场景1:登录页跳转到首页,需要保留主页在页面栈中,以便返回时恢复状态。

使用pushUrl()方法,并且使用Standard实例模式

import router from '@ohos.router'
@Entry
@Component
struct LoginPage {
  @State message: string = 'login'

  build() {
    Row() {
      Column({space:6}) {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
        Button('跳转到home页面--pushUrl')
          .fontSize(20)
          .onClick(() =>{
            router.pushUrl(
              {
                url:'pages/HomePage'
              },
              router.RouterMode.Standard,
              (err) => {
                if(err){
                  console.log('路由失败')
                }
              }
            )
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

场景1中,登录跳转到首页时,需要保证每次首页存在于页面栈中,在返回时直接回到登录页。 需要将示例模式更换成Single,即:router.RouterMode.Single

场景2:登录页跳转到首页,销毁登录页,在返回时直接退出应用。

使用replaceUrl()方法,并且使用Standard实例模式

import router from '@ohos.router'
@Entry
@Component
struct LoginPage {
  @State message: string = 'login'

  build() {
    Row() {
      Column({space:6}) {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
        Button('跳转到home页面--replaceUrl')
          .fontSize(20)
          .onClick(() =>{
            router.replaceUrl(
              {
                url:'pages/HomePage'
              },
              router.RouterMode.Standard,
              (err) => {
                if(err){
                  console.log('路由失败')
                }
              }
            )
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

场景2中,登录跳转到首页时,如果已经存在了就不再新建首页,直接跳转到首页。 需要将示例模式更换成Single,即:router.RouterMode.Single

2.3.2.2、带参数传递的场景

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

        Button('跳转到home页面--pushUrl')
          .fontSize(20)
          .onClick(() =>{
            router.pushUrl(
              {
                url:'pages/HomePage',
                params:{id:1}
              },
              router.RouterMode.Standard,
              (err) => {
                if(err){
                  console.log('路由失败')
                }
              }
            )
          })

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

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

三、页面返回

3.1、三种返回方式

3.1.1、返回到上一个页面。

router.back();

3.1.2、返回到指定页面

router.back({
  url: 'pages/Info'
});

这种方式可以返回到指定页面,需要指定目标页的路径。目标页必须存在于页面栈中才能够返回。

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

router.back({
  url: 'pages/Info',
  params: {
    id:1
  }
});

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

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

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

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

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

4.1、系统默认询问框

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

例如,在Home页面中定义一个返回按钮的点击事件处理函数,点击按钮时弹出询问框,点击确定按钮再返回到登录页

import router from '@ohos.router'
@Entry
@Component
struct HomePage {
  @State message: string = 'Home'
  @State params:any = router.getParams()

  build() {
    Row() {
      Column({space:6}) {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
        Text('接收login传递的id:' + this.params.id)
          .fontSize(30)
          .fontWeight(FontWeight.Bold)
        Button('返回到login页面')
          .fontSize(20)
          .onClick(() => {
            router.showAlertBeforeBackPage({
              message:'确定返回到login页面吗?'
            })
            router.back()
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

其中,router.showAlertBeforeBackPage()方法接收一个对象作为参数,该对象包含以下属性:

  • message:string类型,表示询问框的内容。

    当用户点击“返回”按钮时,会弹出确认对话框,询问用户是否确认返回。选择“取消”将停留在当前页目标页;选择“确认”将触发router.back()方法,并根据参数决定如何执行跳转。

4.2、自定义询问框

点击按钮时,调用弹窗的promptAction.showDialog()方法:

import router from '@ohos.router'
import promptAction from '@ohos.promptAction'
@Entry
@Component
struct HomePage {
  @State message: string = 'Home'
  @State params:any = router.getParams()

  build() {
    Row() {
      Column({space:6}) {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
        Text('接收login传递的id:' + this.params.id)
          .fontSize(30)
          .fontWeight(FontWeight.Bold)
        Button('返回到login页面')
          .fontSize(20)
          .onClick(() => {
            promptAction.showDialog({
              message:'确定返回到login页面吗?',
              buttons: [
                {
                  text: '取消',
                  color: '#FF0000'
                },
                {
                  text: '确认',
                  color: '#0099FF'
                }
                ]
            }).then((result)=>{
              if(result.index === 0){
                // 用户点击了“取消”按钮
                console.log('点击了取消按钮')
              }else if(result.index === 1){
                // 用户点击了“确认”按钮
                console.log('用户点击了“确认”按钮')
                // 调用router.back()方法,返回上一个页面
                router.back();
              }
            }).catch(err => {
              console.error(`Invoke showDialog failed, code is ${err.code}, message is ${err.message}`);
            })
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

当用户点击“返回”按钮时,会弹出自定义的询问框,询问用户是否确认返回。选择“取消”将停留在当前页目标页;选择“确认”将触发router.back()方法,并根据参数决定如何执行跳转。

最后:👏👏😊😊😊👍👍 


http://www.niftyadmin.cn/n/5388699.html

相关文章

蓝桥杯备赛系列——倒计时50天!

蓝桥杯备赛系列 倒计时50天! 前缀和和差分 知识点 **前缀和数组:**假设原数组用a[i]表示,前缀和数组用sum[i]表示,那么sum[i]表示的是原数组前i项之和,注意一般用前缀和数组时,原数组a[i]的有效下标是从…

C++之STL:vetor容器

STL中的序列式容器主要包括 vector 向量容器、list 列表容器以及 deque 双端队列容器。 vector 实现的是一个动态数组。 定义在 <vector> 头文件中。 #include <iostream> #include <vector> using namespace std; int main() {//初始化一个空vectorvecto…

DT DAY3 信号和槽

作业&#xff1a; 1> 思维导图 2> 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 btn3 new QPushButton("按钮3",this);btn3->resize(ui->btn2->width(),ui->b…

个人博客系列-项目部署-nginx(3)

使用Nginx uwsgi进行部署django项目 一. 检查项目是否可以运行 启动项目 python manage.py runserver 0.0.0.0:8099输入ip:8099 查看启动页面 出现上述页面表示运行成功 二. 安装uwsgi并配置 2.1 下载uwsgi pip install uwsgi新建文件test.py写入内容&#xff0c;测试一…

c语言经典测试题3

1.题1 int a 248, b 4; int const *c 21; const int *d &a; int *const e &b; int const * const f &a; 请问下列表达式哪些会被编译器禁止&#xff1f; A: *c 32; B: *d 43 C: e&a D: f0x321f 我们来分析一下&#xff1a;const用来修饰变量是想其…

开源图表库Echarts 简介与基本使用

ECharts 是一个使用 JavaScript 实现的开源可视化图表库&#xff0c;由百度团队开发。它提供了丰富的图表类型&#xff0c;如折线图、柱状图、饼图、地图、雷达图等&#xff0c;并且可以轻松地与其他前端框架和库集成。ECharts 的设计目的是为了满足复杂数据的可视化需求&#…

PostgreSQL与MySQL,谁更胜一筹

前言 PostgreSQL与MySQL都是优秀的开源数据库。在日常学习中&#xff0c;新手可能接触最多的是MySql,但是实际工作中&#xff0c;两者的应用场景其实都很广。我之前的做过上网流量销售业务&#xff0c;用的是MySQL,现在接触广告业务&#xff0c;用的是pg数据库&#xff0c;每天…

精通PyTorch:如何选择合适的优化器和损失函数

精通PyTorch&#xff1a;如何选择合适的优化器和损失函数 引言PyTorch优化器概览PyTorch损失函数解析高级优化技巧优化器和损失函数的实战应用1. 卷积神经网络&#xff08;CNN&#xff09;的应用实例2. 循环神经网络&#xff08;RNN&#xff09;的应用实例3. 优化过程中的常见问…