尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
鸿蒙应用开发实战【21】— 筛选弹出面板三维筛选实现
鸿蒙应用开发实战【21】— 筛选弹出面板三维筛选实现前言欢迎加入开源鸿蒙跨平台社区https://openharmonycrossplatform.csdn.net号码助手首页有一个「全部/已选N ⌄」筛选按钮点击后弹出一个气泡面板展示分类、卡号、状态三维筛选条件。用户可以在每个维度中选择一个值三个条件之间是 AND 关系共同决定列表的展示内容。本篇涵盖Flex FlexWrap 自动换行实现 chip 布局、筛选按钮状态联动已选条件计数、筛选面板 Builder 完整实现、三维数据过滤逻辑AND 条件组合、筛选重置 clear、与 bindPopup 集成。图1筛选弹出面板 Popup 结构 FlexWrap 换行原理 三维 AND 过滤逻辑一、筛选面板整体设计1.1 三维筛选简介维度数据来源选项示例状态变量分类CATEGORIES 常量数组全部/社交/购物/金融/工具filterCatIdx: number卡号数据库 CardDao.listAll()全部/主卡/副卡/工作卡filterCardIdx: number状态STATUS_FILTERS 常量数组全部/使用中/待换绑/待注销/已停用filterStatIdx: number三个维度的索引值0均代表「全部」非0代表选择了具体条件。1.2 筛选按钮// 首页筛选触发按钮Row({space:3}){Text(this.activeFilterCount()0?已选${this.activeFilterCount()}:全部).fontSize(12).fontWeight(AppFonts.WEIGHT_SEMIBOLD).fontColor(this.activeFilterCount()0?#3E68E0:AppColors.TEXT_2)Text(⌄).fontSize(10).fontColor(this.activeFilterCount()0?#3E68E0:AppColors.TEXT_3)}.padding({left:11,right:11,top:6,bottom:6}).backgroundColor(this.activeFilterCount()0?AppColors.PRIMARY_BG:AppColors.CARD_B).border({width:1,color:this.activeFilterCount()0?#4D4F7CFF:AppColors.LINE,radius:14}).bindPopup($$this.showFilter,{builder:()this.FilterPopoverBuilder(),placement:Placement.Bottom,popupColor:#FFFFFF,onStateChange:(e){if(!e.isVisible){this.showFilterfalse}}}).onClick((){this.showFilter!this.showFilter})按钮的样式会根据是否有活跃筛选条件而变化——有选中项时显示蓝色高亮边框和「已选 N」计数。二、筛选面板 Builder 实现2.1 面板整体结构BuilderprivateFilterPopoverBuilder(){Column(){// 分类维度this.FilterSection(分类,CATEGORIES,this.filterCatIdx,(idx:number){this.filterCatIdxidx})// 卡号维度this.FilterSection(卡号,this.getCardLabels(),this.filterCardIdx,(idx:number){this.filterCardIdxidx})// 状态维度this.FilterSection(状态,STATUS_FILTERS,this.filterStatIdx,(idx:number){this.filterStatIdxidx})// 底部重置按钮Button(重置).onClick(()this.resetFilters())}.width(220).padding(14)}2.2 筛选维度子组件BuilderprivateFilterSection(title:string,items:string[],selectedIdx:number,onSelect:(idx:number)void){Column(){Text(title).fontSize(11).fontColor(AppColors.TEXT_3).fontWeight(AppFonts.WEIGHT_SEMIBOLD).alignSelf(ItemAlign.Start).margin({bottom:8})// Flex FlexWrap 实现 chip 自动换行Flex({wrap:FlexWrap.Wrap}){ForEach(items,(item:string,idx:number){Text(item).fontSize(12).fontWeight(AppFonts.WEIGHT_MEDIUM).fontColor(selectedIdxidx?#FFFFFF:AppColors.TEXT_2).padding({left:12,right:12,top:6,bottom:6}).backgroundColor(selectedIdxidx?AppColors.PRIMARY:AppColors.CARD_B).border({width:1,color:selectedIdxidx?#00000000:AppColors.LINE,radius:14}).margin({right:6,bottom:6}).onClick(()onSelect(idx))},(item:string)item)}}.margin({bottom:14}).alignItems(HorizontalAlign.Start)}2.3 Chip 选中态每个 chip 是一个Text组件通过selectedIdx idx来判断是否选中状态backgroundColorfontColorborder选中AppColors.PRIMARY#4F7CFF#FFFFFF透明未选中AppColors.CARD_B#FFFFFFAppColors.TEXT_2AppColors.LINE三、Flex FlexWrap 自动换行3.1 FlexWrap 的必要性筛选选项数量不固定如果使用Row容器当选项超出一行时会被裁剪。使用Flex({ wrap: FlexWrap.Wrap })可以实现自动换行。// ❌ Row单行不换行超出裁剪Row({space:6}){Text(全部)Text(社交)Text(购物)Text(金融)Text(工具)// 如果宽度不够这个会被裁剪}// ✅ Flex FlexWrap.Wrap多行自动换行Flex({wrap:FlexWrap.Wrap}){Text(全部).margin({right:6,bottom:6})Text(社交).margin({right:6,bottom:6})Text(购物).margin({right:6,bottom:6})Text(金融).margin({right:6,bottom:6})Text(工具).margin({right:6,bottom:6})// 自动换到下一行}3.2 spacing 的关键参数Flex({wrap:FlexWrap.Wrap}){// 每个 chip 通过 margin 控制间距Text(chip).margin({right:6,bottom:6})// right: 水平方向 chip 之间的间距// bottom: 垂直方向行与行之间的间距}3.3 Flex 与 Row 的对比对比项RowFlex FlexWrap.Wrap布局方向水平单行水平多行自动换行超出处理裁剪/溢出自动折行适用场景固定数量的按钮组数量不固定的标签列表号码助手使用底部操作按钮筛选面板 chip 列表 ✅四、筛选状态管理4.1 活跃条件计数/** * 统计当前激活的筛选条件数 * 每个维度非 0 代表有选中条件 */privateactiveFilterCount():number{letn0if(this.filterCatIdx!0)n// 分类有选中if(this.filterCardIdx!0)n// 卡号有选中if(this.filterStatIdx!0)n// 状态有选中returnn}4.2 筛选重置privateresetFilters():void{this.filterCatIdx0this.filterCardIdx0this.filterStatIdx0this.showFilterfalse// 重置后关闭面板}4.3 三维过滤逻辑/** * AND 条件组合过滤 * 每个维度 idx0 表示「全部」不参与过滤 */privategetFilteredRows():AppRow[]{returnthis.rows.filter((r:AppRow){constcatOkthis.filterCatIdx0||r.binding.categoryCATEGORIES[this.filterCatIdx]constcardOkthis.filterCardIdx0||r.cardLabelthis.getCardLabels()[this.filterCardIdx]conststatOkthis.filterStatIdx0||r.binding.statusSTATUS_FILTERS[this.filterStatIdx]returncatOkcardOkstatOk// 三个条件同时满足})}过滤逻辑图解维度idx0idx≠0分类不过滤全部匹配 CATEGORIES[idx]卡号不过滤全部匹配 cards[idx-1].label状态不过滤全部匹配 STATUS_FILTERS[idx]三个条件的 AND 关系简化为任何一个维度是非 0 时才参与过滤否则跳过。五、本篇小结知识点核心要点FlexWrap.Wrapchip 标签自动换行搭配 margin right/bottom 控制间距Chip 选中态选中 蓝色填充未选中 白色描边activeFilterCount统计已选条件数驱动按钮样式变化三维 AND 过滤catIdx/cardIdx/statIdx 三个维度独立过滤resetFilters全部重置为 0 并关闭面板参考资料鸿蒙应用开发实战【17】— bindPopup 气泡弹出与筛选面板鸿蒙应用开发实战【05】— 首页开发与状态管理Flex 容器 APIFlexWrap 枚举Builder 装饰器bindPopup API如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力相关资源开源鸿蒙跨平台社区https://openharmonycrossplatform.csdn.netFlex 容器文档https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-container-flexFlexWrap 换行说明https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-appendix-enums
RELATED

