HarmonyOS:基于hmrouter实现Page的生命周期监听

打印 上一主题 下一主题

主题 978|帖子 978|积分 2934

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
前言:在利用ArkTs语言写鸿蒙的App中,我们发现Page的生命周期函数,如下:
页面的生命周期(3+2)

onPageShow:页面表现触发(页面特有)
onPageHide:页面隐藏触发(页面特有)
onBackPress:当用户点击返回按钮时触发(页面特有)
aboutToAppear:组件即将出现时触发
aboutToDisappear:组件即将析构烧毁时触发
组件的生命周期(2)

aboutToAppear:组件即将出现时触发
aboutToDisappear:组件即将析构烧毁时触发
UIAbility组件生命周期函数
onCreate: UIAbility实例创建完成时触发
onForeground: 在UIAbility的UI可见之前
onBackground: 在UIAbility的UI完全不可见之后
onDestroy: 在UIAbility实例烧毁时触发
WindowStage窗口生命周期函数

onWindowStageCreate 窗口才能构建
onWindowStageDestroy 窗口烧毁
而我们的页面生命周期函数,aboutToAppear只会触发一次,假如我们的页面视图需要每次出现的时候都要革新大概请求,就会发现没法触发生命周期函数,在ios的项目中有viewwillappare这个函数,如许就很好处置惩罚,但是鸿蒙中没有如许的生命周期函数。
我们的项目路由接纳的是hmrouter框架,hmrouter的框架中的生命周期方法就比鸿蒙体系的方法就多了很多。hmrouter的详细用法,我就不在此详细先容了,需要学习的可以去官网学习下用法。生命周期如下:
  1. export abstract class AbstractLifecycle implements IHMLifecycle {
  2.   observerMap: Map<HMLifecycleState, Array<(ctx: HMLifecycleContext) => HMLifecycleAction>> = new Map()
  3.   onPrepare(ctx: HMLifecycleContext): HMLifecycleAction {
  4.     return HMLifecycleAction.DO_NEXT()
  5.   }
  6.   onAppear(ctx: HMLifecycleContext): HMLifecycleAction {
  7.     return HMLifecycleAction.DO_NEXT()
  8.   }
  9.   onDisAppear(ctx: HMLifecycleContext): HMLifecycleAction {
  10.     return this.runObserver(HMLifecycleState.onDisAppear, ctx)
  11.   }
  12.   onShown(ctx: HMLifecycleContext): HMLifecycleAction {
  13.     return this.runObserver(HMLifecycleState.onShown, ctx)
  14.   }
  15.   onHidden(ctx: HMLifecycleContext): HMLifecycleAction {
  16.     return this.runObserver(HMLifecycleState.onHidden, ctx)
  17.   }
  18.   onWillAppear(ctx: HMLifecycleContext): HMLifecycleAction {
  19.     return HMLifecycleAction.DO_NEXT()
  20.   }
  21.   onWillDisappear(ctx: HMLifecycleContext): HMLifecycleAction {
  22.     return this.runObserver(HMLifecycleState.onWillDisappear, ctx)
  23.   }
  24.   onWillShow(ctx: HMLifecycleContext): HMLifecycleAction {
  25.     return this.runObserver(HMLifecycleState.onWillShow, ctx)
  26.         }
  27.   onWillHide(ctx: HMLifecycleContext): HMLifecycleAction {
  28.     return this.runObserver(HMLifecycleState.onWillHide, ctx)
  29.   }
  30.   onReady(ctx: HMLifecycleContext): HMLifecycleAction {
  31.     return HMLifecycleAction.DO_NEXT()
  32.   }
  33.   onBackPressed(ctx: HMLifecycleContext): boolean {
  34.     return this.runObserver(HMLifecycleState.onBackPressed, ctx).value
  35.   }
复制代码
hmrouter的生命周期监听方法太多了,完全够用了。详细用法如下:
  1. export class PageDurationLifecycle extends AbstractLifecycle {
  2.   private timeMap: Map<string, number> = new Map();
  3.   onShown(ctx: HMLifecycleContext): HMLifecycleAction {
  4.     const pageName = ctx.navContext?.pathInfo.name;
  5.     let param =  ctx.navContext?.pathInfo.param as object;
  6.     WinLog.info('PageDurationLifecycle onShown pageName:' + pageName)
  7.     if (pageName) {
  8.       this.timeMap.set(pageName, new Date().getTime())
  9.       if (pageName=="LoginPage"){
  10.         AppStorage.set<boolean>('loginOnPageShow', true);
  11.       }
  12.      
  13.     }
  14.     return HMLifecycleAction.DO_NEXT();
  15.   }
  16.    onHidden(ctx: HMLifecycleContext): HMLifecycleAction {
  17.     const pageName = ctx.navContext?.pathInfo.name
  18.     WinLog.info('PageDurationLifecycle onHidden pageName:' + pageName)
  19.     if (pageName && this.timeMap.has(pageName)) {
  20.       const duration = new Date().getTime() - (this.timeMap.get(pageName) as number);
  21.       this.timeMap.delete(pageName);
  22.       WinLog.info(`Page ${pageName} stay ${duration} ms`);
  23.       if (pageName=="LoginPage"){
  24.         AppStorage.set<boolean>('loginOnPageShow', false);
  25.       }
  26.     }
  27.     return HMLifecycleAction.DO_NEXT();
  28.   }
  29. }
复制代码
你通过日志观察就会发现,每当LoginPage出现的时候就会调用onShown方法,消失的时候就会调用onHidden方法,那我接纳的是AppStorage存储页面的状态,通过监听loginOnPageShow的值来判断页面的生命周期
在LoginPage页面:
  1. @StorageProp('loginOnPageShow') @Watch('onChangeVisibility') pageVisible: boolean = false;
  2.   onChangeVisibility(){
  3.     WinLog.debug("MVListAcvtPage 是否展示--->"+this.curPageVisibility)
  4.     if (this.curPageVisibility) {
  5.       this.getSubFuncBeanVisitAction()
  6.     }
  7.   }
  8. ```hmrouter
  9. 这样就通过hmrouter框架实现了Page的生命周期的监听,当然hmrouter框架还有很多生命周期方法,你都可以试试。
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

小秦哥

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表