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

【OpenHarmony/HarmonyOs 】最多选择 5 个:ArkUI 快捷入口管理弹窗完整实现

【OpenHarmony/HarmonyOs 】最多选择 5 个:ArkUI 快捷入口管理弹窗完整实现

前言

快捷入口的产品目标是让用户从几十个收藏中挑出最常用的少数站点。它看似是多选列表,实际包含选择上限、取消选择、失效数据过滤、持久化和模态层交互。本文拆解 LinkOS 链界首页的快捷入口管理功能。⚡

一、用 ID 集合保存选择

@StateshowQuickEntrySheet:boolean=false;@StatequickEntrySelectedIds:string[] = [];privateisInQuickEntry(id:string):boolean{returnthis.quickEntrySelectedIds.includes(id); }

只保存 ID,而不是复制完整UrlItem。网址标题或图标修改后,快捷入口仍能从最新数据源解析,不会出现两份对象内容不一致。

二、打开模态层

Button('快捷入口') .onClick(() =>this.showQuickEntrySheet =true)if(this.showQuickEntrySheet) {this.QuickEntrySheet() }

页面根节点使用 Stack,Sheet 位于内容上方。遮罩层覆盖全屏并支持点击关闭:

Stack(){ Rect().width('100%').height('100%').fill('rgba(0,0,0,0.35)').onClick(() => this.showQuickEntrySheet= false) Column() {/* 选择面板 */}.backgroundColor(Color.White).borderRadius(18) }.zIndex(200)

点击面板内部不能冒泡关闭;正式组件还要处理系统返回键、焦点锁定和屏幕旋转。

三、选择与取消选择

.onClick(() => {constid = item.id;if(this.isInQuickEntry(id)) {this.quickEntrySelectedIds =this.quickEntrySelectedIds.filter(value => value !== id); }elseif(this.quickEntrySelectedIds.length <5) {this.quickEntrySelectedIds = [...this.quickEntrySelectedIds, id]; } })

取消时使用 filter,新选中时使用展开运算符创建新数组,从而可靠触发@State更新。业务规则很清楚:已选项目始终可以取消,未选项目只有在数量小于 5 时才能加入。

四、按钮禁用逻辑

.enabled(this.isInQuickEntry(item.id) ||this.quickEntrySelectedIds.length <5)

达到上限后,未选按钮禁用,但已选按钮仍可点击取消。若简单写成length < 5,第五个项目选中后连取消按钮也会全部失效,这是多选上限中常见的逻辑错误。

界面还应显示当前进度:

Text(`已选择 ${this.quickEntrySelectedIds.length}/5`)

五、确认后持久化

await storage.put( StorageKeys.QUICK_ENTRY_URL_IDS, JSON.stringify(this.quickEntrySelectedIds) );this.showQuickEntrySheet =false;

Preferences 不直接支持字符串数组,因此使用 JSON。读取时不能直接信任解析结果:

constraw =awaitstorage.get(StorageKeys.QUICK_ENTRY_URL_IDS,'[]')asstring;try{constparsed =JSON.parse(raw)asObject;if(Array.isArray(parsed)) {this.quickEntrySelectedIds= parsed.filter(value=>typeofvalue ==='string').slice(0,5)asstring[]; } }catch{this.quickEntrySelectedIds= []; }

slice(0, 5)可以防御旧版本或异常数据超过上限。

六、保存和取消的语义

如果用户在 Sheet 中点了几次选择,然后点击遮罩“取消”,当前实现已经修改了真实@State,更改仍可能保留。更严格的交互应维护草稿:

@StatequickEntryDraftIds: string[] = [];privateopenQuickEntrySheet(): void {this.quickEntryDraftIds = [...this.quickEntrySelectedIds];this.showQuickEntrySheet =true; }

所有操作修改 Draft;点击保存才覆盖正式状态,取消则直接丢弃草稿。这样“取消”才真正没有副作用。

七、处理已经删除的网站

用户删除收藏后,Preferences 中可能仍保存对应 ID。恢复时应与当前站点集合取交集:

constvalidIds =newSet(this.getAllSites().map(item => item.id));this.quickEntrySelectedIds = storedIds .filter(id => validIds.has(id)) .slice(0,5);

否则首页可能出现空白入口,计数也会显示错误。删除网址时也可以主动同步清理快捷 ID。

