【HarmonyOS】HMRouter使用详解(三)生命周期

简介: 使用HMRouter的页面跳转时,想实现和Navigation一样的生命周期时,需要通过新建生命周期类来实现对页面对某一个生命周期的监控。

生命周期(Lifecycle)


使用HMRouter的页面跳转时,想实现和Navigation一样的生命周期时,需要通过新建生命周期类来实现对页面对某一个生命周期的监控。

新建Lifecycle类


通过继承IHMLifecycle接口实现生命周期接口的方法重写。 通过添加@HMLifecycle装饰器,来定义生命周期类的名称,然后在页面中使用

IHMLifecycle

export interface IHMLifecycle {
    onPrepare?(ctx: HMLifecycleContext): void;
    onAppear?(ctx: HMLifecycleContext): void;
    onDisAppear?(ctx: HMLifecycleContext): void;
    onShown?(ctx: HMLifecycleContext): void;
    onHidden?(ctx: HMLifecycleContext): void;
    onWillAppear?(ctx: HMLifecycleContext): void;
    onWillDisappear?(ctx: HMLifecycleContext): void;
    onWillShow?(ctx: HMLifecycleContext): void;
    onWillHide?(ctx: HMLifecycleContext): void;
    onReady?(ctx: HMLifecycleContext): void;
    onBackPressed?(ctx: HMLifecycleContext): boolean;
}
  • onPrepare:在拦截器执行后,路由栈真正push前触发。
  • onWillAppear:在路由组件创建后,挂载到组件树之前执行。
  • onAppear:通用生命周期事件,路由组件挂载到组件树时执行。
  • onWillShow:路由组件布局显示之前执行,此时页面不可见(应用切换到前台不会触发)。
  • onShown:路由组件布局显示之后执行,此时页面已完成布局。
  • onWillHide:路由组件触发隐藏之前执行(应用切换到后台不会触发)。
  • onHidden:路由组件触发隐藏后执行(非栈顶页面push进栈,栈顶页面pop出栈或应用切换到后台)。
  • onWillDisappear:路由组件即将销毁之前执行,如果有转场动画,会在动画前触发(栈顶页面pop出栈)。
  • onDisappear:通用生命周期事件,路由组件从组件树上卸载销毁时执行。
  • onReady:在即将构件子组件时触发此回调。
  • onBackPressed:在路由组件绑定的页面栈中存在内容时,此回调生效。当点击返回键时,触发该回调。返回值为true时,表示重写返回键逻辑,false时,表示回退到上一个页面。

下面插入Navigation的生命周期流程图,HMRouter的生命周期流程类似,在此基础上增加了额外的生命周期流程。

@HMLifecycle装饰器

export declare function HMLifecycle(param: HMLifecycleParam): ObjectConstructor;
export interface HMLifecycleParam {
    lifecycleName: string;
    priority?: number;
    global?: boolean;
}

标记在实现了IHMLifecycle的对象上,声明此对象为一个自定义生命周期处理器。

  • lifecycleName:自定义生命周期处理器名称,必填。
  • priority:生命周期优先等级。按照优先等级顺序触发,不区分自定义或者全局生命周期,优先级相同时先执行@HMRouter中定义的自定义生命周期。
  • global:是否为全局生命周期,true时,所有页面生命周期事件为当前设定的生命周期处理器,默认为false。

实现代码


在之前文章的基础上进行修改。 添加一个Lifecycles文件夹,并新建一个TwoPageLifecycle,来实现TwoPage页面的生命周期。

TwoPageLifecycle

import { HMLifecycle, HMLifecycleContext, IHMLifecycle } from "@hadss/hmrouter";
@HMLifecycle({ lifecycleName: 'TwoPageLifecycle' })
export class TwoPageLifecycle implements IHMLifecycle {
  /**
   * 在拦截器执行后,路由栈真正push前触发
   * @param ctx
   */
  onPrepare(ctx: HMLifecycleContext): void {
    console.debug("router", 'onPrepare');
  }
  onWillAppear(ctx: HMLifecycleContext): void {
    console.debug("router", 'onWillAppear');
  }
  onAppear(ctx: HMLifecycleContext): void {
    console.debug("router", 'onAppear');
  }
  onWillShow(ctx: HMLifecycleContext): void {
    console.debug("router", 'onWillShow');
  }
  onShown(ctx: HMLifecycleContext): void {
    console.debug("router", 'onShown');
  }
  onWillHide(ctx: HMLifecycleContext): void {
    console.debug("router", 'onWillHide');
  }
  onHidden(ctx: HMLifecycleContext): void {
    console.debug("router", 'onHidden');
  }
  onWillDisappear(ctx: HMLifecycleContext): void {
    console.debug("router", 'onWillDisappear');
  }
  onDisAppear(ctx: HMLifecycleContext): void {
    console.debug("router", 'onDisAppear');
  }
  onReady(ctx: HMLifecycleContext): void {
    console.debug("router", 'onReady');
  }
  onBackPressed(ctx: HMLifecycleContext): boolean {
    console.debug("router", 'onBackPressed');
    return true;
  }
}

TwoPage

