• 【鸿蒙 HarmonyOS 4.0】路由router


    一、介绍

    页面路由指在应用程序中实现不同页面之间的跳转和数据传递。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实例模式

    1. import router from '@ohos.router'
    2. @Entry
    3. @Component
    4. struct LoginPage {
    5. @State message: string = 'login'
    6. build() {
    7. Row() {
    8. Column({space:6}) {
    9. Text(this.message)
    10. .fontSize(50)
    11. .fontWeight(FontWeight.Bold)
    12. Button('跳转到home页面--pushUrl')
    13. .fontSize(20)
    14. .onClick(() =>{
    15. router.pushUrl(
    16. {
    17. url:'pages/HomePage'
    18. },
    19. router.RouterMode.Standard,
    20. (err) => {
    21. if(err){
    22. console.log('路由失败')
    23. }
    24. }
    25. )
    26. })
    27. }
    28. .width('100%')
    29. }
    30. .height('100%')
    31. }
    32. }

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

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

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

    1. import router from '@ohos.router'
    2. @Entry
    3. @Component
    4. struct LoginPage {
    5. @State message: string = 'login'
    6. build() {
    7. Row() {
    8. Column({space:6}) {
    9. Text(this.message)
    10. .fontSize(50)
    11. .fontWeight(FontWeight.Bold)
    12. Button('跳转到home页面--replaceUrl')
    13. .fontSize(20)
    14. .onClick(() =>{
    15. router.replaceUrl(
    16. {
    17. url:'pages/HomePage'
    18. },
    19. router.RouterMode.Standard,
    20. (err) => {
    21. if(err){
    22. console.log('路由失败')
    23. }
    24. }
    25. )
    26. })
    27. }
    28. .width('100%')
    29. }
    30. .height('100%')
    31. }
    32. }

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

    2.3.2.2、带参数传递的场景

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

    1. Button('跳转到home页面--pushUrl')
    2. .fontSize(20)
    3. .onClick(() =>{
    4. router.pushUrl(
    5. {
    6. url:'pages/HomePage',
    7. params:{id:1}
    8. },
    9. router.RouterMode.Standard,
    10. (err) => {
    11. if(err){
    12. console.log('路由失败')
    13. }
    14. }
    15. )
    16. })

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

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

    三、页面返回

    3.1、三种返回方式

    3.1.1、返回到上一个页面。

    router.back();

    3.1.2、返回到指定页面

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

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

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

    1. router.back({
    2. url: 'pages/Info',
    3. params: {
    4. id:1
    5. }
    6. });

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

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

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

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

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

    4.1、系统默认询问框

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

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

    1. import router from '@ohos.router'
    2. @Entry
    3. @Component
    4. struct HomePage {
    5. @State message: string = 'Home'
    6. @State params:any = router.getParams()
    7. build() {
    8. Row() {
    9. Column({space:6}) {
    10. Text(this.message)
    11. .fontSize(50)
    12. .fontWeight(FontWeight.Bold)
    13. Text('接收login传递的id:' + this.params.id)
    14. .fontSize(30)
    15. .fontWeight(FontWeight.Bold)
    16. Button('返回到login页面')
    17. .fontSize(20)
    18. .onClick(() => {
    19. router.showAlertBeforeBackPage({
    20. message:'确定返回到login页面吗?'
    21. })
    22. router.back()
    23. })
    24. }
    25. .width('100%')
    26. }
    27. .height('100%')
    28. }
    29. }

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

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

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

    4.2、自定义询问框

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

    1. import router from '@ohos.router'
    2. import promptAction from '@ohos.promptAction'
    3. @Entry
    4. @Component
    5. struct HomePage {
    6. @State message: string = 'Home'
    7. @State params:any = router.getParams()
    8. build() {
    9. Row() {
    10. Column({space:6}) {
    11. Text(this.message)
    12. .fontSize(50)
    13. .fontWeight(FontWeight.Bold)
    14. Text('接收login传递的id:' + this.params.id)
    15. .fontSize(30)
    16. .fontWeight(FontWeight.Bold)
    17. Button('返回到login页面')
    18. .fontSize(20)
    19. .onClick(() => {
    20. promptAction.showDialog({
    21. message:'确定返回到login页面吗?',
    22. buttons: [
    23. {
    24. text: '取消',
    25. color: '#FF0000'
    26. },
    27. {
    28. text: '确认',
    29. color: '#0099FF'
    30. }
    31. ]
    32. }).then((result)=>{
    33. if(result.index === 0){
    34. // 用户点击了“取消”按钮
    35. console.log('点击了取消按钮')
    36. }else if(result.index === 1){
    37. // 用户点击了“确认”按钮
    38. console.log('用户点击了“确认”按钮')
    39. // 调用router.back()方法,返回上一个页面
    40. router.back();
    41. }
    42. }).catch(err => {
    43. console.error(`Invoke showDialog failed, code is ${err.code}, message is ${err.message}`);
    44. })
    45. })
    46. }
    47. .width('100%')
    48. }
    49. .height('100%')
    50. }
    51. }

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

    最后:👏👏😊😊😊👍👍 

  • 相关阅读:
    JavaWeb:上传文件
    虚拟 DOM:前端性能优化的秘密
    A、B机器正常TCP连接后,B突然断网,A处于什么状态?
    JavaIO之read()和readline
    数据导入与预处理-拓展-pandas时间数据处理01
    C++ STL 教程
    Ubuntu 20.04 上安装和配置 neo4j
    2013年第四届丘成桐大学生数学竞赛获奖名单
    数据结构与算法基础-学习-32-选择排序之简单选择排序、堆排序
    51单片机实训项目之产品数量计数器
  • 原文地址:https://blog.csdn.net/weixin_71403100/article/details/136241841