鸿蒙HarmonyOS自定义组件开发和使用

news2024/12/28 18:02:25

自定义组件的介绍

在开发和使用自定义组件直接,我们需要了解什么是自定义组件?

ArkUI中,UI显示的内容均为组件,由框架直接提供的称为系统组件,由开发者定义的称为自定义组件。在进行 UI 界面开发时,通常不是简单的将系统组件进行组合使用,而是需要考虑代码可复用性、业务逻辑与UI分离,后续版本演进等因素。因此,将UI和部分业务逻辑封装成自定义组件是不可或缺的能力。

自定义组件具有以下特点:

  • 可组合:允许开发者组合使用系统组件、及其属性和方法。

  • 可重用:自定义组件可以被其他组件重用,并作为不同的实例在不同的父组件或容器中使用。

  • 数据驱动UI更新:通过状态变量的改变,来驱动UI的刷新。

我们可以这么理解:自定义组件就是通过各种基础组件的组合,封装为可重用,可组合的UI单元。

自定义组件的基本用法

场景描述:

在日常开发中,我们拿到设计稿后,通过对页面内容进行合理抽象,提取出结构相同以及功能明确的UI单元,组合为自定义组件。

案例:

下面我们以一个实例来说明自定义组件的基本用法:

比如我们需要完成一个待办事项列表的页面开发,除了标题栏,选项卡都是内容重复的,那么我们就可以把这个卡片抽象出一个自定义组件

具体代码如下:

@Preview
@Component
export struct ToDoItem {
  private content?: string;
  //定义状态变量
  @State isComplete: boolean = false

  build() {
    Row() {
      //建立状态与视图间的关系
      if (this.isComplete) {
        Image($r('app.media.check_select')).width(30)
      } else {
        Image($r('app.media.check_normal')).width(30)
      }
      Text(this.content??'自定义组件').fontColor(Color.Black)
        .opacity(this.isComplete ? 0.4 : 1)

    }
    .width('100%')
    .height(40)
    .padding({ left: 16 })
    .margin({ top: 10 })
    .borderRadius(20)
    .backgroundColor(Color.White)
    .onClick(() => {
        //通过点击事件改变状态,达到交互效果
      this.isComplete = !this.isComplete
    })
  }
}

自定义变量isComplete来控制选项卡的状态,在build函数里通过if/else条件渲染语句来描述状态发生后变化的UI,在用户点击onClick后改变状态,ArkUI会自动帮我们渲染出新的UI界面。

具体使用:

import { ToDoItem } from './widget/ToDoItem'

@Preview
@Entry
@Component
struct TodoListPage {
  totalTasks: Array<string> = [];

  aboutToAppear() {
    this.totalTasks = [
      '早起晨读',
      '准备早餐',
      '阅读名著',
      '学习ArkTs',
      '看个电影',
    ]
  }

  build() {
    Column() {
      Text('代办列表')
        .fontSize(24)
        .fontWeight(FontWeight.Bold)
      ForEach(this.totalTasks, (task: string) => {
        ToDoItem({ content: task })
      })
    }.backgroundColor(Color.Gray)
    .height('100%')

  }
}

 这样一个有自定义组件的页面就完成了。

注意:我们通过forEach循环把自定义组件添加到页面上,但是forEach必须在容器组件中,不能作为根节点使用。

公共组件的封装

上面的案例是多组件组合为一个自定义组件只针对单个页面,接下来我们进行公共组件的封装

场景描述

我们在应用开发过程中,不同的业务场景,有可能需要使用相同功能和样式的ArkUI组件。例如,登录页面登录按钮, 购物页面结算按钮可能样式相同。该场景常用方法是抽取相同样式的逻辑部分,并将其封装成一个自定义组件到公共组件库中。在业务场景开发时,统一从公共组件库获取封装好的公用组件。

示例

以最常用的BUtton组件为例,当多个业务场景需要使用相同风格样式的Button组件时,我们可以把通用的逻辑封装成一个自定义组件,在通用多级中定制公共的属性,然后将自定义Button以拓展组件的形式集成到公共组件库中,提供给其他team使用,如果要做到尽善尽美,可能需要穷举所有Button的属性。当然可以自行调整。自定义组件的代码如下

@Component
struct CommonButton {
  @Prop text: string = '';
  @Prop stateEffect: boolean = true;
  // ...穷举所有Button独有属性
  
  build() {
    Button(this.text)
      .fontSize(12)
      .fontColor('#FFFFFF')
      .stateEffect(this.stateEffect)// stateEffect属性的作用是控制默认点击动画
      .xxx //穷举Button其他独有属性赋值
  }
}

在使用自定义Button 组件时,若需修改组件显示内容text和点击动画效果stateEffect时(其他Button独有的属性用法相同),需要以参数的形式传入

@Component
struct Index {
  build() {
    MyButton({ text: '点击带有动效', stateEffect: true, ... }) // 入参包含MyButton 组件中定义的全部 Button独有属性
  }
}

