From c049e0e97d4656ef40172a9033f395e43f77a62e Mon Sep 17 00:00:00 2001 From: claude_dev Date: Sun, 2 Aug 2026 19:51:51 +0800 Subject: [PATCH] =?UTF-8?q?fix(frontend):=20MetricCards=20fmt=20=E5=85=9C?= =?UTF-8?q?=E5=BA=95=E5=AD=97=E7=AC=A6=E4=B8=B2=E5=80=BC(=E6=B2=BB?= =?UTF-8?q?=E7=BB=93=E6=9E=9C=E9=A1=B5=E6=95=B4=E9=A1=B5=E6=B8=B2=E6=9F=93?= =?UTF-8?q?=E5=B4=A9=E6=BA=83)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 后端 statistics 字段可返字符串(如 sharpe_ratio="0",vnpy原始统计),原 fmt 直接 value.toFixed 在字符串上抛 TypeError。stack trace 证实:Result.vue onMounted 赋值 relativeMetrics 后 MetricCards fmt 崩溃,中断 Vue re-render → echarts setOption 从未执行 → 指标卡+所有图表全空(cta_3919916e 零成交复现,canvas:0)。Number() 统一转换兜底。vue-tsc RC=0。 --- frontend/src/components/backtest/MetricCards.vue | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/frontend/src/components/backtest/MetricCards.vue b/frontend/src/components/backtest/MetricCards.vue index dd2fab8..b3af199 100644 --- a/frontend/src/components/backtest/MetricCards.vue +++ b/frontend/src/components/backtest/MetricCards.vue @@ -17,10 +17,13 @@ interface RelativeMetrics { const props = defineProps<{ metrics: RelativeMetrics }>() -// null/NaN 安全格式化(后端 NaN→None,退化指标如 sortino 可能为 null) +// null/NaN/字符串 安全格式化。后端 statistics 字段可能返字符串(如 sharpe_ratio="0", +// vnpy 原始统计),原 value.toFixed 在字符串上抛 TypeError 致整个结果页渲染崩溃 +// (指标卡 + 所有图表全空)。Number() 统一转换兜底。 function fmt(value: number | null | undefined, digits: number, percent = false): string { - if (value == null || isNaN(value as number)) return '—' - return percent ? `${(value * 100).toFixed(digits)}%` : value.toFixed(digits) + const n = Number(value) + if (value == null || Number.isNaN(n)) return '—' + return percent ? `${(n * 100).toFixed(digits)}%` : n.toFixed(digits) } // 格式化百分比(×100,保留2位小数)