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

HarmonyOS开发实战:笔友-列表项滑动操作——SwiperItem + 删除按钮

前言

在移动应用中,列表项滑动操作(Swipe Action)是替代长按删除的常见交互方式。ArkUI 的ListItem组件通过swipeAction属性提供了滑动操作支持。

本文将以 xiexin 的Index.ets为蓝本,详细剖析列表项滑动操作的实现,包括ListItem.swipeAction配置、滑动删除按钮、TransitionEffect动画,以及删除确认弹窗。

一、swipeAction 基本用法

ListItem() { this.PenPalCard(pal) } .swipeAction({ start: { // 右滑(从左侧开始) builder: () => { Column() { Text('置顶').fontSize(14).fontColor(AppColors.WHITE) } .width(60).height('100%') .backgroundColor(AppColors.WAITING) .justifyContent(FlexAlign.Center) .onClick(() => { // 置顶操作 }) } }, end: { // 左滑(从右侧开始) builder: () => { Column() { Text('删除').fontSize(14).fontColor(AppColors.WHITE) } .width(60).height('100%') .backgroundColor('#FF5252') .justifyContent(FlexAlign.Center) .onClick(() => { this.showDeleteConfirm(pal.id); }) } } })

二、删除确认弹窗

private showDeleteConfirm(penPalId: number): void { AlertDialog.show({ title: '确认删除', message: '删除笔友后,通信记录也会被删除。确定要删除吗?', primaryButton: { value: '取消', action: () => {} }, secondaryButton: { value: '删除', fontColor: '#FF5252', action: () => { // 执行删除逻辑 this.deletePenPal(penPalId); } } }) } private deletePenPal(id: number): void { const penPals: PenPal[] = AppStorage.get<PenPal[]>('penPals') ?? []; const newPenPals = penPals.filter((p: PenPal) => p.id !== id); AppStorage.set<PenPal[]>('penPals', newPenPals); }

三、参数说明

参数类型说明
startSwipeActionItem右滑操作
endSwipeActionItem左滑操作
builder() => void滑动显示的组件

十一、深度实现分析

11.1 核心原理

本功能的核心原理基于 ArkUI 的响应式状态管理机制。当 @State 或 @Prop 装饰的变量发生变化时,ArkUI 引擎会自动触发依赖该变量的 UI 部分重新渲染,无需手动操作 DOM。

11.2 数据流设计

graph LR A[用户交互] --> B[@State 变量变化] B --> C[ArkUI 引擎检测] C --> D[UI 重渲染] D --> E[用户看到新界面]

11.3 性能考虑

  1. 避免不必要渲染:使用 @Watch 控制渲染时机
  2. 减少嵌套深度:保持组件树扁平化
  3. 合理使用缓存:计算结果可缓存避免重复计算

十二、实际项目应用

在 xiexin 项目中,本功能被应用于以下场景:

  1. 笔友列表:展示笔友通信状态和关系阶段
  2. 信件卡片:展示信件内容和状态标签
  3. 统计页面:展示写信趋势数据和统计指标
// 实际应用代码示例 @Component export struct ExampleComponent { @Prop data: string[] = []; build() { Column() { ForEach(this.data, (item: string) => { Text(item).fontSize(14).padding(8) }, (item: string) => item) } } }

十三、生产环境注意事项

  1. 错误处理:所有异步操作需要 try-catch 包围
  2. 日志记录:使用 hilog 记录关键操作和异常信息
  3. 性能监控:使用 hiTraceMeter 进行性能埋点分析
  4. 内存管理:及时清理定时器和监听器避免内存泄漏
try { await this.loadData(); hilog.info(0xFF00, 'TAG', 'Data loaded successfully'); } catch (err) { hilog.error(0xFF00, 'TAG', 'Failed to load: %{public}s', err.message); }

十四、代码审查清单

在提交代码前,请逐项检查以下内容:

  1. @Prop 变量是否已赋默认值
  2. 定时器是否在 aboutToDisappear 中清理
  3. 列表渲染的 keyGenerator 是否唯一且稳定
  4. 条件渲染是否使用 if/else 而非 Visibility.Hidden
  5. 复杂计算结果是否已缓存
  6. 事件监听器是否在 aboutToDisappear 中取消注册
  7. 资源引用是否使用 $r 语法而非硬编码
  8. 颜色值是否使用 AppColors 设计令牌

十五、综合示例

@Entry @Component struct DemoPage { @State items: string[] = ['示例1', '示例2', '示例3']; @State count: number = 0; build() { Column({ space: 16 }) { Text('综合示例').fontSize(24).fontWeight(FontWeight.Bold) Text(`计数: ${this.count}`).fontSize(16) Row({ space: 8 }) { Button('增加').onClick(() => { this.count++ }) Button('减少').onClick(() => { if (this.count > 0) this.count-- }) Button('重置').onClick(() => { this.count = 0 }) } List() { ForEach(this.items, (item: string) => { ListItem() { Text(item).fontSize(14).padding(12) } }, (item: string) => item) }.height(200) }.padding(16).width('100%') } }

十六、相关 API 参考

API说明版本要求使用场景
@State组件内部状态管理API 9+表单输入、UI 状态
@Prop父子单向传递API 9+卡片标题、配置参数
@Link父子双向同步API 9+开关状态、表单字段
@Watch状态变化监听API 9+搜索防抖、级联更新
AppStorage全局状态存储API 9+用户信息、全局配置
PersistentStorage持久化存储API 9+登录态、用户偏好

十七、常见面试题

Q1: @State 和 @Prop 的区别是什么?

A: @State 是组件内部私有状态,只能在当前组件内修改;@Prop 是父组件传递进来的数据,在子组件中只能读取,修改不会影响父组件。

Q2: 什么时候应该使用 @Link 而不是 @Prop?

A: 当子组件需要修改父组件的数据时,应该使用 @Link 实现双向绑定。如果子组件只需要读取数据,使用 @Prop 即可。

Q3: ForEach 的 keyGenerator 为什么重要?

A: keyGenerator 决定了 ForEach 进行 Diff 算法的依据。如果键值不稳定或重复,会导致列表项渲染异常,如闪烁、状态丢失等问题。

十八、调试技巧

在开发过程中,掌握以下调试技巧可以显著提升效率:

  1. 使用 DevEco Profiler:监控帧率和布局耗时,定位卡顿根因
  2. 使用 hilog:打印关键日志,追踪代码执行路径
  3. 使用 hiTraceMeter:进行性能埋点分析,识别性能瓶颈
  4. 使用 @Watch:监听状态变化,调试状态更新逻辑
  5. 使用 AppStorage:全局状态调试,查看跨页面数据流
// 调试辅助代码 @State @Watch('onDebugChange') debugValue: string = ''; onDebugChange(): void { console.log('Value changed to:', this.debugValue); }

十九、补充说明

提示:本文提供的代码示例基于 HarmonyOS API 12,适用于 HarmonyOS 5.0 及以上版本。如果你使用的是较低版本,部分 API 可能不兼容。

  1. 本文所有代码均可在 xiexin 项目中找到实际应用场景
  2. 建议结合 DevEco Studio 开发工具进行调试和验证
  3. 如有疑问,欢迎在评论区留言讨论,我会及时回复
  4. 更多 HarmonyOS 开发资源请参考官方文档和开发者社区

HarmonyOS 功能实现示意图(https://raw.gitcode.com/openharmony-cross-platform/docs/raw/main/img/harmonyos-component.png)

功能实现示意图

总结

本文详细剖析了 xiexin 的列表项滑动操作实现,重点讲解了ListItem.swipeAction配置、滑动删除按钮、AlertDialog删除确认弹窗,以及删除后的数据更新。

如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!


相关资源

  • 开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net
  • HarmonyOS 应用开发指南:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/application-dev-guide
  • HarmonyOS Router 路由:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-routing
  • HarmonyOS 状态管理概述:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-state-management-overview
  • HarmonyOS 高性能编程实践:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-high-performance-programming
  • HarmonyOS 自定义组件:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-custom-components
  • HarmonyOS 组件封装:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-component-encapsulation
  • HarmonyOS ForEach 渲染控制:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-rendering-control-foreach
  • HarmonyOS LazyForEach:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-rendering-control-lazyforeach
  • HarmonyOS ListItem 组件:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-components/List-Item
  • HarmonyOS AlertDialog:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-components/AlertDialog

二十、补充说明

提示:本文提供的代码示例基于 HarmonyOS API 12,适用于 HarmonyOS 5.0 及以上版本。部分 API 在低版本中可能不兼容,请根据实际开发环境调整。

  1. 本文所有代码均可在 xiexin 项目中找到实际应用场景
  2. 建议结合 DevEco Studio 开发工具进行调试和验证
  3. 如有疑问,欢迎在评论区留言讨论
  4. 更多 HarmonyOS 开发资源请参考官方文档

20.1 扩展阅读推荐

  • HarmonyOS 应用开发指南
  • ArkUI 声明式开发范式
  • 状态管理详解
  • 高性能编程实践

20.2 代码规范建议

在编写 HarmonyOS 应用时,建议遵循以下代码规范:

  1. 组件命名使用 PascalCase,如AvatarComponent
  2. 变量命名使用 camelCase,如avatarSize
  3. 常量命名使用 UPPER_CASE,如MAX_COUNT
  4. 私有方法以_开头,如_getAvatarColor
  5. 文件命名使用 kebab-case,如common-components.ets

二十一、总结与最佳实践

21.1 核心要点总结

  1. 状态管理:合理选择 @State/@Prop/@Link/@StorageProp 装饰器
  2. 组件设计:遵循单一职责原则,保持组件聚焦
  3. 性能优化:大数据量使用 LazyForEach,组件复用使用 @Reusable
  4. 代码质量:编写单元测试,使用 Hypium 框架
  5. 样式管理:使用 AppColors 设计令牌统一管理颜色

21.2 推荐实践

  1. 使用 AppColors 设计令牌统一管理颜色,避免硬编码色值
  2. 使用 Constants.ets 集中管理常量,避免魔法数字
  3. 使用 DataStore 门面模式封装数据操作,统一访问入口
  4. 使用 @Builder 提取复用 UI 片段,减少重复代码
  5. 使用 @BuilderParam 实现组件插槽,提升组件灵活性

21.3 避免的反模式

  1. 避免在 build 函数中执行耗时操作,这会阻塞 UI 渲染
  2. 避免在 @State 中存储大型对象,会导致不必要的重渲染
  3. 避免过度使用 @Link 增加组件耦合,优先使用 @Prop
  4. 避免在 aboutToAppear 中执行异步操作,使用生命周期合理分配
  5. 避免使用全局变量替代 @StorageProp,全局变量无法触发响应式更新

提示:以上最佳实践基于 xiexin 项目的实际开发经验总结,建议在项目开发中遵守这些原则,可以有效提升代码质量和开发效率。

二十二、参考文档

  1. HarmonyOS 应用开发指南
  2. ArkUI 声明式开发范式
  3. 状态管理 V1
  4. 状态管理 V2
  5. 高性能编程实践
  6. 自定义组件

二十三、深度扩展阅读

23.1 组件设计原则

在 ArkUI 中设计组件时,需要遵循以下原则:

  1. 单一职责:每个组件只负责一个功能,避免职责过多
  2. 开闭原则:对扩展开放,对修改关闭,通过参数化配置实现
  3. 依赖倒置:依赖抽象而非具体实现,降低耦合度
  4. 接口隔离:使用小接口而非大接口,避免冗余依赖

23.2 性能优化策略

  1. 使用 LazyForEach:大数据量列表使用懒加载,只渲染可见项
  2. 组件复用:使用 @Reusable 装饰器复用组件,减少创建销毁开销
  3. 状态管理:合理使用 @State/@Prop/@Link,避免不必要重渲染
  4. 动画优化:使用 animateTo 替代 setInterval,减少 CPU 占用

23.3 代码示例

@Component export struct OptimizedComponent { @Prop items: string[] = []; @State selectedIndex: number = -1; build() { List() { LazyForEach(this.items, (item: string, index: number) => { ListItem() { Text(item).fontSize(16).padding(16) .backgroundColor(this.selectedIndex === index ? AppColors.AMBER_LIGHT : AppColors.WHITE) .onClick(() => { this.selectedIndex = index; }) } }, (item: string) => item) } .cachedCount(3) .scrollBar(BarState.Off) } }

23.4 常见问题与解决方案

问题类型具体问题解决方案
编译错误@Prop 未赋默认值在声明时添加默认值
运行时错误路由参数未定义添加空值检查
性能问题列表渲染卡顿使用 LazyForEach
内存泄漏定时器未清理在 aboutToDisappear 中清理
状态丢失@State 变量未初始化在声明时赋默认值
渲染异常ForEach 键值重复使用唯一 ID 作为键值

23.5 推荐实践

  1. 使用 AppColors 设计令牌统一管理颜色,避免硬编码色值
  2. 使用 Constants.ets 集中管理常量,避免魔法数字
  3. 使用 DataStore 门面模式封装数据操作,统一访问入口
  4. 使用 @Builder 提取复用 UI 片段,减少重复代码
  5. 使用 @BuilderParam 实现组件插槽,提升组件灵活性

提示:以上最佳实践基于 xiexin 项目的实际开发经验总结,建议在项目开发中遵守这些原则,可以有效提升代码质量和开发效率。

二十四、代码规范与最佳实践

24.1 命名规范

  1. 组件命名使用 PascalCase,如AvatarComponentPenPalCard
  2. 变量命名使用 camelCase,如avatarSizeselectedIndex
  3. 常量命名使用 UPPER_CASE,如MAX_COUNTDEFAULT_SIZE
  4. 私有方法以下划线开头,如_getAvatarColor
  5. 文件命名使用 kebab-case,如common-components.ets

24.2 代码组织

  1. 每个组件文件只包含一个 @Entry 组件
  2. 通用组件放在 components/ 目录下
  3. 页面组件放在 pages/ 目录下
  4. 常量配置放在 common/ 目录下
  5. 数据模型放在 model/ 目录下

24.3 注释规范

/** * 组件说明 * @param name 参数说明 * @param size 参数说明 */ @Component export struct MyComponent { @Prop name: string = ''; @Prop size: number = 48; }

24.4 版本管理

  1. 每次发布前更新 versionCode 和 versionName
  2. 使用语义化版本号 X.Y.Z
  3. 记录版本变更日志

提示:遵循良好的代码规范可以提升团队协作效率和代码可维护性。

http://www.jsqmd.com/news/1260765/

相关文章:

  • 053、YOLOv8改进实战:GhostNet廉价操作骨干替换Backbone的Ghost模块源码解析与FLOPs对比实验
  • 2026年7月宏碁笔记本全国维修服务资料|宏碁笔记本供电检测、华东一区地址、检测流程与五星推荐 - 笔记本专业售后
  • AI-Shoujo HF Patch终极指南:5分钟快速解锁游戏全部功能
  • JSON.lua:Lua生态中的轻量级JSON处理引擎
  • 为智能体应用选择模型Taotoken模型广场如何辅助决策
  • 抖音批量下载神器终极指南:5分钟快速上手,轻松保存无水印视频
  • GPU资源调度优化:提升AI推理性能的关键策略
  • TM4C123 ADC高级应用:交错采样与数字比较器实战指南
  • 2026年广西无醛环保板材公司哪家好实力推荐 - 谁都没有我好看
  • C++实现方差分析:从数学原理到高性能统计计算实践
  • ETS2LA自动驾驶助手:为卡车模拟游戏打造终极智能驾驶体验
  • OpenCore Legacy Patcher完整指南:4步让老旧Mac焕发新生终极教程
  • 2026 年新发布:吴中口碑好的墙面修补网格胶带销售厂家哪家强,墙面裂缝自救:用它,让墙面秒变新装修-明亿装饰 - 领域鉴赏官
  • AI驱动企业级项目开发实战:Codex与Claude Code协作构建电商系统
  • A股量化策略日报(2026年07月25日)
  • 智慧停车场车牌识别系统架构与优化实践
  • HEIF Utility:Windows平台上解决苹果HEIF图片格式兼容性的技术方案
  • PostgreSQL实战指南:从核心原理到国产化替代的数据库基石
  • WatermarkRemover v1.0 绿色版 一键智能去除图片水印的无痕修复神器 1.0 - Windows
  • 百度网盘直链解析工具:5分钟实现全速下载的终极指南
  • 蔚蓝档案鼠标指针主题:3分钟打造二次元桌面沉浸体验
  • NoFences:5分钟拯救杂乱Windows桌面的免费开源分区工具
  • 2026 全网寄件平台 TOP11 全方位测评,低价寄快递与大件物流多维度打分对比 - 时讯资讯
  • 智能体技能(Agent Skill)开发指南与应用实践
  • 2026年7月苹果iPad全国维修服务资料|iPad Pro原问题复测、华东一区地址、检测流程与五星推荐 - 数码品牌推荐
  • 成都竞元单招 2027 届招生简章|报名咨询热线 - 成都竞元单招
  • 智能药房系统:基于YOLOv5的药品识别与分拣技术
  • 国内高性价比电线电缆品牌推荐:从采购价格到全生命周期成本的商业消费格局分析
  • C++控制台雪花堆积模拟:从粒子系统到物理碰撞的算法实践
  • 2026 贵阳云岩卫生间漏水、楼顶、地下室渗漏附近防水补漏公司测评 - 超人防水