fix:Transition 白屏——组件多根节点 + Vite 模块请求拦截

- Welcome.vue:回忆卡片 el-dialog 和根 section 共存导致多根节点,<Transition>
  无法动画。包裹一层 <div>
- Study.vue:同上(权重配置对话框)
- MindMapViewer.vue:事件名 selectNode→selectNewNode(类型错误)
- e2e/study.spec.ts + navigation.spec.ts:地址栏 Vite 在模块 URL 后追加
  ?t=... 时间戳,.endsWith('.ts') 匹配失效,改用 url.includes('/src/')
This commit is contained in:
2026-07-04 09:43:07 +08:00
parent 104ae78a2b
commit 3adbeb183c
6 changed files with 14 additions and 7 deletions
+1 -1
View File
@@ -37,7 +37,7 @@ test.describe('Header navigation', () => {
test('back button shows on sub-pages and navigates to /welcome', async ({ page }) => { test('back button shows on sub-pages and navigates to /welcome', async ({ page }) => {
await page.route('**/api/tasks**', (route) => { await page.route('**/api/tasks**', (route) => {
if (route.request().url().endsWith('.ts')) return route.continue(); if (route.request().url().includes('/src/')) return route.continue();
route.fulfill({ status: 200, contentType: 'application/json', body: JSON.stringify(mockTasks) }); route.fulfill({ status: 200, contentType: 'application/json', body: JSON.stringify(mockTasks) });
}); });
await page.route('**/api/review/feed**', (route) => await page.route('**/api/review/feed**', (route) =>
+6 -3
View File
@@ -38,7 +38,8 @@ test.describe('Study page', () => {
await page.route('**/api/tasks**', (route) => { await page.route('**/api/tasks**', (route) => {
const url = route.request().url(); const url = route.request().url();
// 排除 Vite 模块加载请求(.ts 文件),只拦截真正的 API 请求 // 排除 Vite 模块加载请求(.ts 文件),只拦截真正的 API 请求
if (url.endsWith('.ts')) return route.continue(); // Vite 模块请求都走 /src/ 路径,跳过它们只拦截真正的 API 请求
if (url.includes('/src/')) return route.continue();
if (url.includes('/tasks') && !url.includes('/tasks/')) { if (url.includes('/tasks') && !url.includes('/tasks/')) {
return route.fulfill({ return route.fulfill({
status: 200, status: 200,
@@ -87,7 +88,8 @@ test.describe('Study page', () => {
test('delete task removes it from the list', async ({ page }) => { test('delete task removes it from the list', async ({ page }) => {
await page.route('**/api/tasks/1', (route) => { await page.route('**/api/tasks/1', (route) => {
const url = route.request().url(); const url = route.request().url();
if (url.endsWith('.ts')) return route.continue(); // Vite 模块请求都走 /src/ 路径,跳过它们只拦截真正的 API 请求
if (url.includes('/src/')) return route.continue();
route.fulfill({ route.fulfill({
status: 200, status: 200,
contentType: 'application/json', contentType: 'application/json',
@@ -102,7 +104,8 @@ test.describe('Study page', () => {
test('shows empty state when no tasks', async ({ page }) => { test('shows empty state when no tasks', async ({ page }) => {
await page.route('**/api/tasks**', (route) => { await page.route('**/api/tasks**', (route) => {
const url = route.request().url(); const url = route.request().url();
if (url.endsWith('.ts')) return route.continue(); // Vite 模块请求都走 /src/ 路径,跳过它们只拦截真正的 API 请求
if (url.includes('/src/')) return route.continue();
route.fulfill({ route.fulfill({
status: 200, status: 200,
contentType: 'application/json', contentType: 'application/json',
+1 -1
View File
@@ -13,7 +13,7 @@
"type-check": "vue-tsc --build --force", "type-check": "vue-tsc --build --force",
"test": "vitest run", "test": "vitest run",
"test:watch": "vitest", "test:watch": "vitest",
"test:e2e": "playwright test", "test:e2e": "npx playwright test",
"test:e2e:ui": "playwright test --ui" "test:e2e:ui": "playwright test --ui"
}, },
"dependencies": { "dependencies": {
+2 -2
View File
@@ -119,9 +119,9 @@ const render = () => {
}); });
} }
instance.bus.addListener("selectNode", (node: any) => { instance.bus.addListener("selectNewNode", (node: any) => {
if (node?.sourceType && node?.sourceId != null) { if (node?.sourceType && node?.sourceId != null) {
emit("node-click", { sourceType: node.sourceType, sourceId: node.sourceId }); emit("node-click", { sourceType: String(node.sourceType), sourceId: Number(node.sourceId) });
} }
}); });
}; };
+2
View File
@@ -255,6 +255,7 @@ onMounted(() => {
</script> </script>
<template> <template>
<div>
<section class="study-page"> <section class="study-page">
<div class="layout-grid"> <div class="layout-grid">
<aside class="surface-card task-list"> <aside class="surface-card task-list">
@@ -405,6 +406,7 @@ onMounted(() => {
</el-button> </el-button>
</template> </template>
</el-dialog> </el-dialog>
</div>
</template> </template>
<style scoped> <style scoped>
+2
View File
@@ -113,6 +113,7 @@ onMounted(() => {
</script> </script>
<template> <template>
<div>
<section class="welcome-page"> <section class="welcome-page">
<div class="review-scroll-section surface-card"> <div class="review-scroll-section surface-card">
<div class="review-scroll-header"> <div class="review-scroll-header">
@@ -199,6 +200,7 @@ onMounted(() => {
<el-button @click="recallCard.visible = false">关闭</el-button> <el-button @click="recallCard.visible = false">关闭</el-button>
</template> </template>
</el-dialog> </el-dialog>
</div>
</template> </template>
<style scoped> <style scoped>