首页 > 其他分享 >「Mac畅玩鸿蒙与硬件23」鸿蒙UI组件篇13 - 自定义组件的创建与使用

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

时间:2024-11-04 20:18:13浏览次数:3  
标签:鸿蒙 自定义 title Prop 设置 组件 标题

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

在这里插入图片描述


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

一、创建基础自定义组件

自定义组件是一个独立的 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 实例,带有不同标题和内容。
在这里插入图片描述


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

自定义组件可以使用 @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); // 设置圆角
  }
}

效果示例:显示标题和描述,展示信息卡片。
在这里插入图片描述


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);
  }
}

效果示例:当未传递标题和描述时,展示默认信息。
在这里插入图片描述


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

自定义组件可以嵌套使用,创建更复杂的 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://example.com/sample.jpg',
  title: '图片标题',
  content: '这是一段描述文字。'
});

效果示例:展示包含图片、标题和内容的卡片。
在这里插入图片描述


四、组件状态管理与内部通信
  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 - 灯光控制小项目

标签:鸿蒙,自定义,title,Prop,设置,组件,标题
From: https://blog.csdn.net/weixin_44217688/article/details/143455797

相关文章

  • 谈一谈React18的服务端组件
    最近笔者腾出了大把的时间,学习了一下React18。什么是服务器组件React18带来了一个实验性的特性:ReactServerComponents,简称RSC,即服务器组件。服务器组件可能会在React19版本作为稳定特性推出。如果目前就用于生产的话,可能需要注意API在未来的变化情况。什么是服务器......
  • ArkTS鸿蒙页面(ArkUI-X Empty Ability)
    1.基础1.1.存储变量,常量lettitle:string='巨无霸汉堡'console.log('字符串title',title)//1.2数字number类型letage:number=18console.log('年纪age',age)//1.3布尔boolean类型(true真,false假)letisLogin:boolean=falseconsole.log(&#......
  • 鸿蒙Banner图一多适配不同屏幕
    认识一多随着终端设备形态日益多样化,分布式技术逐渐打破单一硬件边界,一个应用或服务,可以在不同的硬件设备之间随意调用、互助共享,让用户享受无缝的全场景体验。而作为应用开发者,广泛的设备类型也能为应用带来广大的潜在用户群体。但是如果一个应用需要在多个设备上提供同样的内容......
  • 猿大师办公助手在线编辑微软Office/金山wps网页组件COM加载项启用说明
    猿大师办公助手作为国内一款优秀的在线编辑Office插件,越来越受到更多客户的认可并实施了采购,猿大师办公助手与其他的厂商采用弹窗模式实现网页内嵌不同,猿大师办公助手是目前国内唯一真正实现网页内嵌本机Office的方案,效果如下图: 猿大师办公助手官网:www.yuanofficer.com/猿......
  • 移植 AWTK 到 纯血鸿蒙 (HarmonyOS NEXT) 系统 (8) - 原生输入法
    AWTK在嵌入式平台使用内置的输入法,在移动设备上使用系统的原生输入法。在AWTK-Android和AWTK-IOS中,使用的是SDL封装之后的系统原生输入法。在AWTK-HarmonyOS中,要使用系统的原生输入法。需要实现input_method接口:1.启动输入法编辑器得到焦点时,启动输入法。调......
  • 09-鸿蒙开发中的界面开发:布局思路入门
     大家好,欢迎来到鸿蒙开发系列教程!今天,我们将深入探讨界面开发中的布局思路。布局是用户界面设计的核心,合理的布局不仅可以提升用户体验,还能使代码更加整洁和易于维护。无论你是初学者还是有一定经验的开发者,理解布局的思路都是非常有帮助的。让我们开始吧!1.什么是界面布局?......
  • 01-鸿蒙开发环境准备:新手入门指南
        大家好,欢迎来到鸿蒙开发的新世界!作为一名即将踏上鸿蒙开发之旅的开发者,首先你需要做的是准备好你的开发环境。别担心,这并不是一件难事,只要你跟着这篇文章一步步来,相信很快你就能在鸿蒙开发的道路上迈出坚实的一步。1.下载DevEcoStudio首先,你需要一台运行Wind......
  • Android的自定义View和自定义ViewGroup
    Android自定义视图(View)和视图组(ViewGroup)详解在Android开发中,有时候我们需要创建一些标准控件无法满足需求的自定义视图(View)和视图组(ViewGroup)。本文将详细介绍如何创建自定义视图和视图组,包括构造方法、自定义属性、绘制逻辑、测量逻辑、布局逻辑和设置布局参数等内容。1.......
  • 「Java开发指南」如何自定义Spring代码生成?(一)
    搭建用户经常发现自己对生成的代码进行相同的修改,这些修改与个人风格/偏好、项目特定需求或公司标准有关,本教程演示自定义代码生成模板,您将学习如何:创建自定义项目修改现有模板来包含自定义注释使用JET和Skyway标记库中的标记配置项目来使用自定义MyEclipsev2024.1离线版......
  • 深入学习软件组件认证的三个关键
    人工智能软件,特别是深学习组件,是目前实现自主汽车等自主系统的最先进和经济上可行的解决方案。然而,DL算法的性质及其当前的实现与汽车、卫星和火车等安全关键系统中严格的软件开发过程不一致。传统的安全相关软件采用自上而下的方法,对组件进行分解,并相应地传播安全要求,直至......