"use client" import { useMemo } from "react" interface SimpleHorizontalBarChartProps { data: Record[] dataKey: string labelKey: string fill?: string width?: number } export function SimpleHorizontalBarChart({ data, dataKey, labelKey, fill = "#6366f1", width = 300, }: SimpleHorizontalBarChartProps) { const chartWidth = width const chartHeight = Math.max(data.length * 40 + 20, 120) const padding = { top: 10, right: 10, bottom: 10, left: 80 } const innerWidth = chartWidth - padding.left - padding.right const bars = useMemo(() => { if (data.length === 0) return [] const values = data.map(d => Number(d[dataKey]) || 0) const maxVal = Math.max(...values, 1) return data.map((d, i) => { const val = Number(d[dataKey]) || 0 const barWidth = (val / maxVal) * innerWidth * 0.9 const y = padding.top + (i * (chartHeight - padding.top - padding.bottom)) / data.length return { x: padding.left, y, width: barWidth, height: Math.min( 24, (chartHeight - padding.top - padding.bottom) / data.length - 4, ), label: String(d[labelKey] ?? ""), value: val, } }) }, [data, dataKey, labelKey, innerWidth, chartHeight]) if (data.length === 0) { return (
暂无数据
) } return ( {bars.map((bar, i) => ( {bar.label.length > 6 ? `${bar.label.slice(0, 6)}...` : bar.label} {bar.value} ))} ) }