@easy-editor/materials-dashboard-radar-chart 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/meta.min.js CHANGED
@@ -1,2 +1 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).EasyEditorMaterialsTechRadarChartMeta={})}(this,function(e){"use strict";const t="EasyEditorMaterialsTechRadarChart";const a={componentName:t,title:"雷达图",group:"chart",devMode:"proCode",npm:{package:"@easy-editor/materials-dashboard-tech-radar-chart",version:"0.0.1",globalName:t,componentName:t},snippets:[{title:"雷达图",screenshot:"",schema:{componentName:t,props:{data:[{dimension:"Attack",player1:85,player2:70},{dimension:"Defense",player1:70,player2:90},{dimension:"Speed",player1:95,player2:60},{dimension:"Magic",player1:60,player2:85},{dimension:"HP",player1:75,player2:80}],dimensionKey:"dimension",series:[{name:"Player 1",dataKey:"player1",color:"#00d4ff"},{name:"Player 2",dataKey:"player2",color:"#00ff88"}],showGrid:!0,fillOpacity:.3,glowEffect:!0,showLegend:!0},$dashboard:{rect:{width:400,height:300}}}},{title:"单系列雷达图",screenshot:"",schema:{componentName:t,props:{data:[{dimension:"Attack",value:85},{dimension:"Defense",value:70},{dimension:"Speed",value:95},{dimension:"Magic",value:60},{dimension:"HP",value:75}],dimensionKey:"dimension",series:[{name:"Stats",dataKey:"value",color:"#00d4ff"}],showGrid:!0,fillOpacity:.4,glowEffect:!0,showLegend:!1},$dashboard:{rect:{width:400,height:300}}}}],configure:{props:[{type:"group",title:"属性",setter:"TabSetter",items:[{type:"group",key:"config",title:"配置",setter:{componentName:"CollapseSetter",props:{icon:!1}},items:[{name:"id",title:"ID",setter:"NodeIdSetter",extraProps:{label:!1}},{name:"title",title:"标题",setter:"StringSetter",extraProps:{getValue:e=>e.getExtraPropValue("title"),setValue(e,t){e.setExtraPropValue("title",t)}}},{type:"group",title:"基础属性",setter:{componentName:"CollapseSetter",props:{icon:!1}},items:[{name:"rect",title:"位置尺寸",setter:"RectSetter",extraProps:{getValue:e=>e.getExtraPropValue("$dashboard.rect"),setValue(e,t){e.setExtraPropValue("$dashboard.rect",t)}}}]},{type:"group",title:"数据",setter:{componentName:"CollapseSetter",props:{icon:!1}},items:[{name:"data",title:"数据",setter:"JsonSetter"},{name:"dimensionKey",title:"维度字段",setter:"StringSetter",extraProps:{defaultValue:"dimension"}},{name:"series",title:"系列",setter:"JsonSetter"}]},{type:"group",title:"数值格式",setter:{componentName:"CollapseSetter",props:{icon:!1}},items:[{name:"valuePrefix",title:"前缀",setter:"StringSetter"},{name:"valueSuffix",title:"后缀",setter:"StringSetter"},{name:"valueDecimals",title:"小数位数",setter:{componentName:"NumberSetter",props:{suffix:"位"}},extraProps:{defaultValue:0}}]},{type:"group",title:"样式",setter:{componentName:"CollapseSetter",props:{icon:!1}},items:[{name:"showGrid",title:"显示网格",setter:"SwitchSetter",extraProps:{defaultValue:!0}},{name:"fillOpacity",title:"填充透明度",setter:{componentName:"SliderSetter",props:{min:0,max:1,step:.1}},extraProps:{defaultValue:.3}},{name:"showLegend",title:"显示图例",setter:"SwitchSetter",extraProps:{defaultValue:!0}},{name:"legendPosition",title:"图例位置",setter:{componentName:"SelectSetter",props:{options:[{label:"顶部",value:"top"},{label:"底部",value:"bottom"},{label:"左侧",value:"left"},{label:"右侧",value:"right"}]}},extraProps:{defaultValue:"bottom"}},{name:"glowEffect",title:"发光效果",setter:"SwitchSetter",extraProps:{defaultValue:!0}}]}]},{type:"group",key:"data",title:"数据",items:[{name:"dataBinding",title:"数据绑定",setter:"DataBindingSetter"}]},{type:"group",key:"advanced",title:"高级",items:[{name:"condition",title:"显隐控制",setter:"SwitchSetter",extraProps:{defaultValue:!0,supportVariable:!0}}]}]}],component:{},supports:{},advanced:{}}};e.default=a,Object.defineProperty(e,"__esModule",{value:!0})});
2
- //# sourceMappingURL=meta.min.js.map
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react")):"function"==typeof define&&define.amd?define(["exports","react"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).EasyEditorMaterialsRadarChartMeta={})}(this,function(e){"use strict";const t=(e,t)=>{const a=Array.isArray(e)?e:[e],r=a[0]||{};return{sourceType:"static",staticData:a,fieldMappings:Object.keys(r).map(e=>({componentField:e,sourceField:e}))}},a=(e,t,a)=>({type:"group",title:e,setter:{componentName:"CollapseSetter",props:{icon:!1,...a}},items:t}),r={name:"nodeInfo",title:"节点信息",setter:"NodeInfoSetter",extraProps:{label:!1}},i=a("基础配置",[{name:"title",title:"标题",setter:"StringSetter",extraProps:{getValue:e=>e.getExtraPropValue("title"),setValue(e,t){e.setExtraPropValue("title",t)}}},{name:"rect",title:"位置尺寸",setter:"RectSetter",extraProps:{getValue:e=>e.getExtraPropValue("$dashboard.rect"),setValue(e,t){e.setExtraPropValue("$dashboard.rect",t)}}},{name:"rotation",title:"旋转角度",setter:{componentName:"SliderSetter",props:{min:0,max:360,suffix:"°"}},extraProps:{defaultValue:0}},{name:"opacity",title:"不透明度",setter:{componentName:"SliderSetter",props:{min:0,max:100,suffix:"%"}},extraProps:{defaultValue:100}},{name:"background",title:"背景颜色",setter:"ColorSetter",extraProps:{defaultValue:"transparent"}}]),o=[{title:"点击事件",children:[{label:"点击",value:"onClick",description:"鼠标点击时触发"},{label:"双击",value:"onDoubleClick",description:"鼠标双击时触发"}]},{title:"鼠标事件",children:[{label:"鼠标进入",value:"onMouseEnter",description:"鼠标进入时触发"},{label:"鼠标离开",value:"onMouseLeave",description:"鼠标离开时触发"}]}],s=((e=o)=>a("事件绑定",[{name:"events",title:"事件",setter:{componentName:"EventSetter",props:{events:e}},extraProps:{label:!1}}]))(),n=a("高级配置",[{title:"条件渲染",setter:"SwitchSetter",extraProps:{supportVariable:!0,getValue:e=>e.getNode().getExtraPropValue("condition"),setValue(e,t){e.getNode().setExtraProp("condition",t)}}}]),l="EasyEditorMaterialsTechRadarChart";const p=((e,t)=>({props:[{type:"group",title:"属性",setter:"TabSetter",items:[{type:"group",key:"config",title:"配置",items:[r,i,e]},{type:"group",key:"data",title:"数据",items:[r,t]},{type:"group",key:"advanced",title:"高级",items:[r,s,n]}]}],component:{},supports:{},advanced:{}}))(a("组件配置",[{type:"group",title:"组件配置",setter:"SubTabSetter",items:[{type:"group",key:"chartData",title:"数据",items:[{name:"dimensionKey",title:"维度字段",setter:"StringSetter",extraProps:{defaultValue:"dimension"}},{name:"series",title:"系列配置",setter:"JsonSetter"}]},{type:"group",key:"style",title:"样式",items:[{name:"showGrid",title:"显示网格",setter:"SwitchSetter",extraProps:{defaultValue:!0}},{name:"fillOpacity",title:"填充透明度",setter:{componentName:"SliderSetter",props:{min:0,max:1,step:.1}},extraProps:{defaultValue:.3}},{name:"glowEffect",title:"发光效果",setter:"SwitchSetter",extraProps:{defaultValue:!0}}]},{type:"group",key:"legend",title:"图例",items:[{name:"showLegend",title:"显示图例",setter:"SwitchSetter",extraProps:{defaultValue:!0}},{name:"legendPosition",title:"图例位置",setter:{componentName:"SelectSetter",props:{options:[{label:"顶部",value:"top"},{label:"底部",value:"bottom"},{label:"左侧",value:"left"},{label:"右侧",value:"right"}]}},extraProps:{defaultValue:"bottom"}},{name:"showTooltip",title:"显示提示",setter:"SwitchSetter",extraProps:{defaultValue:!0}}]}]}],{padding:"6px 16px 12px"}),{name:"$data",title:"数据配置",setter:{componentName:"DataSetter",props:{expectedFields:[{name:"dimension",label:"dimension",type:"string",required:!0,description:"维度名称"},{name:"value1",label:"value1",type:"number",required:!0,description:"数值1"},{name:"value2",label:"value2",type:"number",required:!1,description:"数值2"}],showPreview:!0,previewLimit:10}},extraProps:{label:!1}});const d={componentName:l,title:"雷达图",group:"chart",devMode:"proCode",npm:{package:"@easy-editor/materials-dashboard-tech-radar-chart",version:"0.0.4",globalName:l,componentName:l},snippets:[{title:"雷达图",screenshot:"",schema:{componentName:l,title:"雷达图",props:{$data:t([{dimension:"销售",series1:80,series2:65},{dimension:"管理",series1:70,series2:85},{dimension:"技术",series1:90,series2:75},{dimension:"客服",series1:75,series2:80},{dimension:"研发",series1:85,series2:70}]),dimensionKey:"dimension",series:[{name:"系列1",dataKey:"series1",color:"#00d4ff"},{name:"系列2",dataKey:"series2",color:"#00ff88"}],showGrid:!0,fillOpacity:.3,glowEffect:!0,showLegend:!0,rotation:0,opacity:100,background:"transparent"},$dashboard:{rect:{width:400,height:300}}}},{title:"单系列雷达图",screenshot:"",schema:{componentName:l,title:"单系列雷达图",props:{$data:t([{dimension:"Attack",value:85},{dimension:"Defense",value:70},{dimension:"Speed",value:95},{dimension:"Magic",value:60},{dimension:"HP",value:75}]),dimensionKey:"dimension",series:[{name:"Stats",dataKey:"value",color:"#00d4ff"}],showGrid:!0,fillOpacity:.4,glowEffect:!0,showLegend:!1,rotation:0,opacity:100,background:"transparent"},$dashboard:{rect:{width:400,height:300}}}}],configure:p};e.meta=d});
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @easy-editor/easypack configuration
3
+ * @type {import('@easy-editor/easypack').EasypackConfig}
4
+ */
5
+ export default {
6
+ preset: 'material',
7
+ dev: {
8
+ port: 5001,
9
+ },
10
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@easy-editor/materials-dashboard-radar-chart",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "description": "Radar Chart component for EasyEditor dashboard",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -48,20 +48,16 @@
48
48
  },
