ArkUI Checkbox:巡检锁定项批量选择有效集隔离与提交快照【鸿蒙心迹】
DemoCheckSafe页面CheckPlanPage任务CS-3109规则修订rev4。本文所有界面、HiLog 和日志均为构造的演示数据不代表真实 DevEco Studio 编译、真机运行或现场验收。一、一键勾选后锁定点位为什么也进了清单一个巡检班组的操作其实很简单打开待检点位列表先全选今天能去的机柜再取消临时不去的点位最后生成执行清单。麻烦出在“能去”不是固定属性。后台排程会把某些点位锁住例如消防阀正在检修现场人员仍能看到它却不该把它放进本轮执行清单。若界面只根据复选框是否显示来判断可选范围一次全选就可能把锁定项也带进结果。我把这个问题缩小成 CheckSafe 的一张页面。任务CS-3109含五个点位P-01 机房门禁、P-02 供电柜、P-03 消防阀、P-04 空调主机、P-05 应急灯。修订号rev4下只有P-03被锁定其余四项可选。演示的最终选择是P-01、P-02、P-04因此屏幕应明确显示“可选4、锁定1、已选3”并生成SNAPSHOT_READY。这些数字不是测量值而是文章、代码和配图共同使用的一组确定性输入。这里有一个容易被忽略的差别界面勾选状态是编辑中的意图提交快照才是经过规则过滤的结果。锁定项不应该通过“看起来灰了”来保证安全也不该依靠按钮点击前的一次清空来掩盖状态污染。真正的边界要放在数据层让批量选择、单项切换和最终提交都执行同一套资格判断。二、先固定数据身份再谈全选交互复选框是 ArkUI 组件但点位是否可用是业务属性。华为的 Checkbox 参考文档明确给出Checkbox({ name })、.select(boolean)和.onChange((value: boolean) …)的用法也可以使用通用的.enabled限制交互。它没有替应用提供“后台锁定仍不可提交”的业务保证这部分必须由我们实现。本文仅使用上述稳定组件能力避免把“批量筛选”包装成不存在的系统接口。先写一层最小的数据模型解决“全选究竟选哪些 ID”的问题。全选返回新数组不直接改写点位数组ID 是稳定身份而不是列表下标。这样后续即使排序或刷新勾选也不会莫名串到另一行。interfaceCheckPoint{id:string;title:string;locked:boolean;}constPOINTS:CheckPoint[][{id:P-01,title:机房门禁,locked:false},{id:P-02,title:供电柜,locked:false},{id:P-03,title:消防阀,locked:true},{id:P-04,title:空调主机,locked:false},{id:P-05,title:应急灯,locked:false}];functionselectEligible(points:CheckPoint[]):string[]{returnpoints.filter((p:CheckPoint)!p.locked).map((p:CheckPoint)p.id);}selectEligible在这组数据上会返回四个 ID其中绝不包含P-03。用户随后取消P-05页面中才剩下三个选择。方法是纯计算没有文件句柄、监听器或网络连接可释放生命周期取决于调用它的页面。真实后台更新时必须传入当时最新的规则列表不能把首次加载的POINTS当成永远有效。后台列表为空时结果就是空数组不能自行恢复旧勾选。三、灰态只是视觉反馈提交必须重新过滤我最在意的不是“点下去会不会变色”而是提交瞬间是否仍可能把不可用 ID 混进结果。比如页面刚打开时P-03可选用户勾了它随后规则修订变更点位锁定。仅将 Checkbox 置灰不会自动消除之前保存在数组里的 ID。更糟的是批量全选和逐项取消可能来自不同入口状态残留肉眼很难发现。因此提交操作不直接复制selectedIds而是先获取当前可用 ID 集合再按页面可见顺序重新筛一遍。这里还要比对规则修订号提交时若不是期望的rev4宁可返回拒绝也不拿旧规则假装成功。下面代码负责生成前端演示快照不包含真实服务端写入或权限确认。interfaceCommitSnapshot{taskId:string;ruleRev:number;ids:string[];status:string;}functionmakeSnapshot(points:CheckPoint[],chosen:string[],actualRev:number,expectedRev:number):CommitSnapshot|null{if(actualRev!expectedRev)returnnull;constallowed:SetstringnewSetstring(points.filter((p:CheckPoint)!p.locked).map((p:CheckPoint)p.id));constids:string[]points.filter((p:CheckPoint)allowed.has(p.id)chosen.includes(p.id)).map((p:CheckPoint)p.id);if(ids.length0)returnnull;return{taskId:CS-3109,ruleRev:actualRev,ids:ids.slice(),status:SNAPSHOT_READY};}这个函数解决的是提交一致性不是将状态写入磁盘。ids.slice()是为了避免外部继续修改同一数组Set只是本次运算的临时索引。条件失败返回null调用方需要显示“规则已变化请重新核验”或“没有可提交点位”不能把两种异常都解释成服务器异常。实际产品还应在服务端再次校验点位权限、锁定版本及操作者身份前端快照并不构成越权访问的凭据。四、把编辑态留给页面把不可选项留给规则进入 ArkUI 页面后我们只维护selectedIds和提交状态不在组件里复制另一套lockedMap。将一套资格来源拆成两个可修改副本正是热更新时产生不一致的根源。Checkbox的name使用点位 ID.select由数组计算锁定项通过.enabled(false)禁止人工点击即使 UI 层回调异常触发togglePoint也再次检查锁定条件。下面保留页面最关键的事件路径其他配色和间距可以按产品规范扩展。演示启动时已经走过“全选可用项再取消 P-05”的流程因此最终三项选中点击生成快照只更新页面状态不声称完成网络提交。EntryComponentstruct CheckPlanPage{privatepoints:CheckPoint[]POINTS;StateselectedIds:string[][P-01,P-02,P-04];StatecommitStatus:stringSNAPSHOT_READY;privatetogglePoint(id:string,checked:boolean):void{constpoint:CheckPoint|undefinedthis.points.find((p:CheckPoint)p.idid);if(!point||point.locked)return;this.selectedIdschecked?Array.from(newSetstring([...this.selectedIds,id])):this.selectedIds.filter((item:string)item!id);}build(){Column({space:12}){Text(CS-3109 · rev4 · 可选4 / 锁定1 / 已选3)ForEach(this.points,(p:CheckPoint){Row({space:12}){Checkbox({name:p.id}).select(this.selectedIds.includes(p.id)).enabled(!p.locked).onChange((checked:boolean)this.togglePoint(p.id,checked))Text(${p.id}${p.title}${p.locked? · 锁定:})}},(p:CheckPoint)p.id)Button(生成快照).onClick((){constsnapshotmakeSnapshot(this.points,this.selectedIds,4,4);this.commitStatussnapshot?snapshot.status:REJECTED;})Text(状态${this.commitStatus})}}}代码里标题行的“已选3”只对应这次固定演示。若将它作为真正可交互工程页面应换成this.selectedIds.length的动态显示并在后台规则变化后重新计算否则用户继续点击时数字会与实际勾选不一致。演示图采用冻结的最终状态目的是让读者直接核对快照边界而不是展示一个完整生产级选择流程。State数组采用整体赋值是为了让框架看到状态变化如果原地修改普通数组却没有触发刷新UI 就可能停留在旧值。五、校验时别只看“都打了勾”我建议验收时先做三个反向动作第一按全选路径运行确认P-03永远不进入结果第二把已选的P-02设成锁定后再提交确保快照会过滤它而不是依赖界面是否及时刷新第三将规则修订从4改到5确认提交返回拒绝。它们测试的分别是批量选择边界、提交边界和版本边界。三者通过后再去调整样式才有意义。本轮固定演示中五个点位里可选四个、锁定一个、选中三个快照中的 ID 顺序是P-01,P-02,P-04状态SNAPSHOT_READY。日志示例统一写成CS-3109 rev4 selectable4 locked1 selected3 statusSNAPSHOT_READY。这是为了方便文章与两张运行示意图逐项核对不是从 HiLog 采集的真机证据。六、页面消失以后哪些状态该保留这份 Demo 没有注册定时器、长期网络请求或蓝牙监听因此离开页面时没有额外句柄需要释放。但“没有句柄”不代表“没有生命周期问题”selectedIds是页面编辑草稿页面重新创建后可能恢复为初值。真实应用应明确选中态是一次性操作还是需要跨页保存不能默认把快照当成已经持久化的任务。若从服务端重新打开首先加载规则版本和点位列表再根据稳定 ID 恢复尚有效的草稿。对于锁定项显示为灰态是有价值的它告诉巡检人员这个点位存在但当前不能安排。把它从列表直接删除反而可能导致误以为任务丢失。另一方面锁定原因、权限和服务端变更应显示可解释文案不能把所有禁用都写成“网络异常”。页面级enabled是交互限制业务级makeSnapshot是数据限制两层必须同时存在。还有一个容易被团队忽略的验收细节服务端可能同时把新点位插入列表。旧客户端如果只保存“第几行被勾选”新列表一到就会产生位置漂移。因此恢复草稿时应按 ID 做交集遇到已经删除的点位直接标为待确认如果任务已经正式提交则展示提交时的规则版本与快照内容而不是拿今天的最新列表去覆盖历史记录。这样的记录才能支持事后追溯也能让产品明确区分“当时允许执行”和“现在仍可执行”。这次复盘最终落在一个非常具体的结论批量选中只处理用户意图提交时必须按最新规则重新建立有效集。当数据变动、页面重建或点击回调顺序不可控时只有把稳定 ID、规则修订和不可变快照分开才能避免“明明灰掉了却仍被带进工单”的隐蔽问题。本文示例没有覆盖真实协同冲突、离线同步及后台竞态那些必须交给端到端测试继续验证。参考资料华为官方 Checkbox APIhttps://developer.huawei.com/consumer/cn/doc/doccenter-capabilities/api/ts-basic-components-checkbox华为官方 ArkTS 简介https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-overview