相关推荐

从宝可梦魔方看中国制造转型:地域限定产品的技术逻辑

从宝可梦魔方看中国制造转型:地域限定产品的技术逻辑

最近在逛B站时,发现一个很有意思的现象:知名UP主Tingman发布了一条关于"最稀有宝可梦魔方"的视频,标题中特别强调"只有中国能买到"。作为一个既玩魔方又关注宝可梦的技术爱好者,我立刻被这个组合吸引了。但仔…

📅 2026/9/12 3:22:30
从家庭到工厂:单相、两相与三相电的接法全解析与应用场景

从家庭到工厂:单相、两相与三相电的接法全解析与应用场景

1. 电力系统基础:单相、两相与三相电的本质区别第一次接触电力系统时,我被各种"相"的概念搞得晕头转向。直到有次装修房子,电工师傅用了个形象的比喻:单相电就像独轮车,两相电是自行车,三相电则是…

📅 2026/9/8 15:30:41
ESP32-C3 VScode开发环境一键配置与疑难排错指南(ESP-IDF插件全解析)

ESP32-C3 VScode开发环境一键配置与疑难排错指南(ESP-IDF插件全解析)

1. ESP32-C3开发环境概述ESP32-C3是乐鑫推出的RISC-V架构物联网芯片,相比传统ESP32系列,它在成本优化和功耗控制上表现更出色。选择VScodeESP-IDF作为开发方案,主要基于三点优势:一是官方维护的插件生态完善,二是跨平台…

📅 2026/9/10 8:40:13
MORE NEWS

更多资讯

📰

OpenClaw+优云智算+Coding Plan:实现从灵感到发布的全流程自动化

最近我把自己的内容生产流程彻底重做了一遍:从一个模糊的想法冒出来,到写成初稿,再到生成页面、推到线上,中途我不需要手动打开编辑器、不需要在不同平台之间来回复制粘贴。靠的是 OpenClaw 这个开源 AI Agent,配上优云…

📰

WSL环境配置OpenCode Web界面:从安装到serve实战与踩坑指南

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

📰

ZFBF-MMSE联合检测:MIMO下行链路干扰抑制与性能优化

简介:MIMO无线通信系统的信号检测环节中,迫零(ZFBF)与最小均方误差(MMSE)是两种经典算法,这份资源提供二者的Matlab实现与仿真对比,适合通信专业学生、算法研究者及需要快速上手检测…

📰

VS Code多模型智能路由:GLM-5.3/DeepSeek/Kimi自动调度实战

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

📰

基于物理的动态模式分解piDMD:原理与Matlab实现

先说我一个实际经历。去年我处理一组结构振动数据时,用标准动态模式分解提取主模态,前200步和后100步各跑一次,得到的特征值差得离谱;加上测量噪声之后,有几个模态的特征值直接跑到单位圆外,按这个模型外推…

📰

NLP实战:疫情新闻舆情分析中的LDA主题建模与情感分析

2020年初那会儿,我接到一个新闻文本数据的舆情分析需求:要在短时间内把内容库里激增的新闻稿件理出一个脉络来——大家到底在讨论什么,整体情绪是恐慌、焦虑还是趋于理性,以及这些情绪是不是跟着事件在波动。光靠人工翻显然不现实…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