鸿蒙ArkUI实例:【自定义组件】

 组件是 OpenHarmony 页面最小显示单元,一个页面可由多个组件组合而成,也可只由一个组件组合而成,这些组件可以是ArkUI开发框架自带系统组件,比如 Text 、 Button 等,也可以是自定义组件,本节笔者简单介绍一下自定义组件的语法规范。

定义组件

自定义一个组件,首先要定义好名称,尽量做到见名知意,比如定义一个标题栏组件,笔者把它命名为 TitleBar ,为了让系统知道这是一个组件,需要使用 @Component 修饰符和 struct 关键字修饰,格式:【@Component struct + 组件名称】,如下所示:

@Component struct TitleBar {build() {// 省略}
}@Entry @Component struct Index {build() {// 省略}
}
  • struct:表示 TitleBar 是一个结构体,使用 struct 关键字必须实现 build() 方法,否则编译器报错:Require build function for struct 。
  • @Component:表示 TitleBar 这个结构体具有组件化的能力,也就是说它可以成为一个独立的组件。
  • @Entry:表示当前组件是页面的总入口,简单理解就是页面的根节点,一个页面有且仅有一个 @Entry 修饰符,只有被 @Entry 修饰的组件或者子组件才会在页面上显示。

📢:自定义组件禁止添加构造函数,否则编译器报错。

更多鸿蒙开发应用知识已更新gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md参考前往。

搜狗高速浏览器截图20240326151450.png

刷新组件

使用 struct 关键字修饰完 TitleBar 后必须实现 build() 方法,该方法满足 Builder 构造器接口定义,用于定义组件的声明式 UI 描述,在组件创建或者组件内 @State 修饰的变量更新时系统都会自动调用 build() 方法。

@Component struct TitleBar {@State count: number = 0;build() {Flex() {Text("index:" + this.number)// ……}.width('100%').height('100%').backgroundColor("#aabbcc")}
}

上述样例中当 count 的值发生了变化,系统会自动调用 build() 方法更新相关属性值,实现 UI 刷新的目的。

导出组件

自定义完组件后,提供给外界使用时还要允许该组件可以导出,导出组件使用关键字 export ,如下所示:

@Component export struct TitleBar { // 使用export关键字导出TitleBar组件build() {Flex() {}.width('100%').height('100%').backgroundColor("#aabbcc")}
}

使用组件

使用自定义组件用关键字 import 导入即可,例如使用自定义组件 TibleBar ,导入如下所示:

import {TitleBar} from "../../common/widgets/titlebar" // 导入TitleBar@Entry @Component struct Index {build() {Column() {TitleBar({titleBarAttribute: {                   // 使用TitleBar// 添加相关属性}})}.padding({bottom: 5}).backgroundColor('#010101').width('100%').height('100%')}
}

自定义组件的使用和系统组件使用无差别,直接引用即可,如果自定义组件需要传值,方式是在组件的构造方法中传递一个匿名对象 {} 进去,且该匿名对象中的属性名称和类型要和自定义组件中的属性保持一致

组件生命周期

ArkUI开发框架赋予了组件独有的生命周期方法,对于系统组件来讲,生命周期方法是 onAppear 和 onDisAppear

  • 组件的生命周期

    使用 @Component 修饰的组件,ArkUI开发框架会自动为其赋予私有的生命周期方法 aboutToAppear() 和 aboutToDisappear() ,它们用于通知开发者该自定义组件的生命周的变更。

    • aboutToAppear:函数在创建自定义组件的新实例后,在执行其 build() 函数之前执行。允许在该函数中改变状态变量,更改将在后续执行 build() 函数中生效。
    • aboutToDisappear:函数在自定义组件析构消耗之前执行。不允许在该函数中改变状态变量,特别是 @Link 变量的修改可能会导致应用程序行为不稳定。
  • 页面的生命周期

    页面本质上也是一个组件,只是页面对于组件来讲多了一个修饰符 @Entry,该修饰符表示当前组件是一个页面,它需要在 config.json 中做配置,页面除了具有组件的生命周期外,它还有自己独有的生命周期方法:

    • onPageShow:页面显示时触发一次,包括路由过程、应用进入前后台等场景,仅 @Entry 修饰的自定义组件生效。

    • onPageHide:页面消失时触发一次,包括路由过程、应用进入前后台等场景,仅 @Entry 修饰的自定义组件生效。

    • onBackPress:当用户点击返回按钮时触发,仅 @Entry 修饰的自定义组件生效。该方法返回 boolean 类型的值,说明如下:

      • 返回 true 表示页面自己处理返回逻辑, 不进行页面路由。
      • 返回 false 表示使用默认的返回逻辑。
      • 不返回值会作为 false 处理。

组件生命周期制作表格对比说明如下:

函数名描述
onAppear系统组件独有的方法,组件从组件树上挂载的回调。
onDisAppear系统组件独有的方法,组件从组件树上卸载的回到。
aboutToAppear函数在创建自定义组件的新实例后,在执行其 build() 函数之前执行。允许在该函数中改变状态变量,更改将在后续执行 build() 函数中生效。
aboutToDisappear函数在自定义组件析构消耗之前执行。不允许在该函数中改变状态变量,特别是 @Link 变量的修改可能会导致应用程序行为不稳定。
onPageShow页面显示时触发该回调,包括路由过程、应用进入前后台等场景。仅 @Entry 修饰的自定义组件生效。
onPageHide页面消失时触发该回调,包括路由过程、应用进入前后台等场景。仅 @Entry 修饰的自定义组件生效。
onBackPress当用户点击返回按钮时触发,该方法返回 boolean 类型,true:表示页面自己处理返回逻辑, 不进行页面路由。false:表示使用默认的返回逻辑。不返回值会作为 false 处理。仅 @Entry 修饰的自定义组件生效。

📢:这些回调函数是私有的,在运行时由开发框架在特定的时间进行调用,不能从应用程序中手动调用这些回调函数。

📢:允许在生命周期函数中使用 Promise 和异步回调函数,比如网络资源获取,定时器设置等;不允许在生命周期函数中使用 async await 。

再按一次,退出应用

我们在使用第三方 APP 的时候会遇见点击返回键提示再按一次退出应用的场景,比如在短时间内不按,就不会退出 APP 达到留住用户的目的,接下来我们实现这个再按一次退出应用的例子。

根据页面生命周期的方法可知,点击返回键的时候会调用 onBackPress() 方法,因此判断是否是第一次点击,如果是则返回 true 并给用户提示,如果不是则判断两次点击的时间间隔,若间间隔小于 2 秒,那么就直接退出 APP ,否则给用户提示,本样例复用第二章的测试代码,如下所示:

import app from '@system.app';@Entry @Component struct Index {private lastExitTime: number = -1;               // 记录点击时间@State count: number = 0;                        // 状态数据build() {Stack({alignContent: Alignment.BottomEnd}) {   // 堆叠式布局Text(this.count.toString())                  // 显示文本.fontSize(50)                              // 文字大小.textAlign(TextAlign.Center)               // 居中对齐.size({width: '100%', height: '100%'})     // 控件大小Button('+')                                  // 显示一个+按钮.size({width: 80, height: 80})             // 按钮大小.fontSize(50)                              // 按钮文字大小.onClick(() => {                           // 按钮点击事件this.count++;                            // count累加,触发build()方法回调}).margin(50)}.width('100%').height('100%')}onBackPress() {if (-1 == this.lastExitTime) {                 // 第一次点击返回键,提示toastthis.lastExitTime = new Date().getTime();prompt.showToast({message: "再按一次退出应用"})return true;} else {let currentTime = new Date().getTime();if(currentTime - this.lastExitTime > 2000) { // 时间大于2000提示prompt.showToast({message: "再按一次退出应用"})this.lastExitTime = currentTime;return true;} else {                                     // 2秒内点击,退出APPapp.terminate();}}return false;}
}

鸿蒙开发岗位需要掌握那些核心要领?

目前还有很多小伙伴不知道要学习哪些鸿蒙技术?不知道重点掌握哪些?为了避免学习时频繁踩坑,最终浪费大量时间的。

自己学习时必须要有一份实用的鸿蒙(Harmony NEXT)资料非常有必要。 这里我推荐,根据鸿蒙开发官网梳理与华为内部人员的分享总结出的开发文档。内容包含了:【ArkTS、ArkUI、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战】等技术知识点。

废话就不多说了,接下来好好看下这份资料。

如果你是一名Android、Java、前端等等开发人员,想要转入鸿蒙方向发展。可以直接领取这份资料辅助你的学习。鸿蒙OpenHarmony知识←前往。下面是鸿蒙开发的学习路线图。

针对鸿蒙成长路线打造的鸿蒙学习文档。鸿蒙(OpenHarmony )学习手册(共计1236页)与鸿蒙(OpenHarmony )开发入门教学视频,帮助大家在技术的道路上更进一步。

其中内容包含:

《鸿蒙开发基础》鸿蒙OpenHarmony知识←前往

  1. ArkTS语言
  2. 安装DevEco Studio
  3. 运用你的第一个ArkTS应用
  4. ArkUI声明式UI开发
  5. .……

《鸿蒙开发进阶》鸿蒙OpenHarmony知识←前往

  1. Stage模型入门
  2. 网络管理
  3. 数据管理
  4. 电话服务
  5. 分布式应用开发
  6. 通知与窗口管理
  7. 多媒体技术
  8. 安全技能
  9. 任务管理
  10. WebGL
  11. 国际化开发
  12. 应用测试
  13. DFX面向未来设计
  14. 鸿蒙系统移植和裁剪定制
  15. ……

《鸿蒙开发实战》鸿蒙OpenHarmony知识←前往

  1. ArkTS实践
  2. UIAbility应用
  3. 网络案例
  4. ……

最后

鸿蒙是完全具备无与伦比的机遇和潜力的;预计到年底将有 5,000 款的应用完成原生鸿蒙开发,这么多的应用需要开发,也就意味着需要有更多的鸿蒙人才。鸿蒙开发工程师也将会迎来爆发式的增长,学习鸿蒙势在必行!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hive词频统计---文件始终上传不来

目录 准备工作: 文件内容: 创建数据库及表 将文件上传到:上传到/user/hive/warehouse/db1.db/t_word目录下 hive里面查询,始终报错:(直接查询也是不行) 解决方案: 准备工作&am…

OPC UA遇见chatGPT

最近opc 基金会将召开一个会议,主题是”OPC UA meets IT“。由此可见,工业自动化行业也开始研究和评估chatGPT带来的影响了。 本文谈谈本人对OPC UA 与chatGPT结合的初步实验和思考。 构建OPC UA 信息模型 chatGPT 的确非常强大了,使用自然…

Stable Diffusion文生图技术详解:从零基础到掌握CLIP模型、Unet训练和采样器迭代

文章目录 概要Stable Diffusion 底层结构与原理文本编码器(Text Encoder)图片生成器(Image Generator) 那扩散过程发生了什么?stable diffusion 总体架构主要模块分析Unet 网络采样器迭代CLIP 模型 小结 概要 Stable …

C++设计模式:装饰器模式(四)

1、定义与动机 装饰器模式定义:动态(组合)地给一个对象增加一些额外的职责。就增加功能而言,Decorator模式比生成子类(继承)更为灵活(消除重复代码 & 减少子类个数)。 在某些情…

如何理解CDN?说说实现原理?

文章目录 一、是什么二、原理分析负载均衡系统缓存代理 三、总结参考文献 一、是什么 CDN (全称 Content Delivery Network),即内容分发网络 构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内…

成为一个ATE工程师是什么体验?

当你成为ATE工程师,是什么感受? 按照业内资深工程师的玩笑话来说:整的是比劳斯莱斯还贵的设备,更高端的机台顶得起上海几套房。 1、什么是ATE测试? 一颗芯片的生命周期始于市场需求,从产品的定义与设计&…

蓝桥杯-dfs搜索模板题(一)

蓝桥杯-dfs搜索模板题&#xff08;一&#xff09; P2089 烤鸡P1088 火星人P1149 火柴棒等式P2036 PERKETP1135 奇怪的电梯结语 P2089 烤鸡 对于每个位置枚举数字 #include<bits/stdc.h>using namespace std;const int N1010;int n;int arr[N];//临时方案 int res0;//方案…

163 Linux C++ 通讯架构实战17,本地套接字整理对比,IPC:pipe,fifo,mmap,信号,本地套

IPC&#xff1a; Linux环境下&#xff0c;进程地址空间相互独立&#xff0c;每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到&#xff0c;所以进程和进程之间不能相互访问&#xff0c;要交换数据必须通过内核&#xff0c;在内核中开辟一块缓冲…

并发编程三大特性之可见性

一、什么是可见性&#xff1f; 可见性问题是基于CPU位置出现的&#xff0c;cpu处里速度非常快&#xff0c;相对CPU来说去主内存 获取数据这个事情太慢了&#xff0c;CPU就提供了 L1&#xff0c;L2&#xff0c;L3的三季缓存&#xff0c;每次去主内存拿完 数据后&#xff0c;数据…

使用LIKE进行模糊查询

查询包含字符‘e’的信息 % 代表不确定个数的字符&#xff08;零个或多个&#xff09; SELECT employee_id, first_name FROM employees WHERE first_name LIKE %e%; 查询以字符‘e’开头的字符 SELECT employee_id, first_name FROM employees WHERE first_name LIKE e%; _…

腾讯云2024年优惠券领取及使用常见问题

腾讯云作为国内领先的云计算服务提供商&#xff0c;经常会推出各种优惠活动&#xff0c;以此来吸引用户上云。其中&#xff0c;优惠券作为一种常见的促销方式&#xff0c;受到了众多用户的青睐。然而&#xff0c;在领取和使用优惠券的过程中&#xff0c;大家可能会遇到一些常见…

1.《C语言》—— [常见概念]

前言: C语言是学习编程的一门语言&#xff0c;C语言概念少&#xff0c;词汇少&#xff0c;包含了基本的编程元素&#xff0c;再后来的很多语言如&#xff08;C&#xff0c;Java&#xff09;等都参考了C语言&#xff0c;所以想要学好编程&#xff0c;C语言是必不可少的一门&…

77、WAF攻防——权限控制代码免杀异或运算变量覆盖混淆加密传参

文章目录 WAF规则webshell免杀变异 WAF规则 函数匹配 工具指纹 webshell免杀变异 php 传参带入 eval可以用assert来替换,assert也可以将字符串当作php代码执行漏洞 php 变量覆盖 php 加密 使用加密算法对php后门进行加密 php 异或运算 简化:无字符webshellP 无数字字母rc…

《米小圈上学记》——让孩子爱上阅读一点也不难!

阅读能力的培养是小学语文素质教育重要的组成部分&#xff0c;阅读能力的高低&#xff0c;直接关系到学生的理解能力、运用知识的能力以及表达能力的提升。提高小学生的阅读能力不仅关系到小学生语文素养的培养&#xff0c;而且对他们开阔视野、提高内涵、增加底蕴、放飞心灵有…

哈希存节点,双dp数组存选和不选

小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为 root 。 除了 root 之外&#xff0c;每栋房子有且只有一个“父“房子与之相连。一番侦察之后&#xff0c;聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连…

Linux:安装zabbix-agent被监控端(2)

本章是结合着上一篇文章的续作 Linux&#xff1a;部署搭建zabbix6&#xff08;1&#xff09;-CSDN博客https://blog.csdn.net/w14768855/article/details/137426966?spm1001.2014.3001.5501本章将在两台centos部署agent端&#xff0c;然后使用server进行连接监控 agent1 在1…

11、子串-滑动窗口最大值

题解&#xff1a; 双端队列是一种特殊的队列&#xff0c;允许你在队列的两端进行插入和删除操作。在滑动窗口问题中&#xff0c;我们使用它来存储可能是当前窗口最大值的元素的索引。 维护队列的顺序&#xff1a; 当新元素进入窗口时&#xff0c;我们将它与队列尾部的元素进…

《科技创业月刊》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答&#xff1a;问&#xff1a;《科技创业月刊》是什么级别的刊物&#xff1f; 答&#xff1a;省级&#xff0c;主管单位&#xff1a; 湖北省科学技术厅 &#xff1b;主办单位&#xff1a;湖北省科技信息研究院 问&#xff1a;《科技创业月刊》是c刊吗&#xff1f; 答&…

spring面试八股

常用的注册bean的方式 ComponentScan扫描到的service和Controller等的注解 Configration配置类或者是xml文件的定义。 spring中有几种依赖注入的方式 1.构造器注入。 2.setter方法注入。 3.使用field属性的方式注入。 applicationContext是什么 spring bean spring aop Aop…

2-django、http、web框架、django及django请求生命周期、路由控制、视图层

1 http 2 web框架 3 django 3.1 django请求生命周期 4 路由控制 5 视图层 1 http #1 http 是什么 #2 http特点 #3 请求协议详情-请求首行---》请求方式&#xff0c;请求地址&#xff0c;请求协议版本-请求头---》key:value形式-referer&#xff1a;上一次访问的地址-user-agen…