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

关键词
- 自定义组件
- 复用组件
- 属性传递
- 组件通信
- 组件封装
一、创建基础自定义组件
自定义组件是一个独立的 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 定义组件的参数,并从外部传递数据。以下示例中,title 和 description 被传入并在组件中显示:
// 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: '这是一段描述文字。'
});
效果示例:展示包含图片、标题和内容的卡片。
四、组件状态管理与内部通信
-
内部状态管理:
- 自定义组件可以使用
@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);} } - 自定义组件可以使用
-
父子组件通信:
- 父组件可以通过状态管理与子组件通信,实现数据共享。例如,父组件控制
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); // 垂直居中} } - 父组件可以通过状态管理与子组件通信,实现数据共享。例如,父组件控制
五、自定义组件的最佳实践
-
组件拆分:
- 尽量将组件拆分为小而独立的部分,每个组件负责一项特定功能,减少耦合。
-
可重用性:
- 为组件提供通用的属性,设置默认值,确保组件在多种场景下均能复用。
-
性能优化:
- 避免在组件内部频繁更新状态,减少不必要的重绘,保证性能。
小结
本篇介绍了自定义组件的创建与使用,涵盖了属性传递、嵌套组合和状态管理等内容。通过自定义组件,开发者可以构建复用性强、逻辑清晰的 UI 模块,大大提升鸿蒙应用的开发效率和维护性。
下一篇预告
下一篇将带你体验第一个互动项目——“灯光控制小项目”,学习如何结合按钮交互和状态管理来实现动态效果。
上一篇:「Mac畅玩鸿蒙与硬件22」鸿蒙UI组件篇12 - Canvas 组件的动态进阶应用
下一篇:「Mac畅玩鸿蒙与硬件24」UI互动应用篇1 - 灯光控制小项目
相关文章:
「Mac畅玩鸿蒙与硬件23」鸿蒙UI组件篇13 - 自定义组件的创建与使用
自定义组件可以帮助开发者实现复用性强、逻辑清晰的界面模块。通过自定义组件,鸿蒙应用能够提高代码的可维护性,并简化复杂布局的构建。本篇将介绍如何创建自定义组件,如何向组件传递数据,以及如何在不同页面间复用这些组件。 关键…...
C++关键字:mutable
文章目录 一、mutable1.mutable修饰非静态的成员变量2.mutable用于lambda表达式3.mutable不能修饰的变量:静态变量、const变量 一、mutable 1.mutable修饰非静态的成员变量 1.mutable仅能修饰类中的非静态的成员变量。不能修饰全局变量、局部变量、静态变量、常量…...
Agent 智能体开发框架选型指南
编者按: 本文通过作者的实践对比发现,框架的选择应基于项目具体需求和团队特点,而不是简单追求某个特定框架。不同框架各有优势: 无框架方案实施最为简单直接,代码结构清晰,适合理解智能体原理,…...
基于Zynq FPGA对雷龙SD NAND的测试
一、SD NAND 特征 1.1 SD 卡简介 雷龙的 SD NAND 有很多型号,在测试中使用的是 CSNP4GCR01-AMW 与 CSNP32GCR01-AOW。芯片是基于 NAND FLASH 和 SD 控制器实现的 SD 卡。具有强大的坏块管理和纠错功能,并且在意外掉电的情况下同样能保证数据的安全。 …...
AOSP沙盒android 11
这里介绍一下aosp装系统 什么是aosp AOSP(Android Open Source Project)是Android操作系统的开源版本。 它由Google主导,提供了Android的源代码和相关工具,供开发者使用和修改。 AOSP包含了Android的核心组件和API,使…...
【JWT】Asp.Net Core中JWT刷新Token解决方案
Asp.Net Core中JWT刷新Token解决方案 前言方案一:当我们操作某个需要token作为请求头的接口时,返回的数据错误error.response.status === 401,说明我们的token已经过期了。方案二:实现用户无感知的刷新token值,我们希望当响应返回的数据是401身份过期时,响应阻拦器自动帮我…...
AJ-Report:一款开源且非常强大的数据可视化大屏和报表工具
嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和工作学习方法 AJ-Report是一个基于Java的开源报表工具,它集成了ECharts、Ant Design Vue等前端技术,致力于为企业提供一站式的数据可视化解决方案…...
stm32不小心把SWD和JTAG都给关了,程序下载不进去,怎么办?
因为想用STM32F103的PA15引脚,调试程序的时候不小心把SWD和JTAD接口都给关了,先看下罪魁祸首 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//关掉JTAG,不关SWGPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);//关掉SW&am…...
【UE5】在材质中实现球形法线技术,常用于改善植物等表面的渲染效果
在材质中实现球形法线,这种技术常用于植被渲染等场景。通过应用球形法线可以显著提升植物再低几何体情况下的光照效果。 三二一上截图! 当然也可以用于任何你希望模型圆润的地方,下图中做了一个Cube倒角...
【MATLAB源码-第210期】基于matlab的OFDM电力线系统仿真,不同梳状导频间隔对比。三种信道估计,三种插值误码率对比
操作环境: MATLAB 2022a 1、算法描述 OFDM电力线通信系统(PLC)是一种通过电力线传输数据的通信技术,利用了OFDM(Orthogonal Frequency Division Multiplexing,正交频分复用)技术的优势来提高…...
基于SpringBoot的城镇保障性住房管理策略
3系统分析 3.1可行性分析 通过对本城镇保障性住房管理系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本城镇保障性住房管理系统采用SSM框架,JA…...
支持高性能结构化数据提取的 Embedding 模型——NuExtract-v1.5
NuExtract 是一个用户友好型模型,设计用于从长文档中提取信息。它可以处理长达 20,000 个标记的输入,是合同、报告和其他商业通信的理想选择。NuExtract 的与众不同之处在于它能够处理和理解文档的整个上下文。这意味着它可以捕捉到可能分散在长文本不同…...
【C#】设计一个选购计算机配置的应用程序
文章目录 1. 创建新的 Windows Forms 应用程序项目2. 设计界面2.1 添加控件和设置属性 3. 编写事件处理代码4. 运行和测试应用程序 1. 创建新的 Windows Forms 应用程序项目 打开 Visual Studio。选择“创建新项目”。在项目类型中选择“Windows Forms 应用程序”(…...
solo博客源码使用idea编译运行
solo博客源码使用idea编译运行 solo博客开源地址本地运行IDEA 编译执行默认直接编译jar 包编译 solo博客开源地址 项目地址:GitHub - 88250/solo: 🎸 B3log 分布式社区的 Java 博客端节点系统,欢迎加入下一代社区网络。B3log distributed co…...
VBA07-方法
一、方法的定义 方法指对象所能执行的动作,它是一个动词。 二、方法的表达方式 三、关于工作簿的方法操作 3-1、新增一个工作簿 示例1: 此时,新增的工作簿的名字是系统默认的。 示例2: 【注意】: 当你尝试将工作簿…...
spring boot 统一异常处理
在 Spring Boot 应用中实现统一异常处理是非常重要的,它可以帮助我们更好地管理和响应应用程序中的错误。通过使用 ControllerAdvice 和 ExceptionHandler 注解,我们可以创建一个全局的异常处理器来捕获并处理不同类型的异常。 步骤 1: 创建一个异常处理…...
跟着小土堆学习pytorch(六)——神经网络的基本骨架(nn.model)
文章目录 一、model介绍二、Module三、张量3.1 定义3.2 用法 一、model介绍 容器 Containers 卷积层 Convolution Layers 池化层 Pooling layers 填…...
数字化落地过程中的研发效能治理如何开展?
数字化落地过程中,针对数字化识别到的问题和短板进行专项治理,是通过数字化手段持续提升研发效能非常重要的一环。组织级的数字化专项治理需要组织级团队和技术团队共同配合协同来完成。其中组织级团队负责制定整体的治理目标、流程和策略,根…...
Windows安装配置node.js
下载安装 下载 访问下载 | Node.js 中文网,下载 推荐使用长期支持版本,但是此次是学习用的,使用最新版本试一下 安装 其实一路next基本就可以了,注意调整下安装目录 查看版本 C:\Users\PC>node -v v22.11.0 C:\Users\PC>…...
Javaweb梳理9——JDBC
Javaweb梳理9——JDBC 1.JDBC概述1.1 JDBC概念1.2 JDBC本质1.3 JDBC好处 2.JDBC快速入门2.1 编写代码步骤2.2 具体操作 3 JDBC API详解3.1 DriverManager3.2 Connection3.2.1 获取执行对象3.2.2 事务管理 3.3 Statement3.3.1 概述3.3.2 代码实现 3.4 ResultSet3.4.1 概述3.4.2 …...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
如何在Windows本机安装Python并确保与Python.NET兼容
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
CppCon 2015 学习:Time Programming Fundamentals
Civil Time 公历时间 特点: 共 6 个字段: Year(年)Month(月)Day(日)Hour(小时)Minute(分钟)Second(秒) 表示…...
鸿蒙HarmonyOS 5军旗小游戏实现指南
1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发,采用DevEco Studio实现,包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...
小智AI+MCP
什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析:AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github:https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...
高抗扰度汽车光耦合器的特性
晶台光电推出的125℃光耦合器系列产品(包括KL357NU、KL3H7U和KL817U),专为高温环境下的汽车应用设计,具备以下核心优势和技术特点: 一、技术特性分析 高温稳定性 采用先进的LED技术和优化的IC设计,确保在…...



