首页 > 其他分享 >鸿蒙HarmonyOS自定义组件开发和使用_鸿蒙自定义组件

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

时间:2024-08-29 17:47:32浏览次数:10  
标签:自定义 鸿蒙 Button UI build 组件 页面

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

在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发布后,如果有更新我会在此基础上进行迭代,如果有兴趣的同学还请持续关注我或者订阅我的专栏。

 

标签:自定义,鸿蒙,Button,UI,build,组件,页面
From: https://www.cnblogs.com/luobozhijia/p/18387283

相关文章

  • 鸿蒙开发实战:Column和Row容器组件的使用规范
    Column与Row由之前的介绍可知,我们可以通过Column和Row容器来对页面进行以一个简单的布局,划分不同的功能分区,以搭建一个完整的页面,接下来我将介绍它更多的属性,使其在使用中更好的对页面进行排布划分。首先如图我们可以看到,Column和Row都有一个可选参数“space”,space的类型......
  • 鸿蒙开发实战:声明静态订阅应用规范
    静态订阅者在未接收订阅的目标事件时,处于未拉起状态,当系统或应用发布了指定的公共事件后,静态订阅者将被拉起,并执行onReceiveEvent回调。开发者可通过在onReceiveEvent回调中执行业务逻辑,实现当应用接收到特定公共事件时执行业务逻辑的目的。例如,某应用希望在设备开机的时......
  • 黑马JavaWeb开发笔记09——ElementUI代码引入教程、Element常用组件使用(Table, Pagina
    文章目录前言ElementUI1.快速入门(代码引入教程)2.组件:Table表格3.组件:Pagination分页4.组件:Dialog对话框5.组件:Form表单总结前言本篇文章是2023年最新黑马JavaWeb开发笔记09:ElementUI代码进入教程、常用组件使用的总结,帮助需要学习Web开发的朋友温故而知新。El......
  • net core自定义 Configuration Provider
    创建CustomConfigurationProvider首先,我们需要创建一个自定义的ConfigurationSource和ConfigurationProvider来支持配置文件的读取和监控。publicclassCustomConfigurationSource:IConfigurationSource{publicstringFilePath{get;}publicCustomConfig......
  • Android开发 - Parcelable 接口实现不同组件之间传递数据解析
    什么是ParcelableParcelable是用于对象序列化的一种接口。通俗来讲,Parcelable允许将一个对象转化为一个字节流,这样你就可以将这个对象在不同的组件之间(如Activity、Service等)进行传递为什么需要Parcelable组件之间通信时(比如在两个Activity之间传递数据),传递的对象必......
  • 网络防火墙之自定义chain
    网络防火墙自定义链链管理:-N:new,自定义一条新的规则链-X:delete,删除自定义的空的规则链-P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:ACCEPT:接受DROP:丢弃-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除 ......
  • Java-List结合ComableFuture自定义线程池的工具类
    为了结合CompletableFuture处理列表中的数据,并利用自定义线程池来并行处理这些元素,我们可以创建一个工具类ListCompletableFutureUtil,它包含一个静态方法processListConcurrently,该方法接收一个列表、一个处理每个元素的函数以及一个自定义线程池,并利用CompletableFutur......
  • 洛雪音乐限定复活 - 自定义音源
    洛雪音乐之前因为被发了绿师函所以软件本身不再提供各大平台的接口,但是保留了自定义音源的功能,目前还能支持播放缓存下载功能。感谢sixyin为广大网友做出的贡献。下面简单介绍一下使用方法:Step1准备文件下载并安装洛雪音乐(lx-music-desktop)[官方页面]|[下载链接]下......
  • go 结构体切片自定义排序
    常见类型的默认实现gosort包默认支持int(sort.Ints(x[]int))、float64s(sort.Float64s(x[]float64))、string(sort.Strings(x[]string))从小到大排序,反序使用类似于sort.Sort(sort.Reverse(sort.Ints(x[]int)))的方式。结构体切片的自定义实现packagemainimport( "fmt" "s......
  • IEnumrable接口 GetEnumerator方法 foreach 遍历 自定义 迭代器
    **能用foreach遍历访问的对象需要实现什么接口或声明什么方法**要使用foreach循环,对象必须实现IEnumerable接口或者声明GetEnumerator方法。解释IEnumerable接口:这个接口定义了一个名为GetEnumerator的方法,该方法返回一个枚举器,允许客户端代码逐个访问集合......