给 Codex 分加载任务,我会先划清页面、按钮和局部三层边界

发布时间:2026/10/11 4:03:41

给 Codex 分加载任务,我会先划清页面、按钮和局部三层边界 上一篇说过列表页的“忙”不是一个是几个。这一篇把这些“忙”落成三层每一层有自己的归属和关门条件。分层以后交给 Codex 的任务就从“加个 loading”变成“给这个页面找出几个等待每个等待归谁管”。分层不是命名游戏。真正的依据是生命周期谁触发的、等谁的、谁有权结束。页面级遮罩只认首屏不认每一次请求页面级的等待起点是页面挂载终点是首屏数据就绪。它的作用是把整页空白挡在后面遮罩一关页面就进入可用状态。这一层最容易写错的地方是让它跟着后续每一次翻页、查询开开关关。首屏过后再查一遍数据页面本身不需要重新遮罩遮罩反复出现反而打断操作。结构示意const firstLoad ref(true); const list ref([]); ​ const initList async () { firstLoad.value true; try { list.value await listApi({ page: 1, size: 10 }); } finally { firstLoad.value false; } };finally只是确保这个状态一定会复位不代表它解决了并发。首屏和翻页如果共用同一个请求入口还需要请求资格判断这一点上一篇已经拆过。按钮级节流和去重是两件事按钮级的等待属于一次提交起点是点击终点是这次提交的响应。它要解决的是用户手快连点两次。const saving ref(false); ​ const onSave async (form) { if (saving.value) return; saving.value true; try { await saveApi(form); } finally { saving.value false; } };这里挡住的只是“同一时间只发一次”。还有一类问题它挡不住请求已经发出、响应也回来了用户刷新页面或后退后再点一次同一份表单又提交了一份。那是幂等和去重的事不是节流的事。web-skills把按钮节流交给btnState配置在请求拦截器里打开、响应或异常里关闭。它管的是节流这一段不负责业务幂等。给 Codex 描述按钮状态时要先分清这次要解决的是连点还是重复数据两个目标对应两套机制。局部级表格区域和弹框各自关门局部级的等待发生在页面已经可用之后只影响一小块区域。典型的是表格查询和弹框内加载。const listLoading ref(false); const dialogLoading ref(false); ​ const loadList async (params) { listLoading.value true; try { return await listApi(params); } finally { listLoading.value false; } };表格的listLoading只跟随列表请求弹框的dialogLoading只跟随弹框请求。它们不该互相覆盖也不该去动页面级的遮罩。web-skills用loading和dialogLoading两个独立配置项把这两段分开。目标项目若没有这套封装至少要保证一个区域的状态不会因为另一个区域的请求结束而被关掉。局部级还有一个并发细节。两次翻页快速切换时第一次请求后返回也会执行finally把listLoading提前关掉。所以局部状态同样要配请求资格判断否则分层了遮罩还是会被旧响应提前收走。三层之间的关闭条件先写清楚再让 Codex 动手层级触发者关闭条件常见错写页面级页面挂载首屏数据 settle跟随每次查询反复遮罩按钮级用户点击本次提交 settle用全局 loading 代替按钮状态局部级区域请求该区域最新请求 settle被其它区域或旧响应关闭这张表交给 Codex 之前先确认“settle”在项目里的含义。有的团队只要请求返回就关有的要求数据已写入状态再关。口径不统一分层再清楚也会在交接处出缝。分层后的验收一半靠读代码一半靠跑页面加载状态没法只靠静态审查交付有一部分必须打开页面才能确认。静态能查的每个 loading 状态有没有独立的来源关闭发生在响应成功、失败还是finally有没有哪个状态被多个请求共用。要跑页面的并发翻页时遮罩会不会被旧响应提前关掉保存期间表格查询的 loading 是否被误关首屏遮罩关掉后表格是否已就绪。这些需要一次真实操作或者明确记为未验证不能靠读代码下结论。交给 Codex 的任务模板请为这张列表页整理加载状态不先改代码 ​ 1. 列出页面里所有“忙”的场景首屏、翻页、查询、刷新、保存、弹框加载等。 2. 为每个场景标出层级页面级、按钮级还是局部级。 3. 记录每个状态当前由谁写入、在哪个请求或生命周期里关闭。 4. 找出被两个以上请求共用的状态说明谁先返回会影响谁。 5. 区分按钮节流和业务幂等指出本项目当前只解决了哪个。 ​ 先给出分层表和关闭条件再给最小修改方案。不要新增一个统一 loading 把现有状态包起来也不要绕开项目已有的请求封装。这条任务的第一句就是“不先改代码”。加载状态的混乱大多是因为动手之前没人把“几个忙、各归谁”数清楚。数清楚了改哪里通常是显而易见的。写在最后分层解决的不是命名问题是关门权。页面遮罩、按钮状态、区域加载各有各的生命周期把它们塞进一个布尔值遮罩就会在错误的时间消失。按页面、按钮、局部三层划清归属和关闭条件再配合请求资格判断加载状态才从“加了个变量”变成“每条等待都有出处”。下一篇进到按钮这一层专门讲重复提交连点、双击、提交后刷新、接口重试分别该用节流、去重还是幂等来挡而不是一律塞进btnState。本系列持续更新。列表页的加载和提交状态收束后会回到页面异常路径看接口失败时列表应该如何退化。参考资料OpenAI Codex 用例理解代码库中的请求流、模块职责与隐藏依赖
延伸阅读

