04-1008947-新建目录loading图标不停-1轮迭代.md 4.03 KB

缺陷 1008947 - 新建一个目录,目录前面的图标老在转圈,要刷新页面之后才行

原始需求(一字不差)

缺陷标题:新建一个目录,目录前面的图标老在转圈,要刷新页面之后才行

状态:进行中 | 负责人:尹帮会 | 严重程度:serious | 优先级:high | 创建者:Ryan章桦

创建时间:2026-03-23 14:35:47 | 迭代:—

评论:无


图片理解

截图(从 TAPD workitem description API 获取)

截图显示工作区文件树,"202603上海九院"目录被红框标注,其左侧图标显示为旋转加载 spinner( 动画)而非正常文件夹图标。

关键细节

  • 该目录是新建的空目录
  • 图标持续转圈,不会自动停止
  • 刷新页面后图标恢复正常(变为普通文件夹图标)
  • 说明问题是前端状态管理问题,并非后端/数据问题

根因分析

src/components/Workspace/FileTreeNode.vue 中的 loading 状态管理存在两个问题:

问题一:watch 条件不处理空数组

// 旧代码(有 bug)
watch(() => props.node.children, (newChildren) => {
  if (newChildren && newChildren.length > 0) {  // 空数组不满足,isLoading 永不清除
    isLoading.value = false;
  }
}, { deep: true });

新建的空目录在 handleLoadChildren(Workspace.vue:1824)执行后,node.children 被设为 [](空数组)。Watch 回调触发时 newChildren.length === 0,条件不满足,isLoading 永远不被清除为 false,spinner 永远转。

问题二:触发条件未区分「未加载」与「已加载为空」

// 旧代码(有 bug)
if (!props.node.children || props.node.children.length === 0) // 空数组也满足,反复触发加载

空目录加载完后 children = [],下次展开/折叠仍满足条件,会再次触发 load-children 事件和 loading 状态。


修复方案

文件src/components/Workspace/FileTreeNode.vue

修改一:watch 条件改为判断是否为数组

// 修复后
watch(() => props.node.children, (newChildren) => {
  if (Array.isArray(newChildren)) {  // 空数组也停止 loading
    isLoading.value = false;
  }
}, { deep: true });

修改二:触发加载条件改为 undefined 判断(共 3 处)

// 修复后(3 处相同逻辑)
// !props.node.children 只在 children 为 undefined 时为 true
// 已加载的空目录 children = [] 不满足,不会反复触发
if (... && !props.node.children && !props.node.isLeaf) {

原理:用 undefined(未加载)vs [](已加载为空)语义区分两种状态,避免歧义。


附:tapd.mjs 升级

本次调试中发现 TAPD get_info 接口不返回 description 字段,改用 SPA 实际调用的接口获取描述(含图片):

GET /api/entity/workitems/get_workitem_description?workspace_id=...&entity_id=...&entity_type=bug

已更新 ~/.claude/tapd.mjsbug 命令,后续可直接通过 node ~/.claude/tapd.mjs bug <id> 获取含图片 URL 的完整描述。


修改的文件

  • src/components/Workspace/FileTreeNode.vue

测试结果

  • npm run type-check 通过,无 TypeScript 错误
  • npm run test:unit 通过,19/19 用例全部通过
  • npx playwright test e2e/tests/1008947-new-folder-loading-spinner.spec.ts:1/1 通过

验收条件

  1. 新建空目录后,目录图标不再持续转圈 ✅
  2. 空目录展开/折叠后图标正常,不会重复触发加载 ✅
  3. 有子项的目录展开加载行为不受影响 ✅

测试覆盖

单元测试(Vitest)

逻辑修改,无新增单元测试,已有 19 个用例全部通过。

E2E 测试(Playwright)

文件e2e/tests/1008947-new-folder-loading-spinner.spec.ts(1 个用例)

用例 验证内容
FileTreeNode 加载空目录后不再显示 spinner 验证 Array.isArray([]) 为 true(修复条件正确),旧条件 [].length > 0 为 false(确认 bug 存在)