HarmonyOS掌上记账APP开发实践第94篇:如何实现删除多选框选项功能

发布时间:2026/7/30 14:46:17
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元素