鸿蒙ZRouter动态路由框架—生命周期管理能力

文章目录

      • 基本使用(单个页面生命周期)
      • 页面的全局生命周期监听
      • 工作流程图
      • 源码

ZRouter从1.1.0版本开始支持生命周期函数管理能力,主要有以下特点:

  • 不影响你原有的生命周期业务逻辑,对NavDestination页面保持着零侵入性,整合了组件的通用生命周期函数和NavDestination生命周期函数;
  • 可以让任何一个类具备有与组件的生命周期能力;
  • 不依赖Hvigor插件编译时的能力,不会影响项目编译速度,核心逻辑在运行时执行。

基本使用(单个页面生命周期)

1、在NavDestination或Navigation页面创建LifecycleRegistry实例,并同时使用 @Lifecycle装饰器修饰 ,如下:

@Route({ name: RouterConstants.LIFECYCLE1_VIEW })
@Component
export struct Lifecycle1View {// 1、创建LifecycleRegistry@Lifecycle lifecycle: LifecycleRegistry = LifecycleRegistry.create(this);
}

2、通过LifecycleRegistry添加观察者对象,建议在aboutToAppear函数中添加,提供了两种方式:

  • lifecycle.addObserver:接收类型是一个对象,可使用字面量对象,若需要使用this,可以将this定义成一个局部变量;另外也可以是new的方式,这样一个类实现了ILifecycleObserver接口,就具有与页面组件同样的生命周期能力。
  • lifecycle.addListener:接收类型是一个函数,可在函数内可直接使用this来更新状态。

字面量对象的方式:

aboutToAppear(): void {// 2、使用addObserver设置生命周期函数监听// 注意:如果addObserver是字面量对象注册的情况,将this设置局部变量,不然在对象内的this指向并不是组件的实例let that = thisthis.lifecycle.addObserver<ILifecycleObserver>({aboutToAppear: () => {console.log(`${that.tag}aboutToAppear`)},aboutToDisappear: () => {console.log(`${that.tag}aboutToDisappear`)},onWillAppear(r) {console.log(`${that.tag}onWillAppear`, r?.name, r?.navDestinationId)},onAppear(r) {console.log(`${that.tag}onAppear`, r?.name, r?.navDestinationId)that.counter++},onWillShow(r) {console.log(`${that.tag}onWillShow `, r?.name, r?.navDestinationId)},onShown(r) {console.log(`${that.tag}onShown `, r?.name, r?.navDestinationId)},onWillHide(r) {console.log(`${that.tag}onWillHide `, r?.name, r?.navDestinationId)},onHidden(r) {console.log(`${that.tag}onHidden `, r?.name, r?.navDestinationId)},onWillDisappear(r) {console.log(`${that.tag}onWillDisappear `, r?.name, r?.navDestinationId)},onDisappear(r) {console.log(`${that.tag}onDisappear `, r?.name, r?.navDestinationId)}})
}

class类,实现ILifecycleObserver接口的方式:

@Observed
export class LifecycleModel implements ILifecycleObserver {private tag = 'LifecycleMgr: 'loadState: string = "请求数据中..."counter: number = 0aboutToAppear(): void {console.log(this.tag + 'aboutToAppear')}aboutToDisappear(): void {console.log(this.tag + 'aboutToDisappear')}onWillAppear(info: RouterInfo): void {console.log(this.tag + 'onWillAppear')}onAppear(info: RouterInfo): void {console.log(this.tag + 'onAppear')// 模拟请求数据setTimeout(() => {this.counter = 100}, 3000)}onWillShow(info: RouterInfo): void {console.log(this.tag + 'onWillShow')}onShown(info: RouterInfo): void {console.log(this.tag + 'onShown')}onWillHide(info: RouterInfo): void {console.log(this.tag + 'onWillHide')}onHidden(info: RouterInfo): void {console.log(this.tag + 'onHidden')}onWillDisappear(info: RouterInfo): void {console.log(this.tag + 'onWillDisappear')}onDisappear(info: RouterInfo): void {console.log(this.tag + 'onDisappear')}
}

添加观察者对象,LifecycleModel实现类用@Observed修饰了,在组件内会可以通过viewModel实例来更新状态,如下:

@Component
export struct Lifecycle4View {@State viewModel : LifecycleModel = new LifecycleModel()@Lifecycle lifecycle: LifecycleRegistry = LifecycleRegistry.create(this);aboutToAppear(): void {this.lifecycle.addObserver(this.viewModel)}

在使用lifecycle.addObserver方式,由于是字面量对象的方法中,this 指向调用该方法的对象,这点要特别注意,直接在方法内使用this会报错,对此我们可以将this设为一个局部变量来引用。

lifecycle.addListener方式,则相对简单些,在箭头函数内可以直接使用this来读写自定义组件的状态值。

this.lifecycle.addListener((e, r) => {console.log(this.tag ,'--2--' , e, r?.name ?? "", r?.navDestinationId ?? "")
})

页面的全局生命周期监听

页面的全局生命周期监听设置:

ZRouter.getInstance().addGlobalLifecycleObserver(new GlobalLifecycleObserverImpl())

GlobalLifecycleObserverImpl实现ILifecycleObserver接口即可

注意:其中组件的通用生命周期函数(aboutToAppear、aboutToDisAppear)未必一定会被调用,前提取决于NavDestination页面是否了初始化了LifecycleRegistry对象,这个问题会在后续版本中优化。

工作流程图

在这里插入图片描述

源码

