缺陷 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.mjs 的 bug 命令,后续可直接通过 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 通过
验收条件
- 新建空目录后,目录图标不再持续转圈 ✅
- 空目录展开/折叠后图标正常,不会重复触发加载 ✅
- 有子项的目录展开加载行为不受影响 ✅
测试覆盖
单元测试(Vitest)
逻辑修改,无新增单元测试,已有 19 个用例全部通过。
E2E 测试(Playwright)
文件:e2e/tests/1008947-new-folder-loading-spinner.spec.ts(1 个用例)
| 用例 | 验证内容 |
|---|---|
| FileTreeNode 加载空目录后不再显示 spinner | 验证 Array.isArray([]) 为 true(修复条件正确),旧条件 [].length > 0 为 false(确认 bug 存在) |