import { HMPopInfo, HMRouter, HMRouterMgr } from '@hadss/hmrouter'
import { PageModel } from '../../Models/PageModel'
@HMRouter({ pageUrl: "TwoPage", lifecycle: "TwoPageLifecycle" })
@Component
export struct TwoPage {
  aboutToAppear(): void {
    let currentParam: PageModel = HMRouterMgr.getCurrentParam() as PageModel;
    if (currentParam == undefined) {
      return;
    }
    console.debug("router", 'name:' + currentParam.Name);
    console.debug("router", 'age:' + currentParam.Age);
  }
  build() {
    Column({ space: 20 }) {
      Button("ThreePage")
        .width("80%")
        .onClick(() => {
          HMRouterMgr.push({
            navigationId: "mainNavigation",
            pageUrl: "ThreePage"
          }, {
            onResult: (popInfo: HMPopInfo) => {
              let popResult: PageModel = popInfo.result as PageModel;
              if (popResult == null || popResult == undefined) {
                return;
              }
              console.debug("router", 'name:' + popResult.Name);
              console.debug("router", 'age:' + popResult.Age);
            }
          })
        })
      Button("ThreeReplacePage")
        .width("80%")
        .onClick(() => {
          HMRouterMgr.replace({
            navigationId: "mainNavigation",
            pageUrl: "ThreePage"
          }, {
            onResult: (popInfo: HMPopInfo) => {
              let popResult: PageModel = popInfo.result as PageModel;
              if (popResult == null || popResult == undefined) {
                return;
              }
              console.debug("router", 'name:' + popResult.Name);
              console.debug("router", 'age:' + popResult.Age);
            }
          })
        })
      Button("HomePage")
        .width("80%")
        .onClick(() => {
          HMRouterMgr.pop({
            navigationId: "mainNavigation"
          })
        })
    }
    .height("100%")
    .width("100%")
  }
}

实现效果

在生命周期方法中实现内容打印,截图如下:

可以看到生命周期的调用顺序

相关文章
|
1月前
|
容器
【HarmonyOS】HMRouter使用详解(一)环境配置
在项目中使用官方推荐的Navigation时,需要在所有的页面上都添加一层NavDestination,在代码阅读上会增加多个层级,而且还要在主页面设置对应名字的跳转等问题,配置起来比较繁琐。看到大佬开发的HMRouter使用起来方便简洁,因此,写下这篇文章记录HMRouter的使用。
75 8
【HarmonyOS】HMRouter使用详解(一)环境配置
|
1月前
【HarmonyOS】HMRouter使用详解(二)
HMRouter中使用HMRouterMgr的静态方法push()和replace()来实现路由跳转。使用pop()方法来实现页面返回 * push :目标页面不会替换当前页,而是插入页面栈。可以使用pop实现页面的返回操作。 * replace:目标页面会替换当前页,并销毁当前页。这样可以释放当前页的资源,并且无法返回到当前页。 * pop:返回页面栈的上一个页面,skipedLayerNumber 页面返回的层级数量,默认为0,表示返回上一级,1表示跳过一级页面返回
76 8
|
1月前
【HarmonyOS】HMRouter使用详解(四)路由拦截
可以对指定或全局路由跳转时添加拦截器,作用是可以实现在页面切换前做判断是否有进入当前页面的权限。这篇文章将实现登录的全局路由拦截样式。
81 2
|
1月前
|
人工智能 Java 程序员
HarmonyOS实战开发之HMRouter实现跳转
本文介绍了HarmonyOS页面跳转的两种方式:组件导航(Navigation)和页面路由(@ohos.router),并推荐使用更灵活的组件导航。进一步详细讲解了HMRouter,一个解决HarmonyOS页面跳转问题的框架,其功能包括页面跳转、弹窗提示、转场动效等。通过下载依赖、配置插件、初始化和实现跳转四个步骤,可以轻松集成HMRouter,实现高效页面管理。文章还展示了具体代码示例和效果截图,帮助开发者快速上手。关注Feri,带你掌握鸿蒙开发技巧!
126 0
|
2月前
|
存储 监控 安全
开发者的黄金时代:原生鸿蒙应用市场的全生命周期服务
2024年10月22日,华为发布了HarmonyOS NEXT,标志着鸿蒙生态进入商用发展阶段。原生鸿蒙应用市场全面焕新,不仅在UI设计、互动体验和隐私安全机制上进行了重塑,还为开发者和用户提供了从开发到分发的全生命周期服务。通过统一上架、多端分发、隐私合规保障等措施,原生鸿蒙应用市场助力开发者实现高效、安全的应用开发与分发,为全球数亿鸿蒙用户带来更流畅、更安全的使用体验。
|
8月前
|
调度 UED 开发者
【鸿蒙软件开发】UIAbility组件概况、生命周期与启动模式
【鸿蒙软件开发】UIAbility组件概况、生命周期与启动模式
1021 0
【鸿蒙软件开发】UIAbility组件概况、生命周期与启动模式
|
XML 数据格式
【HarmonyOS】【DevEco Studio】NOTE05:PageAbility生命周期的呈现
【HarmonyOS】【DevEco Studio】NOTE05:PageAbility生命周期的呈现
150 1
【HarmonyOS】【DevEco Studio】NOTE05:PageAbility生命周期的呈现
harmonyOS:关于AbilitySlice生命周期详解✨一文搞懂✨
文章目录 前言 一.AbilitySlice概述 二.AbilitySlice生命周期 1.准备工作 1.MainAbilitySlice配置 2.MainAbility2Slice配置 3.跳转的实现 2.运行时的状态 总结
harmonyOS:关于AbilitySlice生命周期详解✨一文搞懂✨
|
开发者
harmonyOS:关于Page Ability生命周期详解✨一文搞懂✨
文章目录 前言 一.Ability概述 二.Page Ability生命周期 1.准备工作 2.一阶段运行程序时 3.二阶段ACTIVE的状态 3.三阶段 4.四阶段 5.五阶段onStop()方法 总结
harmonyOS:关于Page Ability生命周期详解✨一文搞懂✨
|
存储 缓存 Java
鸿蒙 Ability 讲解(页面生命周期、后台服务、数据访问)
鸿蒙 Ability 讲解(页面生命周期、后台服务、数据访问)
1261 0
鸿蒙 Ability 讲解(页面生命周期、后台服务、数据访问)