  • OpenHarmony中心仓地址
  • https://gitee.com/common-apps/ZRouter
  • 坚果派社区

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/13082.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

英伟达GB200、B200、H200、H100、A100、4090的参数对比

以下是英伟达GB200、B200、H200、H100、A100、4090的参数对比&#xff1a; 型号 架构 制造工艺 晶体管数量 显存类型 显存容量 显存带宽 CUDA核心数 其他主要特性 GB200 Blackwell 未知 2个B200 GPU共4160亿 HBM3e 每颗B200 GPU 192GB&#xff08;总384GB&#x…

IntelliJ+SpringBoot项目实战(五)--配置Druid在线监控数据库

阿里的Druid插件有可视化监控数据库性能的界面。在SpringBoot中集成Druid后&#xff0c;可以进入可视化Html界面监控数据库运行情况。本文先介绍Druid的管理界面&#xff0c;然后在介绍Druid的详细配置。 首先访问http://localhost:8001/druid/ ,打开登录页面&#xff1a; 然后…

2024年小红书代运营公司推荐:品牌种草新阵地

2024年小红书代运营公司推荐&#xff1a;品牌种草新阵地 随着今年双十一的落幕&#xff0c;各大平台通过各具特色的活动实现了优异的表现&#xff0c;标志着国内电商市场全面进入了全域运营的新时代。未来&#xff0c;电商行业将呈现“货架电商内容电商”相结合的趋势。小红书作…

什么是闰秒?

闰秒概念是 1972年提出的&#xff0c;之所以有这个概念&#xff0c;主要是因为由于潮汐等自然现象的影响&#xff0c;地球的自转速度并不是恒定的。 所以&#xff0c;每隔一段时间世界标准时间「协调世界时&#xff08;UTC&#xff09;」会依据地球围绕太阳运动计算的「世界时…

PySide6百练成真(9)

资源的加载 给控件加上图标 1.内置图标 2.自定义资源文件 3.Rcc的使用(基于designer) 4.如果获取资源文件 rcc的使用,基于xml文件 内置图标 from PySide6.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget, QLineEdit, QToolBox, QMainWindow, QPushButton,QSt…

cmake vscode

cmake_minimum_required(VERSION 3.20.0) project(my_hello) //指定项目 set(CMAKE_CXX_STANDARD 11) //指定c的版本 include_directories( P R O J E C T S O U R C E D I R / i n c l u d e ) / / 包含头文件的目录 / / 指定可执行文件生成目录 s e t ( E X E C U T A B L E…

李耳著《老子》与董仲舒著《道德经》有何区别?

马王堆帛书《老子》的发现&#xff0c;确实为研究《道德经》提供了更为接近原始的版本&#xff0c;其内容与传世本存在诸多不同之处&#xff0c;这些差异不仅体现在文字和篇章结构上&#xff0c;更在于思想内涵和哲学意蕴的深度。以下是具体分析&#xff1a; 版本命名&#xff…

5. ARM_指令集

概述 分类 汇编中的符号&#xff1a; 指令&#xff1a;能够编译生成一条32位机器码&#xff0c;并且能被处理器识别和执行伪指令&#xff1a;本身不是指令&#xff0c;编译器可以将其替换成若干条指令伪操作&#xff1a;不会生成指令&#xff0c;只是在编译阶段告诉编译器怎…

游戏行业使用高防独立IP有什么好处?

独立的IP就是您的虚拟主机自己有一个单独的IP地址&#xff0c;这样&#xff0c;您的用户除了记住您的域名外&#xff0c;在浏览器的地址栏敲入您的IP地址也能访问到您的网站。如果没有独立IP的话&#xff0c;别人要访问您的网站只能敲入域名才行。 而高防ip是指高防机房所提供的…

Android ANR分析总结

1、ANR介绍 ANR&#xff08;Application Not Responding&#xff09;指的是应用程序无响应&#xff0c;当Android应用程序在主线程上执行长时间运行的操作或阻塞I/O操作时发生。这可能导致应用程序界面冻结或无法响应用户输入。 1、Service ANR&#xff1a;前台20s&#xff0…

【comfyui教程】comfyui攻略:故障报错应对指南!

前言 ComfyUI的常见故障和解决&#xff0c;赶紧收藏起来&#xff0c; 在探索ComfyUI的曲折旅途中&#xff0c;最让人心生畏惧的莫过于那漫天的红色方框和层出不穷的报错信息。它们如同不息的风暴&#xff0c;一波未平&#xff0c;一波又起&#xff0c;令无数热忱的初学者在这…

[论文精读]SeqMIA: Sequential-Metric Based Membership Inference Attack

图像领域成员推理攻击 SeqMIA: Sequential-Metric Based Membership Inference Attack http://arxiv.org/abs/2407.15098 ACM CCS 2024 先看overview&#xff0c;猜测文章的方法&#xff1a;训练影子模型&#xff0c;使用影子模型、蒸馏数据集和目标模型共同参与蒸馏任务&am…

机器学习基础02

目录 1.特征工程 1.1特征工程概念 1.2特征工程的步骤 1.3特征工程-特征提取 1.3.1字典特征提取 1.3.2文本特征提取 英文文本提取 中文文本提取 1.3.3TF-IDF文本特征词的稀有程度特征提取 2.无量纲化 2.1归一化 2.2标准化 2.3fit、fit_transform、transform 3.特征…

watermark大模型水印详解

一 watermark定义 模型水印是一种用于模型版权保护的技术&#xff0c;通过向大模型植入水印&#xff08;触发集数据加上特定的噪声或者标志&#xff09;&#xff0c;使得模型学习到这种特定的噪声或者标志的特征&#xff0c;通过特定的问题可以从大模型的回答中提取出水印进行…

做运维工程师辛苦吗?

你要知道做那一块的运维 网络运维&#xff08;确保网络稳定安全&#xff09; 应用运维&#xff08;应用软件进程监控、服务和端口相应情况、故障处理等&#xff09; 系统运维&#xff08;操作系统监控 恢复 等&#xff09;、 桌面和外围设备运维&#xff08;计算机终端、外…

关于报错‘cross-env‘ 不是内部或外部命令,也不是可运行的程序

在使用ANT DESIGN PRO这个react框架时出现了cross-env 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 如图&#xff1a; 解决办法&#xff1a; 需要全局安装 cross-dev npm install -g cross-env -save-dev 然后重新启动npm start 注意&#xff1a;…

智能座舱多屏项目,中控屏切换语言,后排屏闪黑屏问题

1. 背景 智能座舱多屏项目&#xff0c;中控屏切换语言&#xff0c;后排屏闪黑屏问题 2. 详细分析过程 通过events log查看activity的生命周期&#xff1a;adb shell logcat -b events com.android.rwhvac.view.behind.BehindActivity2 : displayId 2 副屏app com.android.…

基于Multisim温度计温度测量检测测量系统电路(含仿真和报告)

【全套资料.zip】温度计温度测量检测测量系统电路Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 温度检测测量系统 1.温度测量范围为0&#xff5e;200&#xff23;&#xff1b; 2.三位数…

浅层神经网络

浅层神经网络 浅层神经网络通常指包含一个隐藏层的神经网络。这个网络由输入层、隐藏层和输出层构成&#xff1a; 输入层&#xff1a;输入层负责接收网络的输入特征&#xff0c;通常表示为列向量 x T [ x 1 , x 2 , x 3 ] x^T [x_1, x_2, x_3] xT[x1​,x2​,x3​]&#xff…

解决apidoc不是内部或外部命令,也不是可运行的程序 或批处理文件。

apidoc官网 首先确保安装了apidoc,我这里是全局安装的。 npm install apidoc -g然后打开cmd窗口执行命令时就会报错。 apidoc 不是内部或外部命令,也不是可运行的程序 或批处理文件。 此时只需要找到它&#xff0c;再把它加入环境变量即可了。 win10中npm默认路径:C:\User…