当前位置: 首页 > news >正文

HarmonyOS ArkUI 实现商品分类布局

基于上面的商品分类布局实现,我将分享几个HarmonyOS ArkUI开发中的关键技术点,这些技术在实际项目中应用广泛,掌握它们能帮助你构建更高效、更优质的应用。

1. 组件化与UI结构设计

ArkUI采用声明式UI范式,核心是组件化思想。在示例中:

  • 使用@Component@Entry装饰器定义页面组件,@Entry标识应用入口
  • 通过@Builder抽取可复用的UI片段(如homeBuildercategoryBuilder),实现代码分离和复用
  • 采用"容器组件+内容组件"的嵌套结构,如Column+Row构建整体布局,List+ListItem展示列表,Grid+GridItem实现网格布局
// 组件化的典型结构
@Component
struct CustomComponent {build() {// UI描述}
}@Entry // 应用入口组件
@Component
struct Index {// 状态管理// 构建UIbuild() {}// 复用UI片段@BuildercustomBuilder() {}
}

2. 状态管理与UI联动

状态管理是声明式UI的核心,示例中主要使用了@State装饰器:

  • @State selectedCategoryId: number = 1定义了选中的分类ID,这是一个响应式状态
  • selectedCategoryId发生变化时,依赖它的UI部分会自动更新(如左侧分类的选中样式、右侧商品列表)
  • 状态变化通过事件触发(如onClick(() => { this.selectedCategoryId = item.id })
// 状态驱动UI的工作流程
1. 定义状态:@State selectedId: number = 1
2. UI绑定状态:backgroundColor(this.selectedId === item.id ? '#fff' : '#f5f5f5')
3. 事件修改状态:onClick(() => { this.selectedId = item.id })
4. 状态变化自动更新UI

3. 列表与网格布局技术

针对商品分类场景,灵活运用了两种常用布局:

  • List列表布局(左侧分类):

    • 适合展示线性排列的同类数据
    • 通过divider属性添加分割线,增强视觉区分
    • 自带滚动特性,适合长列表展示
  • Grid网格布局(右侧商品):

    • 适合展示卡片类数据,通过columnsTemplate定义列数('1fr 1fr'表示两列等宽)
    • 使用columnsGaprowsGap控制间距,实现整齐排列
    • 配合Scroll组件实现长列表滚动
// 网格布局核心配置
Grid() {ForEach(products, (product) => {GridItem() { /* 商品卡片 */ }})
}
.columnsTemplate('1fr 1fr') // 2列布局
.columnsGap(10) // 列间距
.rowsGap(10) // 行间距

4. 数据驱动与动态渲染

通过ForEach实现数据到UI的映射,这是处理列表数据的核心技术:

  • 语法:ForEach(数据源, item => 生成UI的函数, 键值生成函数)
  • 数据源变化时,UI会自动更新,无需手动操作DOM
  • 示例中通过getProductsByCategory方法根据选中分类动态返回商品数据,实现"分类切换-商品更新"的联动
// 动态渲染示例
ForEach(this.getProductsByCategory(this.selectedCategoryId), // 动态数据源(product) => { /* 渲染单个商品 */ }, (product) => product.id.toString() // 唯一标识,优化性能
)

5. 交互设计与事件处理

良好的交互是提升用户体验的关键:

  • 通过onClick事件实现分类切换、商品点击等交互
  • 使用Tabs+TabContent实现页面切换,配合TabsController可编程控制切换
  • 视觉反馈:选中状态通过颜色、边框变化体现,点击区域足够大(符合移动端交互规范)
// 交互反馈示例
ListItem() {Text(item.name).backgroundColor(this.selectedCategoryId === item.id ? '#fff' : '#f5f5f5').borderLeft({width: this.selectedCategoryId === item.id ? 4 : 0,color: '#ff7d00'})
}
.onClick(() => {this.selectedCategoryId = item.id // 状态变更
})

6. 样式与视觉优化

通过细节样式提升界面质感:

  • 使用borderRadius实现圆角效果,增强卡片感
  • shadow属性添加轻微阴影,提升层次感(避免过度使用影响性能)
  • 统一配色方案,主色调(橙色#ff7d00)用于强调选中状态和价格
  • 合理的留白(paddingmargin)避免界面拥挤

这些技术点不仅适用于商品分类场景,也是HarmonyOS ArkUI开发的基础。在实际开发中,需根据具体场景灵活组合这些技术,同时注意性能优化(如合理设置ForEach的键值、避免过度嵌套等)。

在这里插入图片描述

@Component
@Entry
struct Index {@Statearr: string[] =['食品', '电器', '洗护', '女装', '手机', '健康', '男装', '美妆', '电脑', '运动', '内衣', '母婴', '食品', '电器','洗护', '女装', '手机', '健康', '男装', '美妆', '电脑', '运动', '内衣', '母婴']build() {Tabs() {TabContent() {this.homeBuilder()}.tabBar("首页")TabContent() {Text("分类的内容")}.tabBar("分类")}.width("100%").height("100%").barPosition(BarPosition.End)}@BuilderhomeBuilder() {Column() {// 1Row({ space: 10 }) {Image($r("app.media.startIcon")).width(30).fillColor("#666")Search({ placeholder: "颈椎按摩器" }).layoutWeight(1)}.width("100%").padding(10).border({width: {bottom: 3}})//   2Row() {//   左侧 List 默认的宽度和高度  霸道// 把右侧给占满了List() {ForEach(this.arr, (item: string) => {ListItem() {Text(item).padding(10)}})}.width(100).backgroundColor(Color.Orange)//    右侧Scroll() {Column() {}.height("200%").width("100%").linearGradient({colors: [[Color.Yellow, 0], [Color.Green, 1]]})}.layoutWeight(1).height("100%").backgroundColor(Color.Pink)}.width("100%").layoutWeight(1)}.width("100%").height("100%")// .backgroundColor(Color.Yellow)}
}
http://www.lryc.cn/news/620856.html

相关文章:

  • C++进阶:特殊类
  • Morph Studio-一站式AI视频创作平台
  • postgresql运维问题解决:PG集群备节点状态异常告警处理
  • CVPR 2025 | 北大团队SLAM3R:单目RGB长视频实时重建,精度效率双杀!
  • 小杰python高级(six day)——pandas库
  • 一篇文章读懂.Net的依赖注入
  • C#WPF实战出真汁00--项目介绍
  • 融合服务器助力下的电视信息发布直播点播系统革新
  • 【测试用例】软件测试用例编写规范
  • 第三集 测试用例
  • [Android] 二十四节气日历v1.0.3 - 弘扬传统文化,精致设计,无广告纯净体验!
  • 在 CentOS 7 中使用 systemd 创建自定义服务
  • Java 设计模式-装饰器模式
  • 线程P4 | 线程安全问题及解决方法
  • Linux信号产生
  • Linux下使用Samba 客户端访问 Samba 服务器的配置(Ubuntu Debian)
  • mysql 提示符及快捷执行
  • 从零开始搭建React+TypeScript+webpack开发环境——基于MobX的枚举数据缓存方案设计与实践
  • React 数据持久化:从 “刷新就丢“ 到 “永存不灭“ 的实现方案
  • WEBSTORM前端 —— 第4章:JavaScript —— 第3节:数据类型与类型转换
  • Streamlit实现Qwen对话机器人
  • Pytest自动化测试框架总结
  • 2025年机器视觉与信号处理国际会议(MVSP 2025)
  • springboot博客实战笔记02
  • 游戏行业DevOps实践:维塔士集团基于Atlassian工具与龙智服务构建全球化游戏开发协作平台
  • 阿里云RDS SQL Server实例之间数据库迁移方案
  • flstudio.exe安装教程|FL Studio怎么下载安装?超简单中文指南
  • K8S企业级应用与DaemonSet实战解析
  • 深入解析 HTTP 协议演进:从 1.0 到 3.0
  • 怎么判断晶振的好坏,有什么简单的办法