但是这样做也有不少缺点,没有使用系统组件那么方便,因为系统的Button组件是链式调用的方法设置,而自定义后只能通过可选参数形式传入,也不利于后期维护,不易拓展,假如升级到新版本,不分组件的属性发生变更(Harmony Next后可能会有重大变化),自定义组件和使用的地方都需要改动,需要慎用。

组件与页面的生命周期:

有过移动开发经验的同学都清楚,自定义组件需要了解组件和页面声明周期的关系,才有助于我们更好的开发自定义组件,我们先看看ArkUI框架下页面的生命周期:

页面生命周期,即被@Entry装饰的组件生命周期,提供以下生命周期接口:

  • onPageShow:页面每次显示时触发一次,包括路由过程、应用进入前台等场景。

  • onPageHide:页面每次隐藏时触发一次,包括路由过程、应用进入后台等场景。

  • onBackPress:当用户点击返回按钮时触发。

组件生命周期,即一般用@Component装饰的自定义组件的生命周期,提供以下生命周期接口:

  • aboutToAppear:组件即将出现时回调该接口,具体时机为在创建自定义组件的新实例后,在执行其build()函数之前执行。

  • onDidBuild:组件build()函数执行完成之后回调该接口,不建议在onDidBuild函数中更改状态变量、使用animateTo等功能,这可能会导致不稳定的UI表现。

  • aboutToDisappear:aboutToDisappear函数在自定义组件析构销毁之前执行。不允许在aboutToDisappear函数中改变状态变量,特别是@Link变量的修改可能会导致应用程序行为不稳定。

总结

目前自定义组件的用法就是以上几种方式,待HarmonyOS Next发布后,如果有更新我会在此基础上进行迭代,如果有兴趣的同学还请持续关注我或者订阅我的专栏。

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

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

相关文章

scatterlist的相关概念与实例分析

概念 scatterlist scatterlist用来描述一块内存&#xff0c;sg_table一般用于将物理不同大小的物理内存链接起来&#xff0c;一次性送给DMA控制器搬运 struct scatterlist {unsigned long page_link; //指示该内存块所在的页面unsigned int offset; //指示该内存块在页面中的…

CentOS7环境下DataX的安装、使用及问题解决

DataX概述 DataX 是阿里巴巴开源的一个异构数据源离线同步工具&#xff0c;致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。 为了解决异构数据源同步问题&#xff0c;DataX将复杂的网状的同步链路变…

SAP PP学习笔记24 - 生产订单(制造指图)的创建

上面两章讲了生产订单的元素。 SAP PP学习笔记22 - 生产订单&#xff08;制造指图&#xff09;的元素1-CSDN博客 SAP PP学习笔记23 - 生产订单&#xff08;制造指图&#xff09;的元素2 - 决济规则(结算规则)-CSDN博客 这一章讲生产订单的创建。比如 - 生产订单的流程&#…

端口扫描攻击检测及防御方案

端口扫描数据一旦落入坏人之手&#xff0c;可能会成为更大规模恶意活动的一部分。因此&#xff0c;了解如何检测和防御端口扫描攻击至关重要。 端口扫描用于确定网络上的端口是否开放以接收来自其他设备的数据包&#xff0c;这有助于网络安全团队加强防御。但恶意行为者也可以…

ETAS工具导入DEXT生成Dcm及Dem模块(一)

文章目录 前言Cfggen之前的修改ECU关联DcmDslConnectionDiagnostic ProtocolDiagnostic Ecu Instance PropsCommonContributionSetEvent修改communication channel总结前言 诊断模块开发一般是先设计诊断数据库,OEM会释放对应的诊断数据库,如.odx文件或.cdd文件。如果OEM没有…

博士最多8年?硕士6年清退?教育局可没这么说!

哈哈哈&#xff0c;教育部可没说过博士最多八年&#xff0c;教育部说的是 博士研究生教育的最长修业年限&#xff0c;一般为6-8年 并且 对于“因研究未结束而无法正常毕业的博士”&#xff0c;目前高校可以按规定统筹利用科研经费、学费收入、社会捐助等资金&#xff0c;设…

使用minio搭建oss

文章目录 1.minio安装1.拉取镜像2.启动容器3.开启端口1.9090端口2.9000端口 4.访问1.网址http://:9090/ 5.创建一个桶 2.minio文件服务基本环境搭建1.创建一个文件模块2.目录结构3.配置依赖3.application.yml 配置4.编写配置类MinioConfig.java&#xff0c;构建minioClient5.Fi…

【Python】已解决:Python正确安装文字识别库EasyOCR

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;Python正确安装文字识别库EasyOCR 一、分析问题背景 在使用Python进行图像处理和文字识别时&#xff0c;EasyOCR是一个流行的库&#xff0c;它基于PyTorch&…

一大波客户感谢信来袭,感谢认可!

