「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 …...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...

基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...

手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...

高端性能封装正在突破性能壁垒,其芯片集成技术助力人工智能革命。
2024 年,高端封装市场规模为 80 亿美元,预计到 2030 年将超过 280 亿美元,2024-2030 年复合年增长率为 23%。 细分到各个终端市场,最大的高端性能封装市场是“电信和基础设施”,2024 年该市场创造了超过 67% 的收入。…...