HarmonyOS掌上记账APP开发实践第94篇:如何实现删除多选框选项功能
如何删除多选框选项场景说明通常情况下我们使用多选框都会伴随对选项的操作比较常见的操作是选中后删除比如删除购物车的商品、删除账单、删除图片等等。但是当前HarmonyOS针对多选框组件并没有提供直接的删除其选项的方法需要开发者自己来实现。本例提供了一种实现方案供开发者参考。效果呈现本例demo最终效果如下实现思路本例中涉及的关键特性及实现方案如下多选框使用CheckboxGroup组件构建多选框标题使用Checkbox组件构建多选框选项。删除多选框选项通过CheckboxGroup的onChange回调获取到各个选项的选中状态在删除操作中将选中的选项从选项列表中删除。删除时弹出确认框使用promptAction模块调用showDialog方法弹出对话框通过回调获取到用户点击的是取消按钮还是确定按钮如果是确定按钮则执行删除操作。开发步骤搭建UI布局。整体纵向布局那就采用Column组件全选框用CheckboxGroup组件然后每个选项都包括一个选择框Checkbox组件和一个文本Text组件且为横向布局那我们可以把它们放在Flex组件中最后是一个Button组件。这样整体布局就有了具体代码如下Componentstruct CheckboxDemo{build(){Column(){Flex({}){CheckboxGroup({})Text(水果清单)}Flex({}){Checkbox({})Text(苹果)}Flex({}){Checkbox({})Text(菠萝)}Flex({}){Checkbox({})Text(柚子)}Button(删除)}}}框架搭好了看下效果可以看到主选框和选项对齐了接下来我们来调整下样式。先给CheckboxGroup取个名字fruit_list然后为各个Checkbox添加相同的group名称这样就可以将Checkbox挂靠到CheckboxGroup下剩下的就是给各个组件添加margin、fontSize等通用属性了不清楚各个组件有哪些属性的请自行查阅组件参考具体代码如下Componentstruct CheckboxDemo{build(){Column(){Flex({justifyContent:FlexAlign.Center,alignItems:ItemAlign.Center}){// 将CheckboxGroup命名为fruit_listCheckboxGroup({group:fruit_list}).selectedColor(#007DFF)Text(水果清单).margin({right:20}).fontSize(14).lineHeight(20).fontColor(#182431).fontWeight(FontWeight.Bold)}Flex({justifyContent:FlexAlign.Center,alignItems:ItemAlign.Center}){// 通过group参数将Checkbox挂到CheckboxGroup下Checkbox({name:苹果,group:fruit_list}).selectedColor(#007DFF)Text(苹果).margin({right:20}).fontSize(14).lineHeight(20).fontColor(#182431).fontWeight(500)}Flex({justifyContent:FlexAlign.Center,alignItems:ItemAlign.Center}){Checkbox({name:菠萝,group:fruit_list}).selectedColor(#007DFF)Text(菠萝).margin({right:20}).fontSize(14).lineHeight(20).fontColor(#182431).fontWeight(500)}Flex({justifyContent:FlexAlign.Center,alignItems:ItemAlign.Center}){Checkbox({name:柚子,group:fruit_list}).selectedColor(#007DFF)Text(柚子).margin({right:20}).fontSize(14).lineHeight(20).fontColor(#182431).fontWeight(500)}Button(删除).margin({top:20,left:35}).fontSize(15).padding({top:5,bottom:5,left:15,right:15})}}}我们再来看下效果发现多选框的布局已经正常了简化代码。当前代码重复性很高包含Checkbox的三个Flex的结构完全一样我们可以简化一下。把重复的结构通过Builder抽取出来作为一个自定义组件用到的地方进行引用即可每个Flex呈现的内容不同那就将不同的内容作为参数传入。具体代码如下Componentstruct CheckboxDemo{// flexNameList存储checkbox选项的文本内容使用State修饰后flexNameList发生变化UI会同步刷新StateflexNameList:string[][苹果,菠萝,柚子]Builder// 将重复内容封装成flexItem通过参数checkboxName为Text组件传入显示文本通过groupName绑定CheckboxGroupflexItem(checkboxName:string,groupName:string){Flex({justifyContent:FlexAlign.Center,alignItems:ItemAlign.Center}){Checkbox({name:checkboxName,group:groupName}).selectedColor(#007DFF)Text(checkboxName).margin({right:20}).fontSize(14).lineHeight(20).fontColor(#182431).fontWeight(500)}.margin({left:36})}build(){Column(){Flex({justifyContent:FlexAlign.Center,alignItems:ItemAlign.Center}){CheckboxGroup({group:fruit_list}).selectedColor(#007DFF)Text(水果清单).margin({right:20}).fontSize(14).lineHeight(20).fontColor(#182431).fontWeight(FontWeight.Bold)}// 通过ForEach遍历flexNameList循环渲染生成UIForEach(this.flexNameList,(item:any){// 引用封装的flexItem模板this.flexItem(item,fruit_list)})Button(删除).margin({top:20,left:35}).fontSize(15).padding({top:5,bottom:5,left:15,right:15})}.alignItems(HorizontalAlign.Center)}}添加删除逻辑。本例中是通过以下方式实现删除操作的将选中的水果项从flexNameList中删除为方便展示本文直接将数据存储在数组中实际开发需要对接数据库由于flexNameList被State修饰所以其发生变化时会重新执行Build从而完成UI刷新展示删除后的选项。要实现上述逻辑首先需要获取到被选中的水果项。这里可以通过CheckboxGroup的onChange回调获取当选项的状态发生变化时会触发回调并返回各选项的选中状态。具体代码如下Componentstruct CheckboxDemo{...// itemStatus用来存储各选项的选中状态privateitemStatus:CheckboxGroupResult...build(){Column(){Flex({justifyContent:FlexAlign.Center,alignItems:ItemAlign.Center}){CheckboxGroup({group:fruit_list}).selectedColor(#007DFF)// 选项状态发生变化时触发onChange回调各选项的选中状态储存在itemName中并返回通过itemStatus.name可以获取到被选中的选项列表.onChange((itemName:CheckboxGroupResult){this.itemStatusitemName})...}.alignItems(HorizontalAlign.Center)}}将各选项的选中状态存储到itemStatus后我们就可以通过Button触发删除操作了。当点击删除按钮时触发删除操作所以给Button添加onClick事件并添加删除逻辑。代码如下Componentstruct CheckboxDemo{......// itemStatus用来存储各选项的选中状态privateitemStatus:CheckboxGroupResult......build(){Column(){Flex({justifyContent:FlexAlign.Center,alignItems:ItemAlign.Center}){CheckboxGroup({group:fruit_list}).selectedColor(#007DFF)// 选项状态发生变化时触发onChange回调各选项的选中状态储存在itemName中并返回通过itemStatus.name可以获取到被选中的选项列表.onChange((itemName:CheckboxGroupResult){this.itemStatusitemName})......Button(删除).margin({top:20,left:35}).fontSize(15).padding({top:5,bottom:5,left:15,right:15})// 点击触发删除操作.onClick((){// 被选中的项存储在this.itemStatus.name列表中for(letiofthis.itemStatus.name){// 从flexNameList中删除被选中的项刷新UIthis.flexNameList.splice(this.flexNameList.indexOf(i),1)}})}.alignItems(HorizontalAlign.Center)}}添加删除确认框。使用promptAction模块调用showDialog方法弹出对话框然后将删除操作绑定到对话框的确定按钮具体代码如下// 导入promptAction模块importpromptActionfromohos.promptAction;Componentstruct CheckboxDemo{......// itemStatus用来存储各选项的选中状态privateitemStatus:CheckboxGroupResult......build(){Column(){Flex({justifyContent:FlexAlign.Center,alignItems:ItemAlign.Center}){CheckboxGroup({group:fruit_list}).selectedColor(#007DFF)// 选项状态发生变化时触发onChange回调各选项的选中状态储存在itemName中并返回通过itemStatus.name可以获取到被选中的选项列表.onChange((itemName:CheckboxGroupResult){this.itemStatusitemName})......Button(删除).margin({top:20,left:35}).fontSize(15).padding({top:5,bottom:5,left:15,right:15})// 点击触发删除操作.onClick((){// 调用对话框promptAction.showDialog({title:,message:确定删除吗,buttons:[{text:取消,color:#000000},{text:确定,color:#000000}]})// 用户选择通过data回传当data.index为1时用户选择确定当data.index为0时用户选择取消.then(data{// 当用户选择确定时进行删除操作if(data.index1){// 被选中的项存储在this.itemStatus.name列表中for(letiofthis.itemStatus.name){// 从flexNameList中删除被选中的项刷新UIthis.flexNameList.splice(this.flexNameList.indexOf(i),1)}}})})}.alignItems(HorizontalAlign.Center)}}完整代码本例完整代码如下importpromptActionfromohos.promptAction;EntryComponentstruct CheckboxDemo{StateflexNameList:string[][苹果,菠萝,柚子]privateitemStatus:CheckboxGroupResultBuilderflexItem(checkboxName:string,groupName:string){Flex({justifyContent:FlexAlign.Center,alignItems:ItemAlign.Center}){Checkbox({name:checkboxName,group:groupName}).selectedColor(#007DFF)Text(checkboxName).margin({right:20}).fontSize(14).lineHeight(20).fontColor(#182431).fontWeight(500)}.margin({left:36})}build(){Column(){if(this.flexNameList.length!0){Flex({justifyContent:FlexAlign.Center,alignItems:ItemAlign.Center}){CheckboxGroup({group:fruit_list}).selectedColor(#007DFF).onChange((itemName:CheckboxGroupResult){this.itemStatusitemName})Text(水果清单).margin({right:20}).fontSize(14).lineHeight(20).fontColor(#182431).fontWeight(FontWeight.Bold)}.margin({top:150})ForEach(this.flexNameList,(item:any){this.flexItem(item,fruit_list)})Button(删除).margin({top:20,left:35}).fontSize(15).padding({top:5,bottom:5,left:15,right:15}).onClick((){promptAction.showDialog({title:,message:确定删除吗,buttons:[{text:取消,color:#000000},{text:确定,color:#000000}]}).then(data{if(data.index1){for(letiofthis.itemStatus.name){this.flexNameList.splice(this.flexNameList.indexOf(i),1)}}})})}else{}}.alignItems(HorizontalAlign.Center)}}参考ChecckboxGroupCheckboxFlexButtonohos.promptAction (弹窗)ForEach循环渲染State状态管理Builder动态构建UI元素

相关新闻

珠宝展柜灯光为什么要求高显指?3000K和4000K差别大吗?

珠宝展柜灯光为什么要求高显指?3000K和4000K差别大吗?

珠宝展柜须用高显指灯光(CRI≥95),因为普通灯光会让珠宝失色——钻石火彩出不来,翡翠正阳绿发灰,黄金金色暗淡。色温3000K(暖黄光)适合黄金首饰,4000K(中性白光&#xff…

2026/10/26 2:52:35 阅读更多 →
【万字文档+源码】 基于springboot+vue大学生心理咨询平台-可用于毕设-课程设计-练手学习-学习资料分享

【万字文档+源码】 基于springboot+vue大学生心理咨询平台-可用于毕设-课程设计-练手学习-学习资料分享

基于springbootvue大学生心理咨询平台1. 项目概述 1.1 项目背景 当代大学生面临学业、就业、人际关系等多重压力,心理问题发生率逐年上升。传统线下心理咨询存在预约不便、隐私顾虑、宣传渠道单一等痛点。为搭建数字化心理健康服务渠道,本项目开发大学…

2026/10/27 16:44:19 阅读更多 →
涉密信息系统集成资质认定材料准备指南——核心清单与常见问题

涉密信息系统集成资质认定材料准备指南——核心清单与常见问题

摘要:涉密信息系统集成资质是企业进入涉密信息化项目领域的法定准入条件。材料准备是资质认定流程中的基础环节,材料不全、格式不符或内容不一致,是申报被退回或补正的主要原因。本文依据现行资质管理办法及受理窗口常见要求,系统…

2026/10/25 10:21:11 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/27 17:33:32 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/27 4:06:49 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/27 7:21:53 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/27 18:20:50 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/27 6:20:47 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/27 4:06:50 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 13:55:19 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 7:21:50 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 19:19:37 阅读更多 →