“自美的置业数据中台项目启动以来&#xff0c;贵公司实施团队与服务运营始终以专业、敬业、合作的态度扎根用户、服务用户、与用户共成长。在此&#xff0c;我司表示由衷的感谢&#xff01;” 这是携手美的置业以来&#xff0c;我们收到的第二封客户感谢信。 △ 以上为美的置…

Vue2组件传值(通信)的方式

1.父传后代 ( 后代拿到了父的数据 ) 1. 父组件引入子组件&#xff0c;绑定数据 <List :str1‘str1’></List> 子组件通过props来接收props:{str1:{type:String,default:}}***这种方式父传子很方便&#xff0c;但是父传给孙子辈分的组件就很麻烦&#xff08;父》子…

PerplexityAI与《连线》杂志纠纷事件深度分析

引言 最近&#xff0c;PerplexityAI&#xff0c;这家人工智能搜索领域的新秀公司&#xff0c;因被《连线》杂志指控剽窃内容和捏造事实而陷入困境。这起事件引发了广泛关注&#xff0c;也揭示了AI技术在信息检索和内容生成领域面临的一系列挑战。本文将对该事件进行详细分析&a…

《昇思25天学习打卡营第5天|onereal》

ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型&#xff0c;和MobileNet, SqueezeNet等一样主要应用在移动端&#xff0c;所以模型的设计目标就是利用有限的计算资源来达到最好的模型精度。ShuffleNetV1的设计核心是引入了两种操作&#xff1a;Pointw…

KVB外汇:澳元/美元、澳元/纽元、英镑/澳元的走势如何?

摘要 本文对近期澳元/美元、澳元/纽元、英镑/澳元的技术走势进行了详细分析。通过对关键支撑位和阻力位的分析&#xff0c;我们可以更好地理解澳元在不同货币对中的表现。随着全球经济形势的变化&#xff0c;各国央行的货币政策对外汇市场的影响也愈发明显。本文旨在帮助投资者…

centos7+离线安装nginx

1.提取rpm包 链接&#xff1a;https://pan.baidu.com/s/1qLNPubAD_qt59Pzws4nnog 提取码&#xff1a;0124 --来自百度网盘超级会员V3的分享 2.安装流程 rpm -ivh nginx-1.20.1-1.el7.ngx.x86_64.rpm 在使用 nginx 时&#xff0c;通常需要掌握一些基本的命令来管理其启动、查…

新能源行业必会基础知识-----电力市场概论笔记-----经济学基础

新能源行业知识体系-------主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/139946830 目录 1. 什么是市场2. 电力市场机制设计的基本要求 1. 什么是市场 经济学定义 市场是供需双方交易并决定商品价格和产量的机制市场可…

新学期必备,录取情况统计如何制作?

暑假即将开始&#xff0c;新学期离我们又近了一步&#xff0c;老师们是不是在为如何高效统计录取情况而头疼呢&#xff1f;别担心&#xff0c;分享一个超实用的小技巧——使用易查分小程序的新建填表功能&#xff0c;让你的录取统计工作变得简单又高效&#xff01; 打开易查分小…

汇总大语言模型LLM的评测基准数据集(BenchMarks)

文章目录 0. 引言1. 知识与语言理解1.1 MMLU1.2 ARC1.3 GLUE1.4 Natural Questions1.5 LAMBADA1.5 HellaSwag1.6 MultiNLI1.7 SuperGLUE1.8 TriviaQA1.9 WinoGrande1.10 SciQ 2. 推理能力2.1 GSM8K2.2 DROP2.3 CRASS2.4 RACE2.5 BBH2.6 AGIEval2.7 BoolQ 3. 多轮开放式对话3.1 …

一文弄懂梯度下降算法

1、引言 在上一篇文章中&#xff0c;我们介绍了如何使用线性回归和成本损失函数为房价数据找到最拟合的线。不过&#xff0c;我们也看到&#xff0c;测试多个截距值可能既繁琐又低效。在本文中&#xff0c;我们将深入探讨梯度下降算法&#xff0c;这是一种更加强大的技术&…

three.js场景三元素

three.js是一个基于WebGL的轻量级、易于使用的3D库。它极大地简化了WebGL的复杂细节&#xff0c;降低了学习成本&#xff0c;同时提高了性能。 three.js的三大核心元素&#xff1a; 场景&#xff08;Scene&#xff09; 场景是一个三维空间&#xff0c;是所有物品的容器。可以将…

桌面提醒工具哪个好?简单好用的便签提醒app推荐

在日常的生活和工作中&#xff0c;我们经常会遇到各种各样的事情&#xff0c;有时候可能会遗忘一些重要的事情。这个时候&#xff0c;一个简单好用的便签提醒工具就显得尤为重要了。那么&#xff0c;哪款桌面提醒工具比较好用呢&#xff1f;下面&#xff0c;就为大家推荐一款我…