更多相关文章

2026/10/6 21:32:35

Codex 写列表时,加载状态为什么不是加一个 loading 就够

“loading 加了吗?加了。” 这是交接任务时最常听到的一句答复。但列表页的“加载中”从来不是一件事。首次进入页面要等首屏数据,翻页和查询要等表格数据,点保存要等提交结果。这三个“忙”发生在不同时刻,持续不同时间,也由不同动作结束。 如果它们共用一个布尔值,麻…

2026/10/8 18:46:07

怀旧游戏神器!安卓Java模拟器重温经典

它是一款java模拟器安卓版, 属java游戏模拟平台, 深受小朋友们的喜爱, 它能汇集海量游戏资源, 游戏类型繁多, 能靠众多游戏类型满足每位玩家需求, 它卓越兼容性确保游戏流畅运行, 给用户带来极致游戏享受, 令小编佩服的是, 该软件凭借现代硬件技术, 对游戏图形做了全面优化, 让…

2026/10/9 22:11:29

分布式锁Redisson实战,解决订单超卖并发问题

做电商后端开发,商品超卖应该算是老生常谈的并发难题了。之前我参与过一个秒杀小活动,库存设置 100 件,最后下单成功 130 多单,直接出现超卖,后续还要人工处理退款,给业务造成不小麻烦。一开始我们用数据库…

2026/10/11 5:07:42

AI智能工具编程实战:用TaoToken统一Key打通Cline MCP与Windsurf BYOK

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

2026/10/11 5:07:42

UVa 138:从暴力枚举到佩尔方程的递推优化

UVa 138 Street Numbers 是我很早就刷到的一道题,第一眼看上去就是“街道门牌号求和”,像是无脑枚举加判断;等你真把前几组值算出来,会发现这些数字跳得极快,暴力枚举很快就追不上了。这道题其实是在考佩尔方程&#x…

2026/10/11 5:02:42

国产CAD软件哪个上手快?应届生适配参考

刚接触CAD的新手,打开软件后常面对这样的场景:工具栏、命令行、图层管理器都在眼前,却不知道先点哪个;想画一条直线,找不到命令入口;看到别人的图纸里图层、标注、块井井有条,自己却不知道从何建…

2026/10/11 0:02:13

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/11 0:02:13

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/11 0:02:13

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/11 0:02:13

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/11 0:02:13

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/11 0:02:13

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