开天辟地 HarmonyOS(鸿蒙) - 组件(导航类): router(路由接口)

源码 https://github.com/webabcd/HarmonyDemo
作者 webabcd

开天辟地 HarmonyOS(鸿蒙) - 组件(导航类): router(路由接口)

示例如下:

pages\component\navigation\RouterDemo.ets

/*
 * router - 路由接口,通过页面地址做路由
 *   页面需要用 @Entry 装饰,且需要在 main_pages.json 文件(在 module.json5 中通过 "pages":"$profile:main_pages" 指定的)中声明
 *
 * 注:本例演示的是如何通过页面地址做路由(必须是 @Entry 组件),如需要通过路由表做路由(允许非 @Entry 组件)请参见 NavigationDemo2.ets, NavigationDemo3.ets 中的说明
 */

import { TitleBar } from '../../TitleBar';
import { router } from '@kit.ArkUI'; // 实际导入的是 import router from '@ohos.router';

@Entry
@Component
struct RouterDemo {

  // 自定义转场动画(参见 /animation/PageTransitionDemo.ets 中的说明)
  pageTransition() {

  }

  @State message: string = ""

  onPageShow() {
    this.message += `RouterDemo pageId:${Math.floor(Math.random() * 1000).toString()}\n`
    this.message += `length:${router.getLength()}\n`
    this.message += `state:${JSON.stringify(router.getState())}\n`

    /*
     * queryRouterPageInfo() - 组件的内置方法,可以获取当前的 RouterPageInfo
     *   index - 当前页面在栈中的从栈底开始的索引位置(注:此处的索引是从 1 开始的)
     *   name - 当前页面的文件名称
     *   path - 当前页面的文件地址
     *   pageId - 由系统生成的当前页面的唯一标识
     *   state - 页面状态(一个 RouterPageState 枚举)
     *     ABOUT_TO_APPEAR - 页面即将显示
     *     ABOUT_TO_DISAPPEAR - 页面即将销毁
     *     ON_PAGE_SHOW - 页面显示了
     *     ON_PAGE_HIDE - 页面隐藏了
     *     ON_BACK_PRESS - 页面返回时
     */
    let routerPageInfo = this.queryRouterPageInfo()
    this.message += `routerPageInfo:${JSON.stringify(routerPageInfo)}\n`

    // 路由返回时需要弹出确认对话框,并指定对话框中显示的信息
    router.showAlertBeforeBackPage({
      message: '确认返回吗?'
    });

    // 也可以通过 this.getUIContext().getRouter() 获取当前的 Router 对象
    // let myRouter = this.getUIContext().getRouter()
  }

  build() {
    Column({space:10}) {

      TitleBar()

      /*
       * router - 路由接口,通过页面地址做路由
       *   pushUrl() - 页面入栈
       *     options - 需要入栈的页面的信息(一个 RouterOptions 接口)
       *       url - 需要入栈的页面的地址
       *       params - 需要传递给入栈页面的数据
       *     mode - 入栈方式(RouterMode 枚举)
       *       Standard - 标准方式
       *       Single - 从栈顶到栈底查找,如果找到了目标页则将其移动到栈顶,找不动目标页则使用标准方式入栈
       *     callback - 此次路由结束后的回调(回调参数是一个 BusinessError 对象,如果入栈正常则此对象为 undefined)
       *       code - 错误代码
       *       message - 错误信息
       *   replaceUrl() - 销毁当前页面,并跳转到指定的页面,无转场动画
       *   back() - 返回到上一页,或返回到指定页并传递数据
       *   clear() - 当前栈仅保留当前页面,其他页面全部清除
       *   getLength() - 当前栈内的页面数量
       *   getState() - 获取栈顶的页面的信息(一个 RouterState 对象)
       *     index - 当前页面在栈中的从栈底开始的索引位置(注:此处的索引是从 1 开始的)
       *     name - 当前页面的文件名称
       *     path - 当前页面的文件地址
       *     params - 当前页面的传入参数
       *   showAlertBeforeBackPage() - 路由返回时需要弹出确认对话框,并指定对话框中显示的信息
       *   hideAlertBeforeBackPage() - 路由返回时不弹确认对话框
       */

      // 如果跳转到一个不存在的页面,则返回 100002 错误
      Button("pushUrl err").onClick(() => {
        router.pushUrl({
          url: 'xxx/xxx'
        }, router.RouterMode.Standard, (err) => {
          this.message += `errCode:${err.code}, errCode:${err.message}\n`
        })
      })

      // 跳转到指定的页面并传参
      Button("pushUrl").onClick(() => {
        router.pushUrl({
          url: 'pages/component/navigation/pages/RouterDemo_Page1',
          params: {
            p1: "p1",
            p2: "p2",
          }
        }, router.RouterMode.Standard, (err) => {
          // 跳转成功则 err 为 undefined
          this.message += `err:${err}\n`
        })
      })

      // 销毁当前页面,并跳转到指定的页面,无转场动画
      Button("replaceUrl").onClick(() => {
        router.replaceUrl({
          url: 'pages/component/navigation/pages/RouterDemo_Page1',
          params: {
            p1: "p1",
            p2: "p2",
          }
        }, router.RouterMode.Standard, (err) => {
          this.message += `err:${err}\n`
        })
      })

      // 返回到上一页
      Button("back 到上一页").onClick(() => {
        router.back()
      })

      // 返回到指定页并传递数据
      Button("back 到指定页").onClick(() => {
        router.back({
          url: 'pages/component/navigation/RouterDemo',
          params: {
            p1: "p111",
            p2: "p222",
          }
        })
      })

      // 当前栈仅保留当前页面,其他页面全部清除
      Button("clear").onClick(() => {
        router.clear()
      })

      Scroll() {
        Text(this.message)
      }
      .layoutWeight(1)
    }
  }
}

