美文网首页
页面路由

页面路由

作者: 家乡的蝈蝈 | 来源:发表于2024-02-27 13:57 被阅读0次
  • 页面路由指在应用程序中实现不同页面之间的跳转和数据传递。
      HarmonyOS提供了Router模块,通过不同的url地址,可以方便地进行页面路由,轻松地访问不同的页面。
包的引用
import router from '@ohos.router'

1.1、pushUrl-压栈跳转

● pushUrl(options: RouterOptions): Promise<void>
  场景: 如果我们从列表页跳转到详情页查看详情,点击返回还要继续查看列表页,可以使用pushUrl,打开详情页的同时,保留了列表页在栈中。

import router from '@ohos.router'
@Entry
@Component
struct LwList {
  @State message: string = 'Hello World'
  // 箭头函数简写
  @State list:ListInfo[] = Array.from(Array(10), (_, index:number) => ({title:`我是第${index + 1}`, id:index+1}))
  // list:ListInfo[] = Array.from(Array(10), (_, index:number) => {
  //   return {title:`我是第${index + 1}`, id:index+1}
  // })
  build() {
    Column({space: 20}) {
      Row() {
        Text('列表数据')
          .width('100%')
          .textAlign(TextAlign.Center)
          .height(40)
      }
      .border({
        color: '#f3f4f5',
        width: {
          bottom: 1
        }
      })
      // list渲染数据
      List({space:10}) {
        ForEach(this.list, (item:ListInfo) => {
          ListItem() {
            Row() {
              Text(item.title)
              Button("查看详情")
                .height(30)
                .onClick(() => { 
                  router.pushUrl({url:'pages/06/LwDetail'}) // 压栈路由
                })
            }.padding({
              left:20,
              right:20
            })
            .width('100%')
            .justifyContent(FlexAlign.SpaceBetween)
          }
        })
      }
    }
  }
}
class ListInfo {
  title: string = ""
  id: number = 0
}

1.2、replaceUrl-替换跳转

  有一个登录页(Login)和一个个人中心页(Profile),希望从登录页成功登录后,跳转到个人中心页。同时,销毁登录页,在返回时直接退出应用
  此时直接replaceUrl方法会在跳转的同时,销毁登录页,在上面的例子中,我们直接将pushUrl换成replaceUrl即可。

 Button("查看详情")
    .onClick(() => {
    router.replaceUrl({url:'pages/06/LwDetail'}) // 压栈路由
 })

总结:

  • 当你需要跳转之后,还可以回到上一个页面,使用pushUrl,它会保留当前的页面,压一个新的页面
  • 当你跳转之后,上一个页面的任务已经完成,不需要返回,就可以使用replaceUrl

1.3、back返回

  router.back() . 返回上一个页面,此时不需要参数,如果说你想要返回的时候带一些参数,需要params和url- 想要指定url

Button('返回上一页')
        .onClick(() => {
          // 需要前一个页面通过router.pushUrl过来的页面,才能发挥上一个页面
          router.back()  
        })

1.4、路由参数

  如果需要在跳转时,传递一些数据给目标页,比如列表页到详情页,想把id传过去就可以使用路由传参的模式

1.4.1 父组件传参,子组件接收

Button("查看详情")
                .height(30)
                .onClick(() => {
                  router.pushUrl({
                    url:'pages/06/LwDetail',
                    params:{  // 父组件通过params把参数id传给子组件
                      id:item.id
                    }
                  }) // 压栈路由
                })
            }
class RouterParamsClass {
  id:number = 0
}
struct LwDetail {
  @State currentId:number = 0
  aboutToAppear() { // 子组件在初始化通过router.getParams()获取参数,但要指定参数类型
    const params = router.getParams() as RouterParamsClass
    if (params?.id) {
      this.currentId = params.id
    }
  }
}

1.4.2 子组件传参,父组件接收

Button('返回上一页')
        .onClick(() => {
          router.back({
            url:'pages/06/LwList',   // router.back时url必传
            params:{  // router.back时传回父组件的参数
              detailId:Date.now()
            }
          })
        })
class BackParamsClass {
  detailId:number = 0
}
onPageShow() { // 只要页面显示就会执行一次
    const params = router.getParams() as BackParamsClass
    if (params?.detailId) {
      AlertDialog.show({
        message:params?.detailId.toString()
      })
    }
  }

总结:

  • 传参用params对象,里面可以传任意内容,key/value由开发者自己定义
  • 接收端采用router.getParams()获取对象,需要通过class来定义参数的结构,接收之后通过类型断言as指定为具体类型
  • 如果是通过pushUrl的方式跳转的,返回上一个页面时,aboutToAppear不会执行,需要使用onPageShow来监听当前页面的显示钩子函数

1.4、路由模式

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

  1. Standard-只要你push,页面栈里面就会加一项,不管之前加没加过
  2. Single- 你之前加过,不会加新的页面,会把你之前加过的页面加出来
Button('单例模式跳到列表页')
        .onClick(() => {
          router.pushUrl({
            url:'pages/06/LwList'
          },router.RouterMode.Single) // router.RouterMode.Single会从栈中取出之前加载过的页面,放在栈顶,并重新加载。
        })

相关文章

  • Android路由框架-ARouter详解

    文章大纲 一、页面路由基本介绍1.什么是页面路由2.为什么要使用页面路由二、页面路由框架ARouter介绍1.常用...

  • Router 原理及 React-Router

    页面路由(浏览器路由) 页面会刷新 hash路由 页面不会刷新,之前做单页应用,使用的传统方法。 h5 路由 h5...

  • react 路由模块化 嵌套路由

    路由模块封装 首页面父子路由传递 user用户组件嵌套子路由页面

  • flutter04: 路由跳转

    路由分两种:静态路由和动态路由 Flutter里面有路由支持所有的路由场景,push、pop页面,页面间的参数传递...

  • 与Vue.js的第九天

    今天学习了路由 路由 路由 路由vue-router是vue的核心组件根据不同的url访问不同页面配合单页面使用 ...

  • 微信小程序之页面路由

    页面路由 在小程序中所有页面的路由全部由框架进行管理。 页面栈 框架以栈的形式维护了当前的所有页面。 当发生路由切...

  • 子路由返回父路由刷新父页面

    子路由页面返回父路由页面,需要刷新数据可以判断路由中的match.isExact属性,true的时候,说明路由定位...

  • 手撸博客3 文章列表及文章

    1 设计思路 1.1 路由设计 /article路由到文章列表页面/article/aid路由到具体的文章页面 1...

  • 2018-09-26 路由

    路由.切换页面 2.路由嵌套

  • react navigation 页面跳转

    注册路由 页面跳转 正常页面跳转,仅一次: 在路由堆栈中添加新路由,可多次: 返回上一路由: 返回堆栈中第一个页面:

网友评论

      本文标题:页面路由

      本文链接:https://www.haomeiwen.com/subject/iqgbadtx.html