相关新闻

Windows下libmemcached-win32构建与避坑指南

Windows下libmemcached-win32构建与避坑指南

简介:libmemcached-win32 是一份面向 Windows 平台 C/C 开发者的 memcache 客户端源码包,专为需要在 VC2008 环境下编译 libmemcached 的读者准备。作者在寻找可用于 ASP 的 memcache 客户端时,发现纯 win32 方案性能一般,最终整理…

2026/10/14 20:37:57 阅读更多 →
ArkTS Map+Array.sort:乱序巡检采样水位线与迟到包拒绝【鸿蒙心迹】

ArkTS Map+Array.sort:乱序巡检采样水位线与迟到包拒绝【鸿蒙心迹】

Demo:WatermarkDesk|页面:StreamAuditPage|任务:WM-3109。文中的采样流、运行状态、终端界面与 HiLog 全部属于确定性的演示资料,不是传感器实测、真机编译结果或网络压力测试。 一、先把四条数据故意按错误…

2026/10/14 20:37:57 阅读更多 →
算法竞赛博弈论:从巴什博弈到SG函数的实战指南

算法竞赛博弈论:从巴什博弈到SG函数的实战指南

1. 博弈论在算法竞赛中的定位与整体设计思路1.1 为什么博弈论是竞赛中的“思维分水岭”在算法竞赛里,博弈论题目有个很明显的特征:代码量往往极短,但思维难度极高。很多选手第一次遇到博弈题时,会本能地想去模拟、去搜索、去暴力枚…