pages\component\navigation\pages\RouterDemo_Page1.ets

/*
 * router - 路由接口,通过页面地址做路由
 *
 * 注:本例演示的是如何通过页面地址做路由(必须是 @Entry 组件),如需要通过路由表做路由(允许非 @Entry 组件)请参见 NavigationDemo2.ets, NavigationDemo3.ets 中的说明
 */

import { TitleBar } from '../../../TitleBar';
import { router } from '@kit.ArkUI';

@Entry
@Component
struct RouterDemo_Page1 {

  // 自定义转场动画(参见 /animation/PageTransitionDemo.ets 中的说明)
  pageTransition() {

  }

  @State message: string = ""

  aboutToAppear() {
    /*
     * router.getParams() - 获取 router 传递过来的数据
     */
    const params = router.getParams() as Record<string, string>
    this.message += `RouterDemo_Page1 pageId:${Math.floor(Math.random() * 1000).toString()}\n`
    this.message += `p1:${params?.p1 || ""}, p2:${params?.p2 || ""}\n`

    /*
     * queryRouterPageInfo() - 组件的内置方法,可以获取当前的 RouterPageInfo
     *   index - 当前页面在栈中的从栈底开始的索引位置(注:此处的索引是从 1 开始的)
     *   name - 当前页面的文件名称
     *   path - 当前页面的文件地址
     *   pageId - 由系统生成的当前页面的唯一标识
     *   state - 页面状态(一个 RouterPageState 枚举)
     *     ABOUT_TO_APPEAR - 页面即将显示
     *     ABOUT_TO_DISAPPEAR - 页面即将销毁
     *     ON_PAGE_SHOW - 页面显示了
     *     ON_PAGE_HIDE - 页面隐藏了
     *     ON_BACK_PRESS - 页面返回时
     */
    let routerPageInfo = this.queryRouterPageInfo()
    this.message += `routerPageInfo:${JSON.stringify(routerPageInfo)}\n`
  }

  build() {
    Column({space:10}) {

      TitleBar()

      /*
       * RouterMode.Standard - 标准的入栈方式
       * RouterMode.Single - 从栈顶到栈底查找,如果找到了目标页则将其移动到栈顶,找不动目标页则使用标准方式入栈
       */

      Button("pushUrl RouterMode.Standard").onClick(() => {
        router.pushUrl({
          url: 'pages/component/navigation/RouterDemo',
        }, router.RouterMode.Standard)
      })

      Button("pushUrl RouterMode.Single").onClick(() => {
        router.pushUrl({
          url: 'pages/component/navigation/RouterDemo',
        }, router.RouterMode.Single)
      })

      Scroll() {
        Text(this.message)
      }
      .layoutWeight(1)
    }
  }
}

源码 https://github.com/webabcd/HarmonyDemo
作者 webabcd

posted @ 2025-02-06 08:20  webabcd  阅读(93)  评论(0)    收藏  举报