49
49
  "dependencies": {
50
50
  "echarts": "^5.6.0",
51
- "@easy-editor/materials-shared": "0.0.0"
51
+ "@easy-editor/materials-shared": "0.0.1"
52
52
  },
53
53
  "scripts": {
54
- "dev": "vite",
54
+ "dev": "easypack dev",
55
55
  "dev:debug": "vite --port 5005",
56
56
  "format": "biome format --write .",
57
57
  "lint": "biome check .",
58
58
  "build": "npm-run-all -nl build:*",
59
59
  "build:clean": "rimraf dist/",
60
- "build:js": "rollup -c",
61
- "build:types": "pnpm types",
62
- "types": "npm-run-all -nl types:*",
63
- "types:src": "tsc --project tsconfig.build.json",
64
- "test-types": "tsc --project tsconfig.test.json"
60
+ "build:js": "easypack build"
65
61
  },
66
62
  "module": "dist/index.esm.js",
67
63
  "unpkg": "dist/index.min.js"
package/src/component.tsx CHANGED
@@ -1,199 +1,244 @@
1
- import { useEffect, useRef, type CSSProperties, type Ref } from 'react'
2
- import * as echarts from 'echarts/core'
3
- import { RadarChart } from 'echarts/charts'
4
- import { TooltipComponent, LegendComponent } from 'echarts/components'
5
- import { CanvasRenderer } from 'echarts/renderers'
6
- import type { EChartsOption } from 'echarts'
7
- import { DEFAULT_DATA, DEFAULT_SERIES, type RadarDataPoint } from './constants'
8
- import styles from './component.module.css'
9
-
10
- // 按需注册 ECharts 组件
11
- echarts.use([RadarChart, TooltipComponent, LegendComponent, CanvasRenderer])
12
-
13
- interface RadarSeries {
14
- name: string
15
- dataKey: string
16
- color: string
17
- }
18
-
19
- interface RadarChartProps {
20
- ref?: Ref<HTMLDivElement>
21
- data?: RadarDataPoint[]
22
- dimensionKey?: string
23
- series?: RadarSeries[]
24
- showGrid?: boolean
25
- fillOpacity?: number
26
- glowEffect?: boolean
27
- showLegend?: boolean
28
- showTooltip?: boolean
29
- style?: CSSProperties
30
- }
31
-
32
- // 构建图表配置
33
- const buildOption = (
34
- data: RadarDataPoint[],
35
- dimensionKey: string,
36
- series: RadarSeries[],
37
- options: {
38
- showGrid: boolean
39
- fillOpacity: number
40
- glowEffect: boolean
41
- showLegend: boolean
42
- showTooltip: boolean
43
- },
44
- ): EChartsOption => {
45
- const { showGrid, fillOpacity, glowEffect, showLegend, showTooltip } = options
46
-
47
- // 提取维度名称
48
- const indicators = data.map(item => ({
49
- name: item[dimensionKey] as string,
50
- max: 100,
51
- }))
52
-
53
- // 构建 series 数据
54
- const seriesData = series.map(s => ({
55
- name: s.name,
56
- value: data.map(item => item[s.dataKey] as number),
57
- itemStyle: {
58
- color: s.color,
59
- shadowColor: glowEffect ? s.color : 'transparent',
60
- shadowBlur: glowEffect ? 10 : 0,
61
- },
62
- lineStyle: {
63
- color: s.color,
64
- width: 2,
65
- shadowColor: glowEffect ? s.color : 'transparent',
66
- shadowBlur: glowEffect ? 10 : 0,
67
- },
68
- areaStyle: {
69
- color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
70
- {
71
- offset: 0,
72
- color: `${s.color}${Math.round(fillOpacity * 255)
73
- .toString(16)
74
- .padStart(2, '0')}`,
75
- },
76
- { offset: 1, color: `${s.color}10` },
77
- ]),
78
- },
79
- }))
80
-
81
- return {
82
- backgroundColor: 'transparent',
83
- tooltip: showTooltip
84
- ? {
85
- trigger: 'item',
86
- backgroundColor: 'rgba(0, 20, 40, 0.9)',
87
- borderColor: '#00d4ff',
88
- borderWidth: 1,
89
- textStyle: {
90
- color: '#fff',
91
- },
92
- }
93
- : undefined,
94
- legend: showLegend
95
- ? {
96
- show: true,
97
- bottom: 10,
98
- textStyle: {
99
- color: '#8899aa',
100
- fontSize: 11,
101
- },
102
- }
103
- : undefined,
104
- radar: {
105
- indicator: indicators,
106
- shape: 'polygon',
107
- splitNumber: 5,
108
- axisName: {
109
- color: '#8899aa',
110
- fontSize: 11,
111
- },
112
- splitLine: {
113
- show: showGrid,
114
- lineStyle: {
115
- color: '#1a3a5c',
116
- opacity: 0.6,
117
- },
118
- },
119
- splitArea: {
120
- show: false,
121
- },
122
- axisLine: {
123
- show: showGrid,
124
- lineStyle: {
125
- color: '#1a3a5c',
126
- opacity: 0.6,
127
- },
128
- },
129
- },
130
- series: [
131
- {
132
- type: 'radar',
133
- data: seriesData,
134
- symbol: 'circle',
135
- symbolSize: 6,
136
- },
137
- ],
138
- }
139
- }
140
-
141
- const RadarChartComponent = (props: RadarChartProps) => {
142
- const {
143
- ref,
144
- data = DEFAULT_DATA,
145
- dimensionKey = 'dimension',
146
- series = DEFAULT_SERIES,
147
- showGrid = true,
148
- fillOpacity = 0.3,
149
- glowEffect = true,
150
- showLegend = true,
151
- showTooltip = true,
152
- style: externalStyle,
153
- } = props
154
-
155
- const chartRef = useRef<HTMLDivElement>(null)
156
- const chartInstance = useRef<echarts.ECharts | null>(null)
157
-
158
- useEffect(() => {
159
- if (!chartRef.current) {
160
- return
161
- }
162
-
163
- chartInstance.current = echarts.init(chartRef.current)
164
-
165
- const option = buildOption(data, dimensionKey, series, {
166
- showGrid,
167
- fillOpacity,
168
- glowEffect,
169
- showLegend,
170
- showTooltip,
171
- })
172
-
173
- chartInstance.current.setOption(option)
174
-
175
- const resizeObserver = new ResizeObserver(() => {
176
- chartInstance.current?.resize()
177
- })
178
- resizeObserver.observe(chartRef.current)
179
-
180
- return () => {
181
- resizeObserver.disconnect()
182
- chartInstance.current?.dispose()
183
- }
184
- }, [data, dimensionKey, series, showGrid, fillOpacity, glowEffect, showLegend, showTooltip])
185
-
186
- const containerStyle: CSSProperties = {
187
- width: '100%',
188
- height: '100%',
189
- ...externalStyle,
190
- }
191
-
192
- return (
193
- <div className={styles.container} ref={ref} style={containerStyle}>
194
- <div className={styles.chart} ref={chartRef} />
195
- </div>
196
- )
197
- }
198
-
199
- export default RadarChartComponent
1
+ /**
2
+ * Radar Chart Component
3
+ * 雷达图组件 - 支持数据源绑定和事件交互
4
+ */
5
+
6
+ import { useEffect, useMemo, useRef, type CSSProperties } from 'react'
7
+ import * as echarts from 'echarts/core'
8
+ import { RadarChart as EChartsRadarChart } from 'echarts/charts'
9
+ import { TooltipComponent, LegendComponent } from 'echarts/components'
10
+ import { CanvasRenderer } from 'echarts/renderers'
11
+ import type { EChartsOption } from 'echarts'
12
+ import { type MaterialComponet, useDataSource } from '@easy-editor/materials-shared'
13
+ import { DEFAULT_DATA, DEFAULT_SERIES, type RadarDataPoint } from './constants'
14
+ import styles from './component.module.css'
15
+
16
+ // 按需注册 ECharts 组件
17
+ echarts.use([EChartsRadarChart, TooltipComponent, LegendComponent, CanvasRenderer])
18
+
19
+ interface RadarSeries {
20
+ name: string
21
+ dataKey: string
22
+ color: string
23
+ }
24
+
25
+ export interface RadarChartProps extends MaterialComponet {
26
+ /** 静态数据(兼容旧版) */
27
+ data?: RadarDataPoint[]
28
+ /** 维度字段 */
29
+ dimensionKey?: string
30
+ /** 系列配置 */
31
+ series?: RadarSeries[]
32
+ /** 显示网格 */
33
+ showGrid?: boolean
34
+ /** 填充透明度 */
35
+ fillOpacity?: number
36
+ /** 发光效果 */
37
+ glowEffect?: boolean
38
+ /** 显示图例 */
39
+ showLegend?: boolean
40
+ /** 显示提示 */
41
+ showTooltip?: boolean
42
+ /** 点击事件 */
43
+ onClick?: (e: React.MouseEvent) => void
44
+ /** 双击事件 */
45
+ onDoubleClick?: (e: React.MouseEvent) => void
46
+ /** 鼠标进入 */
47
+ onMouseEnter?: (e: React.MouseEvent) => void
48
+ /** 鼠标离开 */
49
+ onMouseLeave?: (e: React.MouseEvent) => void
50
+ }
51
+
52
+ // 构建图表配置
53
+ const buildOption = (
54
+ data: RadarDataPoint[],
55
+ dimensionKey: string,
56
+ series: RadarSeries[],
57
+ options: {
58
+ showGrid: boolean
59
+ fillOpacity: number
60
+ glowEffect: boolean
61
+ showLegend: boolean
62
+ showTooltip: boolean
63
+ },
64
+ ): EChartsOption => {
65
+ const { showGrid, fillOpacity, glowEffect, showLegend, showTooltip } = options
66
+
67
+ // 提取维度名称
68
+ const indicators = data.map(item => ({
69
+ name: item[dimensionKey] as string,
70
+ max: 100,
71
+ }))
72
+
73
+ // 构建 series 数据
74
+ const seriesData = series.map(s => ({
75
+ name: s.name,
76
+ value: data.map(item => item[s.dataKey] as number),
77
+ itemStyle: {
78
+ color: s.color,
79
+ shadowColor: glowEffect ? s.color : 'transparent',
80
+ shadowBlur: glowEffect ? 10 : 0,
81
+ },
82
+ lineStyle: {
83
+ color: s.color,
84
+ width: 2,
85
+ shadowColor: glowEffect ? s.color : 'transparent',
86
+ shadowBlur: glowEffect ? 10 : 0,
87
+ },
88
+ areaStyle: {
89
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
90
+ {
91
+ offset: 0,
92
+ color: `${s.color}${Math.round(fillOpacity * 255)
93
+ .toString(16)
94
+ .padStart(2, '0')}`,
95
+ },
96
+ { offset: 1, color: `${s.color}10` },
97
+ ]),
98
+ },
99
+ }))
100
+
101
+ return {
102
+ backgroundColor: 'transparent',
103
+ tooltip: showTooltip
104
+ ? {
105
+ trigger: 'item',
106
+ backgroundColor: 'rgba(0, 20, 40, 0.9)',
107
+ borderColor: '#00d4ff',
108
+ borderWidth: 1,
109
+ textStyle: {
110
+ color: '#fff',
111
+ },
112
+ }
113
+ : undefined,
114
+ legend: showLegend
115
+ ? {
116
+ show: true,
117
+ bottom: 10,
118
+ textStyle: {
119
+ color: '#8899aa',
120
+ fontSize: 11,
121
+ },
122
+ }
123
+ : undefined,
124
+ radar: {
125
+ indicator: indicators,
126
+ shape: 'polygon',
127
+ splitNumber: 5,
128
+ axisName: {
129
+ color: '#8899aa',
130
+ fontSize: 11,
131
+ },
132
+ splitLine: {
133
+ show: showGrid,
134
+ lineStyle: {
135
+ color: '#1a3a5c',
136
+ opacity: 0.6,
137
+ },
138
+ },
139
+ splitArea: {
140
+ show: false,
141
+ },
142
+ axisLine: {
143
+ show: showGrid,
144
+ lineStyle: {
145
+ color: '#1a3a5c',
146
+ opacity: 0.6,
147
+ },
148
+ },
149
+ },
150
+ series: [
151
+ {
152
+ type: 'radar',
153
+ data: seriesData,
154
+ symbol: 'circle',
155
+ symbolSize: 6,
156
+ },
157
+ ],
158
+ }
159
+ }
160
+
161
+ export const RadarChart: React.FC<RadarChartProps> = ({
162
+ ref,
163
+ $data,
164
+ __dataSource,
165
+ data: staticData,
166
+ dimensionKey = 'dimension',
167
+ series = DEFAULT_SERIES,
168
+ showGrid = true,
169
+ fillOpacity = 0.3,
170
+ glowEffect = true,
171
+ showLegend = true,
172
+ showTooltip = true,
173
+ rotation = 0,
174
+ opacity = 100,
175
+ background = 'transparent',
176
+ style: externalStyle,
177
+ onClick,
178
+ onDoubleClick,
179
+ onMouseEnter,
180
+ onMouseLeave,
181
+ }) => {
182
+ const chartRef = useRef<HTMLDivElement>(null)
183
+ const chartInstance = useRef<echarts.ECharts | null>(null)
184
+
185
+ // 解析数据源
186
+ const dataSource = useDataSource($data, __dataSource)
187
+ const data = useMemo<RadarDataPoint[]>(() => {
188
+ if (dataSource.length > 0) {
189
+ return dataSource as RadarDataPoint[]
190
+ }
191
+ return staticData ?? DEFAULT_DATA
192
+ }, [dataSource, staticData])
193
+
194
+ useEffect(() => {
195
+ if (!chartRef.current) {
196
+ return
197
+ }
198
+
199
+ chartInstance.current = echarts.init(chartRef.current)
200
+
201
+ const option = buildOption(data, dimensionKey, series, {
202
+ showGrid,
203
+ fillOpacity,
204
+ glowEffect,
205
+ showLegend,
206
+ showTooltip,
207
+ })
208
+
209
+ chartInstance.current.setOption(option)
210
+
211
+ const resizeObserver = new ResizeObserver(() => {
212
+ chartInstance.current?.resize()
213
+ })
214
+ resizeObserver.observe(chartRef.current)
215
+
216
+ return () => {
217
+ resizeObserver.disconnect()
218
+ chartInstance.current?.dispose()
219
+ }
220
+ }, [data, dimensionKey, series, showGrid, fillOpacity, glowEffect, showLegend, showTooltip])
221
+
222
+ const containerStyle: CSSProperties = {
223
+ width: '100%',
224
+ height: '100%',
225
+ transform: rotation !== 0 ? `rotate(${rotation}deg)` : undefined,
226
+ opacity: opacity / 100,
227
+ backgroundColor: background,
228
+ ...externalStyle,
229
+ }
230
+
231
+ return (
232
+ <div
233
+ className={styles.container}
234
+ onClick={onClick}
235
+ onDoubleClick={onDoubleClick}
236
+ onMouseEnter={onMouseEnter}
237
+ onMouseLeave={onMouseLeave}
238
+ ref={ref}
239
+ style={containerStyle}
240
+ >
241
+ <div className={styles.chart} ref={chartRef} />
242
+ </div>
243
+ )
244
+ }