From 31ec7d3ad60c5546d6768e92e50774c5ab1363b8 Mon Sep 17 00:00:00 2001 From: InfinityPacer <160988576+InfinityPacer@users.noreply.github.com> Date: Mon, 31 Aug 2026 01:18:09 +0800 Subject: [PATCH] fix(dashboard): deactivate charts before route leave (#733) --- eslint-suppressions.json | 15 ------- src/components/misc/DashboardElement.vue | 20 +++++++--- src/components/render/DashboardRender.vue | 19 +++++++-- .../render/__tests__/DashboardRender.spec.ts | 40 +++++++++++++++++++ src/pages/__tests__/dashboard.spec.ts | 35 ++++++++++++++++ src/pages/dashboard.vue | 7 ++++ src/views/dashboard/AnalyticsCpu.vue | 13 +++--- src/views/dashboard/AnalyticsMemory.vue | 22 +++++++--- src/views/dashboard/AnalyticsNetwork.vue | 5 ++- .../dashboard/AnalyticsWeeklyOverview.vue | 9 +++++ .../__tests__/AnalyticsNetwork.spec.ts | 37 ++++++++++++++++- .../__tests__/AnalyticsWeeklyOverview.spec.ts | 20 +++++++++- 12 files changed, 204 insertions(+), 38 deletions(-) create mode 100644 src/components/render/__tests__/DashboardRender.spec.ts diff --git a/eslint-suppressions.json b/eslint-suppressions.json index 9dfc4ce5..fd6cc7b7 100644 --- a/eslint-suppressions.json +++ b/eslint-suppressions.json @@ -547,11 +547,6 @@ "count": 3 } }, - "src/composables/useSetupWizard.ts": { - "@typescript-eslint/no-explicit-any": { - "count": 1 - } - }, "src/composables/useSharedDialog.ts": { "@typescript-eslint/no-explicit-any": { "count": 1 @@ -823,16 +818,6 @@ "count": 1 } }, - "src/views/setup/MediaServerSettingsStep.vue": { - "@typescript-eslint/no-explicit-any": { - "count": 1 - } - }, - "src/views/setup/PreferencesSettingsStep.vue": { - "@typescript-eslint/no-explicit-any": { - "count": 1 - } - }, "src/views/subscribe/FullCalendarView.vue": { "@typescript-eslint/no-explicit-any": { "count": 1 diff --git a/src/components/misc/DashboardElement.vue b/src/components/misc/DashboardElement.vue index 883e53fc..42b79223 100644 --- a/src/components/misc/DashboardElement.vue +++ b/src/components/misc/DashboardElement.vue @@ -130,9 +130,7 @@ let dashboardLoadGeneration = 0 const pluginRenderMode = computed(() => props.config?.render_mode || 'vuetify') // 仪表盘远程组件共享源码,但所有插件动态 API 保持实例级隔离。 -const scopedPluginApi = computed(() => - createPluginInstanceApi(props.config?.id || '', props.config?.source_plugin_id), -) +const scopedPluginApi = computed(() => createPluginInstanceApi(props.config?.id || '', props.config?.source_plugin_id)) // 插件节点身份变化时重建异步组件,使失败后的远程模块可以再次加载。 const pluginDashboardIdentity = computed( @@ -241,7 +239,7 @@ onUnmounted(() => { - + @@ -274,7 +272,12 @@ onUnmounted(() => {
- +
@@ -287,7 +290,12 @@ onUnmounted(() => { {{ props.config?.attrs?.subtitle }} - + diff --git a/src/components/render/DashboardRender.vue b/src/components/render/DashboardRender.vue index 5fc53900..0a3f2082 100644 --- a/src/components/render/DashboardRender.vue +++ b/src/components/render/DashboardRender.vue @@ -4,31 +4,44 @@ import { type PropType } from 'vue' // 输入参数 const elementProps = defineProps({ + // 仪表盘失活时仅卸载依赖已连接 DOM 的图表,保留静态结构和其他控件状态。 + active: { + type: Boolean, + default: true, + }, config: Object as PropType, }) + +const canRenderComponent = computed(() => elementProps.active || elementProps.config?.component !== 'VApexChart')