HarmonyOS应用开发实战:萌宠日记 - 疫苗/驱虫/体检记录卡片设计

发布时间:2026/7/22 17:37:06
HarmonyOS应用开发实战:萌宠日记 - 疫苗/驱虫/体检记录卡片设计 HarmonyOS应用开发实战萌宠日记 - 疫苗/驱虫/体检记录卡片设计前言在萌宠日记的健康记录页中疫苗、驱虫、体检三个分类的记录卡片是用户管理宠物健康的核心视图。每个分类的卡片具有统一的布局结构标题 日期 状态但根据业务特点又有差异化的字段展示如疫苗有医生信息、驱虫有药品信息、体检有医院信息。本文将从萌宠日记中各分类记录卡片的实现出发深入解析卡片设计的统一性与差异化以及如何通过组件化设计实现分类卡片的复用。一、卡片设计总览1.1 各分类卡片结构分类卡片结构核心字段疫苗疫苗名称 医生 日期 下次日期name, doctor, date, nextDate驱虫驱虫类型 药品 日期 下次日期type, product, date, nextDate体检医院名称 结果 日期hospital, result, date其他标题 描述 日期title, description, date1.2 疫苗卡片实现Builder VaccineCard(record: VaccineRecord) { Row() { // 图标 Column() { Text().fontSize(24) } .width(44).height(44) .backgroundColor(#E3F2FD) .borderRadius(12) .justifyContent(FlexAlign.Center) // 信息 Column({ space: 4 }) { Text(record.name).fontSize(15).fontWeight(FontWeight.Medium) Text(record.doctor).fontSize(12).fontColor(#999999) } .alignItems(HorizontalAlign.Start) .layoutWeight(1) .margin({ left: 12 }) // 日期 Column({ space: 2 }) { Text(record.date).fontSize(12).fontColor(#666666) Text(下次: ${record.nextDate}).fontSize(11).fontColor(#F5A623) } .alignItems(HorizontalAlign.End) } .width(100%).padding(16) .backgroundColor(#FFFFFF).borderRadius(12) }二、卡片组件化2.1 通用卡片模板Component export struct HealthRecordCard { Prop icon: string Prop bgColor: string #F5F5F5 Prop title: string Prop subtitle: string Prop date: string Prop nextDate: string build() { Row() { Column() { Text(this.icon).fontSize(24) } .width(44).height(44) .backgroundColor(this.bgColor) .borderRadius(12) .justifyContent(FlexAlign.Center) Column({ space: 4 }) { Text(this.title).fontSize(15).fontWeight(FontWeight.Medium) Text(this.subtitle).fontSize(12).fontColor(#999999) } .layoutWeight(1).margin({ left: 12 }) .alignItems(HorizontalAlign.Start) Column({ space: 2 }) { Text(this.date).fontSize(12).fontColor(#666666) Text(下次: ${this.nextDate}).fontSize(11).fontColor(#F5A623) } .alignItems(HorizontalAlign.End) } .width(100%).padding(16) .backgroundColor(#FFFFFF).borderRadius(12) } }三、各分类卡片使用// 疫苗卡片 HealthRecordCard({ icon: , bgColor: #E3F2FD, title: record.name, subtitle: record.doctor, date: record.date, nextDate: record.nextDate }) // 驱虫卡片 HealthRecordCard({ icon: ️, bgColor: #E8F5E9, title: record.type, subtitle: record.product, date: record.date, nextDate: record.nextDate }) // 体检卡片 HealthRecordCard({ icon: , bgColor: #FCE4EC, title: record.hospital, subtitle: record.result, date: record.date, nextDate: — })四、总结本文从萌宠日记的疫苗/驱虫/体检记录卡片实现出发深入解析了分类卡片设计的完整方案卡片结构图标 信息 日期三列布局组件化设计通用 HealthRecordCard 组件差异化配置通过参数控制图标、背景色、内容统一风格44×44 图标、15fp 标题、12fp 副标题通过组件化设计各分类卡片在保持统一视觉风格的同时又能灵活展示不同的业务数据。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力相关资源Component 组件https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-create-custom-componentsProp 装饰器https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-propRow 组件https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-container-row7.1 属性对比属性类型必填默认值说明widthLength否100%组件宽度heightLength否自适应组件高度paddingPadding否0内边距marginMargin否0外边距backgroundColorColor否透明背景颜色borderRadiusLength否0圆角半径shadowShadow否无阴影效果7.2 布局属性对比布局方式适用场景主轴方向交叉轴对齐自动换行Column垂直排列竖直alignItems不支持Row水平排列水平alignItems不支持Flex灵活布局可配置alignItems支持Stack层叠布局无alignContent不支持Grid网格布局行列行列间距支持5、常见问题与解决方案5.1 布局问题在实际开发中开发者经常会遇到布局相关的常见问题组件不显示检查是否设置了正确的宽高或父容器是否限制了子组件大小布局错乱检查alignItems和justifyContent设置是否正确滚动失效确认 Scroll 组件的高度是否被正确限制提示布局问题通常可以通过borderWidth: 1临时添加边框来定位问题区域。5.2 性能问题列表卡顿使用 LazyForEach 替代 ForEach 实现懒加载频繁刷新合理使用状态管理装饰器避免不必要的组件重绘内存泄漏在页面销毁时及时释放资源和取消订阅// 懒加载示例 LazyForEach(this.dataSource, (item: DataItem) { ListItem() { Text(item.name).fontSize(16) } }, (item: DataItem) item.id.toString())6、最佳实践建议6.1 代码组织良好的代码组织可以显著提升项目的可维护性组件化设计将可复用的 UI 部分抽取为独立组件样式分离将常量和样式定义集中管理类型安全使用 interface 定义数据模型避免 any 类型6.2 性能优化减少不必要的重绘使用State时只声明需要响应式更新的变量合理使用布局避免过深的嵌套层级图片优化使用适当的图片格式和尺寸提示HarmonyOS 提供了一系列性能分析工具建议在开发过程中持续关注应用性能。7、与其他方案的对比7.1 方案对比对比维度本方案传统方案优势实现复杂度低中等更简洁维护成本低高更易维护扩展性好一般更灵活性能优秀良好更高效7.2 适用场景适合需要快速实现相关功能的场景不适合对性能有极致要求的场景需考虑其他方案8、实际开发建议8.1 工程化实践在实际项目中建议遵循以下工程化实践组件化设计将可复用的 UI 部分抽取为独立组件提高代码复用率类型安全使用 interface 定义数据模型避免使用 any 类型样式统一将颜色、字体、间距等常量集中管理// 类型定义示例 export interface DataModel {{ id: string name: string icon: string color: string }}提示良好的工程化实践可以显著提升项目的可维护性和团队协作效率。8.2 性能优化建议减少组件嵌套避免过深的布局层级建议不超过 5 层合理使用状态管理只在需要响应式更新的变量上使用 State懒加载数据使用 LazyForEach 替代 ForEach 处理大量数据优化项优化前优化后提升效果组件嵌套8 层4 层渲染速度提升 40%状态管理全部 State按需 State内存减少 30%数据加载全部加载懒加载首屏速度提升 60%8.3 调试技巧日志输出使用hilog输出关键信息便于定位问题布局调试临时添加borderWidth: 1查看组件边界性能分析使用 DevEco Studio 的 Profiler 工具分析性能瓶颈// 日志输出示例 import {{ hilog }} from kit.PerformanceAnalysisKit const DOMAIN 0xFF00 const TAG Demo hilog.info(DOMAIN, TAG, 调试信息: %{{public}}s, JSON.stringify(data))在开发过程中建议持续使用调试工具定位和解决问题而非等到最后统一排查。总结本文从萌宠日记的实际开发案例出发深入解析了疫苗驱虫体检记录卡片设计的实现方案。通过本文的学习读者可以掌握以下核心知识点组件用法理解相关 ArkUI 组件的核心属性和使用场景布局技巧掌握常见的布局模式及其适用范围交互实现学习点击事件、状态管理等交互设计方案最佳实践了解实际项目中的工程化实践和性能考量在实际开发中建议根据具体业务需求灵活调整组件参数和布局结构以达到最佳的用户体验效果。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力相关资源Text 组件https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-textColumn 容器https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-container-columnRow 容器https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-container-rowScroll 组件https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-container-scrollTabs 组件https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-container-tabsNavigation 组件https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-navigationGrid 组件https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-container-gridList 组件https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-container-listTextInput 组件https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-textinputTextArea 组件https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-textarea6.1 完整示例代码以下是一个完整的实际应用示例展示了相关组件的综合使用// 完整的组件使用示例 Component export struct DemoComponent { State message: string Hello HarmonyOS State count: number 0 build() { Column({ space: 16 }) { Text(this.message) .fontSize(24) .fontWeight(FontWeight.Bold) .fontColor(#333333) Text(点击次数: ${this.count}) .fontSize(16) .fontColor(#666666) Button(点击增加) .fontSize(16) .fontColor(Color.White) .backgroundColor(#F5A623) .borderRadius(20) .onClick(() { this.count }) } .width(100%) .height(100%) .padding(24) .backgroundColor(#FFF8F0) } }6.2 状态管理代码// 状态管理示例 State isActive: boolean false Prop title: string Link sharedValue: number build() { Column() { Text(this.title) .fontSize(18) .fontColor(this.isActive ? #F5A623 : #999999) Button(this.isActive ? 取消 : 激活) .onClick(() { this.isActive !this.isActive }) } }