2026/10/14 20:37:57 阅读更多 →

最新新闻

Linux下C/C++动静态库制作与使用实战指南

Linux下C/C++动静态库制作与使用实战指南

长期以来在Linux下做C/C开发,动静态库始终是绕不开的一个核心技能。无论是自己封装模块、分发二进制产物,还是处理第三方依赖,理解库的制作与使用直接决定了你在编译链接这块能不能少掉头发。我见过不少开发者写业务逻辑很熟练,一…

2026/10/15 4:26:50 阅读更多 →
Flutter鸿蒙开发实战:星座应用跨平台全流程解析

Flutter鸿蒙开发实战:星座应用跨平台全流程解析

1. 项目背景与整体设计思路1.1 为什么选 Flutter 做鸿蒙开发聊到跨平台开发,Flutter 这几年的热度一直在线。原因很简单——一套 Dart 代码,同时跑在 Android、iOS、Windows、macOS、Linux 上,现在还要加上鸿蒙。放在以前,鸿蒙应用…

2026/10/15 4:26:50 阅读更多 →
线上故障排查实战指南:从告警到恢复的黄金步骤

线上故障排查实战指南:从告警到恢复的黄金步骤

半夜两点被电话叫醒,睁开眼看到屏幕上一排红色告警,心跳直接拉满。这种场景,几乎所有做过线上系统的开发者都经历过。告警本身不可怕,可怕的是大脑一片空白,不知道该先点哪里,也不知道哪些命令能救命。这篇…

2026/10/15 4:26:50 阅读更多 →
基于SpringBoot+Vue的个人博客系统开发实战

基于SpringBoot+Vue的个人博客系统开发实战

1. 项目概述与整体技术选型1.1 这个博客系统到底解决了什么问题做个人博客这件事,看起来简单,真做起来坑不少。早期用现成框架,比如WordPress或者各类静态站点生成器,总觉得差了点什么——要么太重,装一堆插件才能用&a…

2026/10/15 4:26:50 阅读更多 →
共享内存IPC实战:从零拷贝原理到信号量同步,提升跨进程通信性能

共享内存IPC实战:从零拷贝原理到信号量同步,提升跨进程通信性能

共享内存(shm)这个老牌IPC方案,我最近在一个数据采集服务里又把它翻了出来。这个服务原本是跨进程传数据,管道和Unix域Socket用得挺顺手,可流量一起来,CPU占用就再也压不下去。换成共享内存之后&#xff0c…

2026/10/15 4:26:50 阅读更多 →
如何判断Ubuntu是否真的关机?三路检查方法与实战探测脚本

如何判断Ubuntu是否真的关机?三路检查方法与实战探测脚本

你有没有遇到过这种情况:在终端里输入了sudo shutdown now,屏幕上日志飞快滚动,最后一切归于黑暗,风扇也慢慢停转,你很自然地认为这台 Ubuntu 机器已经关机了。但我在几年的实践中发现,这个结论经常下得太早…

2026/10/15 4:25:50 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →