跳转至

[ISSUE-0063] 商家列表首次 mount 闪"无数据"

用户截图(v0.10.81):切到商家列表 → 立即显示"还没有任何数据"+ "去创建任务", 但左侧 sidebar 显"商家列表 12778"(实际 1.2w 条)。过几百 ms 数据才显示。

病灶

A2 hybrid client mode 首次 mount 时:

mode='client'(默认)
+ rowsSnapshot = undefined(DataView 顶层 useRequest 异步拉中)
+ merchantStats.total = 0(初始 state)
+ state.allCount = -1(client mode 永远 -1)
+ dataLoading = false(client mode 不依赖 dataRun)

空状态 CTA 判定(v0.10.74 ISSUE-0054 #3 加的):

(state.allCount === 0 || (mode === 'client' && merchantStats.total === 0)) && !dataLoading

(false || true) && true = true空状态 CTA 显示

第 10 轮 agent 早就提过(🟡 #7 首次 mount 闪烁),当时归类为边缘 case 没修。 v0.10.79 大重构后此问题更明显。

1. DataView 暴露 rowsLoading

const { data: rows = [], refresh: refreshRows, loading: rowsLoading } = useRequest(...);
// ...
<LocalDataView rowsLoading={rowsLoading} ... />

2. LocalDataView Props 加 rowsLoading?: boolean

3. 空状态 CTA 加 !rowsLoading 守卫

{(dataSource.allCount === 0 || (mode === 'client' && merchantStats.total === 0))
  && !dataLoading
  && !rowsLoading ? (
  <空状态 CTA />
) : (
  <LocalTable ... />
)}

4. LocalTable loading 也带上 rowsLoading

<LocalTable loading={dataLoading || (mode === 'client' && !!rowsLoading)} ... />

让 client mode 首次 mount 时 DataGrid 显示 loading skeleton(不是空 CTA 也不是"No rows")。

时序对比

阶段 v0.10.82 v0.10.83
t=0 mount rowsSnapshot=undefined → 空 CTA 显示 rowsLoading=true → loading skeleton ✓
t=~100ms rows 拉到 CTA 消失 → 切到 DataGrid 显示数据 → 视觉闪烁 loading skeleton → DataGrid 显示数据 ✓
真没数据(DB 空) CTA 显示 ✓ rowsLoading=false + total=0 → CTA 显示 ✓

audit_grep

- pattern: "merchantStats\\.total\\s*===\\s*0[\\s\\S]{0,200}!dataLoading\\s*\\?"
  description: "空状态 CTA 必须同时守 !rowsLoading(防 client mode 首次 mount 闪烁)"

元洞察

"首次 mount 闪烁"在 v0.10.74 第 10 轮 agent 时就被识别 🟡 边缘 case 没修。 v0.10.79 大重构后用户实际遇到 → 升级到 🟡 中等问题。

agent 标的"边缘 case"在大重构后可能变成真问题。修补丁式可以拖延边缘 case, 重构时应该顺手把所有 🟡 都处理掉(关注分离改了,loading state 也该一并 propagate)。

相关

  • [[0053-a2-merchant-client-server-hybrid|0053-A2商家列表client-server-hybrid]] — A2 引入 rowsSnapshot 异步
  • [[0054-round10-agent-a2-6-bugs|0054-第10轮agent-A2-6处真bug]] — 当时 agent #7 提到但未修
  • [[0059-usedatasource-hook-refactor|0059-useDataSource-hook大重构]] — 大重构应该顺手修