八、顺序问题

数组天然保存选择顺序,但用户可能希望拖动排序。可将选择结果定义为有序 ID 列表,渲染时按 ID 顺序查找对象。未来加入拖拽只需调整数组顺序,不需要修改数据模型。

九、完整状态清单

  • 尚未选择:保存按钮禁用还是允许清空?需要产品明确;
  • 选择 1 至 4 个:可继续选择;
  • 已选 5 个:未选项禁用,已选项可取消;
  • 收藏为空:展示空状态和添加入口;
  • 某条已删除:自动清除失效 ID;
  • JSON 损坏:回退为空;
  • 保存失败:面板不应直接关闭,应允许重试。

十、总结

快捷入口管理的核心是“有序 ID 集合 + 上限规则 + 草稿提交 + 数据清洗”。特别要注意达到上限后仍允许取消、关闭弹窗不应意外保存,以及删除收藏后清除失效 ID。把这些边界处理完整,一个普通多选面板才会变成可靠的产品功能。✅

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

相关文章:

  • 郑州本地人常选,收的顶黄金回收,旧金变现不踩坑 - 奢侈品回收评测
  • 为什么你的AI思维导图总跑偏?揭秘4类典型语义坍塌陷阱及对应Prompt修复公式(已验证217次)
  • 2026合肥黄金回收实体门店测评:瑶海、包河、庐阳、蜀山卖金指南,正规商家排行,上门估价无套路 - 商业每日快报
  • Narwal Flow 2 扫地机器人评测:避障拖地出色,吸尘稍逊,不同家庭按需选!
  • 指挥中心AI数据大屏生成工具:政务应急场景零代码平台评测推荐
  • 2026福田表友注意了!劳力士回收别再乱跑了,逸程这家全国连锁,专业度直接拉满! - 融媒生活
  • Demo 跑得欢,生产就崩盘?大模型工程师的“权限与日志”生死线
  • 现代C:JIT Compilation:一种特殊的程序执行方式
  • 2026精选:大城地区砖混结构建房服务机构全解析 - 装修教育财税推荐2026
  • 从TI SPIO-4评估板解析精密硬件设计:原理图、PCB与BOM实战
  • AI开题报告工具:技术架构与学术研究实践指南
  • 2026年上海万国维修门店地址变更附最新网点及电话 - 万国中国服务中心
  • 如何用嘎嘎降AI处理化学论文:化学毕业论文降AI免费4.8元知网达标完整教程 - 还在做实验的师兄
  • Ubuntu下Ganache启动问题解决方案
  • 武汉黄金回收上门收费是套路吗?正规上门回收服务科普 - 奢侈品回收评测
  • Dify部署中Internal Server Error问题分析与解决
  • 【Bug已解决】[Proposal] ImportError with Transformers 5.x: `cannot import name ‘HybridCache‘ from ‘transf
  • 仅限首批开放:AI写作多语言翻译私享工作台(含27个行业术语包+实时质量评分API+译后编辑热键集)
  • ​2026 春夏秋轻量化露营睡袋横向测评|15℃舒适温标,JOGOFO 轻量化热特棉睡袋实力解析 - 新闻快传
  • AI Agent技术解析与开发实战指南
  • 嵌入式系统低功耗子系统(LFSS)架构解析与实战应用
  • 2026哈尔滨道里旧黄金贬值严重?逸程黄金回收帮您挽回变现损失 - 逸程奢侈品回收中心
  • 制造业智能ERP系统如何解决库存管理难题
  • 为什么93%的AI客服项目在POC后夭折?——拆解智能体记忆管理、多轮对话状态机与人工兜底熔断机制(附可运行架构图)
  • AI、机器学习与深度学习的区别与应用场景解析
  • 东莞名表回收老牌靠谱!专业高价易奢福 - 回收奢侈品探店测评
  • xAI开源Grok Build:Rust终端编程智能体架构全解与实战指南
  • 2026生产级RAG提示词怎么调?3个踩坑复盘降幻觉,零代码提29%准确率附避坑表
  • 2026河源正规贵金属回收名录汇总 黄金铂金钻石回收靠谱线下门店推荐 - 生活测评小能手
  • 【AI自动化工作流终极指南】:20年专家亲授7大高 ROI 场景落地公式,错过再等一年