当前位置: 首页 > news >正文

HarmonyOS应用三之组件生命周期和参数传递

目录:

    • 1、生命周期的执行顺序
    • 2、页面数据传递
    • 3、图片的读取
    • 4、数据的备份和恢复
    • 5、轮播图
    • 6、页面布局图

1、生命周期的执行顺序

/** Copyright (c) 2023 Huawei Device Co., Ltd.* Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**     http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window } from '@kit.ArkUI';export default class EntryAbility extends UIAbility {windowStage: window.WindowStage | undefined = undefined;tag: string = 'EntryAbility';domain: number = 0x0000;want: Want | undefined = undefined;launchParam: AbilityConstant.LaunchParam | undefined = undefined;windowStageEventFunc: (data: window.WindowStageEventType) => void = (data: window.WindowStageEventType): void => {hilog.info(this.domain,'Succeeded in enabling the listener for window stage event changes. Data: %{public}',JSON.stringify(data) ?? '');}onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {this.want = want;this.launchParam = launchParam;hilog.info(this.domain, this.tag, 'Ability is onCreate.');}onDestroy() {hilog.info(this.domain, this.tag, 'Ability is onDestroy.');}onWindowStageCreate(windowStage: window.WindowStage) {this.windowStage = windowStage;// Setting Event Subscription for WindowStage (Obtained/Out-of-focus, Visible/Invisible)try {windowStage.on('windowStageEvent', this.windowStageEventFunc);} catch (exception) {hilog.error(this.domain,'Failed to enable the listener for window stage event changes. Cause: %{public}',JSON.stringify(exception) ?? '');}// Main window is created, set main page for this ability// Setting UI LoadingwindowStage.loadContent('pages/LifeCyclePage', (err, data) => {if (err.code) {hilog.error(this.domain, 'testTag', 'Failed to load the content. Cause: %{public}s',JSON.stringify(err) ?? '');return;}hilog.info(this.domain, this.tag, 'Succeeded in loading the content. Data: %{public}s',JSON.stringify(data) ?? '');});}onWindowStageDestroy() {// Releasing UI Resources// Unregisters the WindowStage event for getting/out of focus in onWindowStageDestroy()try {this.windowStage?.off('windowStageEvent');} catch (exception) {hilog.error(this.domain, 'Failed to disable the listener for window stage event changes. Cause: %{public}s',JSON.stringify(exception));}}onForeground() {// Ability has brought to foregroundhilog.info(this.domain, this.tag, 'Ability is onForeground.');}onBackground() {// Ability has back to backgroundhilog.info(this.domain, this.tag, 'Ability is onBackground.');}
}
/** Copyright (c) 2023 Huawei Device Co., Ltd.* Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**     http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/import Logger from '../common/util/Logger';
import CommonConstants from '../common/constants/CommonConstants';@Entry
@Component
struct LifeCyclePage {@State textColor: Color = Color.Black;aboutToAppear() {this.textColor = Color.Blue;Logger.info('[LifeCyclePage]  LifeCyclePage aboutToAppear');}onPageShow() {this.textColor = Color.Brown;Logger.info('[LifeCyclePage]  LifeCyclePage onPageShow');}onPageHide() {Logger.info('[LifeCyclePage]  LifeCyclePage onPageHide');}onBackPress() {this.textColor = Color.Red;Logger.info('[LifeCyclePage]  LifeCyclePage onBackPress');return false;}aboutToDisappear() {Logger.info('[LifeCyclePage]  LifeCyclePage aboutToDisappear');}build() {Column() {Text($r('app.string.hello_message')).fontSize(CommonConstants.DEFAULT_FONT_SIZE).fontColor(this.textColor).margin(CommonConstants.DEFAULT_MARGIN).fontWeight(FontWeight.Bold)}.width(CommonConstants.FULL_WIDTH)}
}

在这里插入图片描述

2、页面数据传递

在这里插入图片描述

首页跳转第二页时通过router.pushUrl中的routerParams来传递参数。

在这里插入图片描述

在这里插入图片描述

第二页可以通过router.getParams().src来拿传递过来的值,展示到页面。

3、图片的读取

在这里插入图片描述
在这里插入图片描述

app.media.banner_pic1读取的就是本地目录media下的该图片。

4、数据的备份和恢复

在这里插入图片描述

  • BackupExtensionAbility模块提供备份恢复服务相关扩展能力,为应用提供扩展的备份恢复能力。
  • onBackup(): void; Extension生命周期回调,在执行备份数据时回调,由开发者提供扩展的备份数据的操作。
  • onRestore(bundleVersion: BundleVersion): void;Extension生命周期回调,在执行恢复数据时回调,由开发者提供扩展的恢复数据的操作。
  • 当需要进行数据备份时,‌可以通过实现onBackup()方法来实现备份逻辑(可以通过脚本来实现)。‌
  • 当需要进行数据恢复时,‌可以通过实现onRestore()方法来实现恢复逻辑(可以通过脚本来实现)。‌
    在这里插入图片描述

5、轮播图

class BannerClass {id: string = '';imageSrc: ResourceStr = '';url: string = '';constructor(id: string, imageSrc: ResourceStr, url: string) {this.id = id;this.imageSrc = imageSrc;this.url = url;}
}@Entry
@Component
struct Index {@State message: string = '快速入门';build() {Column() {Text(this.message).fontSize(24).fontWeight(700).width('100%').textAlign(TextAlign.Start).padding({ left: 16 }).fontFamily('HarmonyHeiTi-Bold').lineHeight(33)Banner()}.width('100%').height('100%').backgroundColor('#F1F3F5')}
}@Preview
@Component
struct Banner {@State bannerList: Array<BannerClass> = [new BannerClass('pic0', $r('app.media.banner_pic0'),'https://developer.huawei.com/consumer/cn/training/course/video/C101718352529709527'),new BannerClass('pic1', $r('app.media.banner_pic1'),'https://developer.huawei.com/consumer/cn/'),new BannerClass('pic2', $r('app.media.banner_pic2'),'https://developer.huawei.com/consumer/cn/deveco-studio/'),new BannerClass('pic3', $r('app.media.banner_pic3'),'https://developer.huawei.com/consumer/cn/arkts/'),new BannerClass('pic4', $r('app.media.banner_pic4'),'https://developer.huawei.com/consumer/cn/arkui/'),new BannerClass('pic5', $r('app.media.banner_pic5'),'https://developer.huawei.com/consumer/cn/sdk')];build() {Swiper() {ForEach(this.bannerList, (item: BannerClass, index: number) => {Image(item.imageSrc).objectFit(ImageFit.Contain).width('100%').padding({ top: 11, left: 16, right: 16 }).borderRadius(16)}, (item: BannerClass, index: number) => item.id)}.autoPlay(true).loop(true).indicator(new DotIndicator().color('#1a000000').selectedColor('#0A59F7'))}
}

在这里插入图片描述

使用数组存储轮播图片,遍历展示。

  • loop:设置是否启用循环滑动时调用。
  • autoPlay:设置子组件是否自动播放时调用。
  • indicator:设置指示器已启用,或设置类型样式。

6、页面布局图

在这里插入图片描述

class BannerClass {id: string = '';imageSrc: ResourceStr = '';url: string = '';constructor(id: string, imageSrc: ResourceStr, url: string) {this.id = id;this.imageSrc = imageSrc;this.url = url;}
}class ArticleClass {id: string = '';imageSrc: ResourceStr = '';title: string = '';brief: string = '';webUrl: string = '';constructor(id: string, imageSrc: ResourceStr, title: string, brief: string, webUrl: string) {this.id = id;this.imageSrc = imageSrc;this.title = title;this.brief = brief;this.webUrl = webUrl;}
}@Entry
@Component
struct Index {@State message: string = '快速入门';build() {Column() {Text(this.message).fontSize(24).fontWeight(700).width('100%').textAlign(TextAlign.Start).padding({ left: 16 }).fontFamily('HarmonyHeiTi-Bold').lineHeight(33)Scroll() {Column() {Banner()EnablementView()TutorialView()}}.layoutWeight(1).scrollBar(BarState.Off).align(Alignment.TopStart)}.width('100%').height('100%').backgroundColor('#F1F3F5')}
}@Preview
@Component
struct Banner {@State bannerList: Array<BannerClass> = [new BannerClass('pic0', $r('app.media.banner_pic0'),'https://developer.huawei.com/consumer/cn/training/course/video/C101718352529709527'),new BannerClass('pic1', $r('app.media.banner_pic1'),'https://developer.huawei.com/consumer/cn/'),new BannerClass('pic2', $r('app.media.banner_pic2'),'https://developer.huawei.com/consumer/cn/deveco-studio/'),new BannerClass('pic3', $r('app.media.banner_pic3'),'https://developer.huawei.com/consumer/cn/arkts/'),new BannerClass('pic4', $r('app.media.banner_pic4'),'https://developer.huawei.com/consumer/cn/arkui/'),new BannerClass('pic5', $r('app.media.banner_pic5'),'https://developer.huawei.com/consumer/cn/sdk')];build() {Swiper() {ForEach(this.bannerList, (item: BannerClass, index: number) => {Image(item.imageSrc).objectFit(ImageFit.Contain).width('100%').padding({ top: 11, left: 16, right: 16 }).borderRadius(16)}, (item: BannerClass, index: number) => item.id)}.autoPlay(true).loop(true).indicator(new DotIndicator().color('#1a000000').selectedColor('#0A59F7'))}
}@Component
struct TutorialItem {@Prop tutorialItem: ArticleClass;build() {Row() {Column() {Text(this.tutorialItem.title).height(19).width('100%').fontSize(14).textAlign(TextAlign.Start).textOverflow({ overflow: TextOverflow.Ellipsis }).maxLines(1).fontWeight(400).margin({ top: 4 })Text(this.tutorialItem.brief).height(32).width('100%').fontSize(12).textAlign(TextAlign.Start).textOverflow({ overflow: TextOverflow.Ellipsis }).maxLines(2).fontWeight(400).fontColor('rgba(0, 0, 0, 0.6)').margin({ top: 5 })}.height('100%').layoutWeight(1).alignItems(HorizontalAlign.Start).margin({ right: 12 })Image(this.tutorialItem.imageSrc).height(64).width(108).objectFit(ImageFit.Cover).borderRadius(16)}.width('100%').height(88).borderRadius(16).backgroundColor(Color.White).padding(12).alignItems(VerticalAlign.Top)}
}@Component
struct EnablementItem {@Prop enablementItem: ArticleClass;build() {Column() {Image(this.enablementItem.imageSrc).width('100%').objectFit(ImageFit.Cover).height(96).borderRadius({topLeft: 16,topRight: 16})Text(this.enablementItem.title).height(19).width('100%').fontSize(14).textAlign(TextAlign.Start).textOverflow({ overflow: TextOverflow.Ellipsis }).maxLines(1).fontWeight(400).padding({ left: 12, right: 12 }).margin({ top: 8 })Text(this.enablementItem.brief).height(32).width('100%').fontSize(12).textAlign(TextAlign.Start).textOverflow({ overflow: TextOverflow.Ellipsis }).maxLines(2).fontWeight(400).fontColor('rgba(0, 0, 0, 0.6)').padding({ left: 12, right: 12 }).margin({ top: 2 })}.width(160).height(169).borderRadius(16).backgroundColor(Color.White)}
}@Component
struct EnablementView {@State enablementList: Array<ArticleClass> = [new ArticleClass('1', $r('app.media.enablement_pic1'), 'HarmonyOS第一课','基于真实的开发场景,提供向导式学习,多维度融合课程等内容,给开发者提供全新的学习体验。','https://developer.huawei.com/consumer/cn/doc/harmonyos-video-courses/video-tutorials-0000001443535745'),new ArticleClass('2', $r('app.media.enablement_pic2'), '开发指南','提供系统能力概述、快速入门,用于指导开发者进行场景化的开发。指南涉及到的知识点包括必要的背景知识、符合开发者实际开发场景的操作任务流(开发流程、开发步骤、调测验证)以及常见问题等。','https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/application-dev-guide-0000001630265101'),new ArticleClass('3', $r('app.media.enablement_pic3'), '最佳实践','针对新发布特性及热点特性提供详细的技术解析和开发最佳实践。','https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/topic-architecture-0000001678045510'),new ArticleClass('4', $r('app.media.enablement_pic4'), 'Codelabs','以教学为目的的代码样例及详细的开发指导,帮助开发者一步步地完成指定场景的应用开发并掌握相关知识。Codelabs将最新的鸿蒙生态应用开发技术与典型场景结合,让开发者快速地掌握开发高质量应用的方法。同时支持互动式操作,通过文字、代码和效果联动为开发者带来更佳的学习体验。','https://developer.huawei.com/consumer/cn/doc/harmonyos-codelabs/codelabs-0000001443855957'),new ArticleClass('5', $r('app.media.enablement_pic5'), 'Sample','面向不同类型的开发者提供的鸿蒙生态应用开发优秀实践,每个Sample Code都是一个可运行的工程,为开发者提供实例化的代码参考。','https://developer.huawei.com/consumer/cn/doc/harmonyos-samples/samples-0000001162414961'),new ArticleClass('6', $r('app.media.enablement_pic6'), 'API参考','面向开发者提供鸿蒙系统开放接口的全集,供开发者了解具体接口使用方法。API参考详细地描述了每个接口的功能、使用限制、参数名、参数类型、参数含义、取值范围、权限、注意事项、错误码及返回值等。','https://developer.huawei.com/consumer/cn/doc/harmonyos-references/development-intro-0000001580026066'),new ArticleClass('7', $r('app.media.enablement_pic7'), 'FAQ','开发者常见问题的总结,开发者可以通过FAQ更高效地解决常见问题。FAQ会持续刷新,及时呈现最新的常见问题。','https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs/faqs-development-0000001753952202'),new ArticleClass('8', $r('app.media.enablement_pic8'), '开发者论坛', '和其他应用开发者交流技术、共同进步。','https://developer.huawei.com/consumer/cn/forum/home?all=1'),];build() {Column() {Text('赋能套件').fontColor('#182431').fontSize(16).fontWeight(500).fontFamily('HarmonyHeiTi-medium').textAlign(TextAlign.Start).padding({ left: 16 }).margin({ bottom: 8.5 })Grid() {ForEach(this.enablementList, (item: ArticleClass) => {GridItem() {EnablementItem({ enablementItem: item })}}, (item: ArticleClass) => item.id)}.rowsTemplate('1fr').columnsGap(8).scrollBar(BarState.Off).height(169).padding({ top: 2, left: 16, right: 16 })}.margin({ top: 18 }).alignItems(HorizontalAlign.Start)}
}@Component
struct TutorialView {@State tutorialList: Array<ArticleClass> = [new ArticleClass('1', $r('app.media.tutorial_pic1'), 'Step1 环境的搭建','本篇教程实现了快速入门——一个用于了解和学习HarmonyOS的应用程序。','https://developer.huawei.com/consumer/cn/forum/home?all=1'),new ArticleClass('2', $r('app.media.tutorial_pic2'), 'Step2 使用Swiper构建运营广告位','Swiper组件提供滑动轮播显示的能力。Swiper本身是一个容器组件,当设置了多个子组件后,可以对这些子组件进行轮播显示。','https://developer.huawei.com/consumer/cn/forum/home?all=1'),new ArticleClass('3', $r('app.media.tutorial_pic3'), 'Step3 创建和组合视图','Item定义子组件相关特征。相关组件支持使用条件渲染、循环渲染、懒加载等方式生成子组件。','https://developer.huawei.com/consumer/cn/forum/home?all=1'),new ArticleClass('4', $r('app.media.tutorial_pic4'), 'Step4 网格和列表组建的使用','网格和列表组件中,当Item达到一定数量,内容超过屏幕大小时,可以自动提供滚动功能,适合用于呈现同类数据类型或数据类型集','https://developer.huawei.com/consumer/cn/forum/home?all=1'),new ArticleClass('5', $r('app.media.tutorial_pic5'), 'Step5 应用架构设计基础——MVVM模式','ArkUI采取MVVM = Model + View + ViewModel模式,将数据与视图绑定在一起,更新数据的时候直接更新视图。','https://developer.huawei.com/consumer/cn/forum/home?all=1'),new ArticleClass('6', $r('app.media.tutorial_pic6'), 'Step6 应用架构设计基础——三层架构','为了更好地适配复杂应用的开发,建议采用三层架构的方式对整个应用的功能进行模块化,实现高内聚、低耦合开发。','https://developer.huawei.com/consumer/cn/forum/home?all=1'),new ArticleClass('7', $r('app.media.tutorial_pic7'), 'Step6 ArkWeb页面适配','ArkWeb(方舟Web)提供了Web组件,用于在应用程序中显示Web页面内容,为开发者提供页面加载、页面交互、页面调试等能力。','https://developer.huawei.com/consumer/cn/forum/home?all=1'),new ArticleClass('8', $r('app.media.tutorial_pic8'), 'Step7 数据驱动UI更新', '数据更新的同时会直接驱动UI的改变','xxx'),new ArticleClass('9', $r('app.media.tutorial_pic9'), 'Step8 设置组件导航','Navigation组件适用于模块内页面切换,一次开发,多端部署场景。通过组件级路由能力实现更加自然流畅的转场体验,并提供多种标题栏样式来呈现更好的标题和内容联动效果。','https://developer.huawei.com/consumer/cn/forum/home?all=1'),new ArticleClass('10', $r('app.media.tutorial_pic10'), 'Step9 原生智能:AI语音朗读','文本转语音服务提供将文本信息转换为语音并进行播报的能力,便于用户与设备进行互动,实现实时语音交互,文本播报。','https://developer.huawei.com/consumer/cn/forum/home?all=1'),new ArticleClass('11', $r('app.media.tutorial_pic11'), 'Step10 原生互联:分布式流转','流转能力打破设备界限,多设备联动,使用户应用程序可分可合、可流转,实现如邮件跨设备编辑、多设备协同健身、多屏游戏等分布式业务。','https://developer.huawei.com/consumer/cn/forum/home?all=1'),new ArticleClass('12', $r('app.media.tutorial_pic12'), 'Step11 一次开发,多端部署','一套代码工程,一次开发上架,多端按需部署。支撑开发者快速高效的开发支持多种终端设备形态的应用,实现对不同设备兼容的同时,提供跨设备的流转、迁移和协同的分布式体验。','https://developer.huawei.com/consumer/cn/forum/home?all=1'),];build() {Column() {Text('入门教程').fontColor('#182431').fontSize(16).fontWeight(500).fontFamily('HarmonyHeiTi-medium').textAlign(TextAlign.Start).padding({ left: 16 }).margin({ bottom: 8.5 })List({ space: 12 }) {ForEach(this.tutorialList, (item: ArticleClass) => {ListItem() {TutorialItem({ tutorialItem: item })}}, (item: ArticleClass) => item.id)}.scrollBar(BarState.Off).padding({ left: 16, right: 16 })}.margin({ top: 18 }).alignItems(HorizontalAlign.Start)}
}

页面执行顺序不是自上而下的执行:

1号执行入口组件:
在这里插入图片描述

2号执行预览组件:
在这里插入图片描述

3号带有@Component的,@State自上而下执行,执行到的调用方法里面有@Prop组件的再调用。
在这里插入图片描述
在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Apollo9.0 PNC源码学习之Planning模块—— Lattice规划(四):纵向运动轨迹规划
  • python:画由抛物线: y^2=2x 与直线 y=x-4 所围成的图形
  • DHU OJ 二维数组
  • Spring Boot 3.3 【四】Spring Boot 整合JPA
  • C++ 对C的扩展
  • 西瓜书学习笔记三 归纳偏好
  • python(6) : 读取pdf的文本, 读取pdf每一页为文件
  • 详细介绍pytorch重要的API
  • 靠谱是性价比最高的社交名片:一个靠谱的人往往有这4种品质!
  • 算法的学习笔记—二叉树的镜像(牛客JZ27)
  • Spring 中ConfigurableBeanFactory
  • Redis的热key以及Big(大)key是什么?如何解决Redis的热key以及Big(大)key问题?
  • arcgis打开不同tif格式编码的栅格数据
  • 【卡码网Python基础课 21.图形的面积】
  • 高速信号的眼图、加重、均衡
  • 【React系列】如何构建React应用程序
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 【译】理解JavaScript:new 关键字
  • Apache的80端口被占用以及访问时报错403
  • ES6系列(二)变量的解构赋值
  • IDEA 插件开发入门教程
  • interface和setter,getter
  • Linux链接文件
  • Sass 快速入门教程
  • 从输入URL到页面加载发生了什么
  • 对JS继承的一点思考
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 番外篇1:在Windows环境下安装JDK
  • 服务器从安装到部署全过程(二)
  • 给github项目添加CI badge
  • 我有几个粽子,和一个故事
  • 我这样减少了26.5M Java内存!
  • 详解NodeJs流之一
  • postgresql行列转换函数
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • ​人工智能书单(数学基础篇)
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #Linux(make工具和makefile文件以及makefile语法)
  • (30)数组元素和与数字和的绝对差
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (ros//EnvironmentVariables)ros环境变量
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (一)springboot2.7.6集成activit5.23.0之集成引擎
  • (转)程序员技术练级攻略
  • .gitignore文件使用
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .Net Core和.Net Standard直观理解
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调