-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.ts
More file actions
370 lines (352 loc) · 11.5 KB
/
index.ts
File metadata and controls
370 lines (352 loc) · 11.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
import { RefObject } from "react";
import { FlexChartICSS, LoadingOption } from "./icss";
import { EChartOption } from "echarts"; // todo 暂时@types/echarts没有跟进到echarts最新5.x的版本,后续及时跟进更新类型
import { EChartsType } from "../index";
export interface FlexChartProps<DataItem extends FlexChartDataItemBasic = FlexChartDataItem> extends FlexChartICSS {
/**
* @description 数据源
* @default []
*/
data: DataItem[];
/** 数据data的字段对应属性名 */
fieldNames?: FieldNames;
/** 系列数据类型,默认是bar柱类型系列 */
seriesTypes?: SeriesTypes | SeriesTypes[];
/** 如果单纯是要设置line系列的数据,不想通过series的数组设置的话则可以统一设置 */
lineSeries?: EChartOption.SeriesLine;
/** 如果单纯是要设置bar系列的数据,不想通过series的数组设置的话则可以统一设置 */
barSeries?: EChartOption.SeriesBar;
/**
* @description 是否开启容器尺寸变化监听,页面resize的话容器自然也会可能触发容器的resize
* 所以监听容器的resize更彻底准确,但是一般而言页面布局可能没有那么复杂
* 所以不需要额外内存监听容器尺寸的变化,节省内存开销
* 且该resize监听同时会触发setOption重新调整边界尺寸的计算,所以还是比较沉重的
* 所以一般而言无复杂情况业务则不需要开启resizeObserver
*/
autoResize?: boolean;
/** echarts的配置参数(echarts官方文档上的配置项) */
options?: EChartOption;
/** echarts初始化参数配置 */
initOpts?: EchartsInitOpts;
/** 初始化的样式主题 */
initTheme?: string | object;
/** 图表加载,加载参数是图表实例,并且会随着实例的销毁重建而更新 */
onChartLoad?(chartsInstance: EChartsType): void;
/** 事件绑定 */
onEvents?: FlexChartEventsType;
/**
* @description 方向(垂直/水平/垂直反向/水平反向),非echarts初始化时的主题设置,而是FlexChart本身的主题配置
* 权重级别比option低,即如果option里面的配置影响了布局尺寸设置
* 会以option为主,direction的方向配置可能会失效,因为本身direction的方向设置是根据echarts的option实现的
*
* @default vertical
*/
direction: FlexChartDirection;
/**
* @description 是否合并echarts配置项
* 默认true合并,合并会提高渲染的效率,但是合并会影响图表数据渲染的准确性
* 所以必要时需要设置为false不合并->保证每次都是最新的配置项来保证数据渲染的准确性即可
*
* @default true
*/
mergeOption: boolean;
/**
* @description autoFit自适应计算尺寸是在没有scale缩放页面屏幕的情况下使用
* 外部props也可以控制是否禁用autoFit的适配尺寸计算
* 比如有scale缩放的时候即禁用,或者别的业务逻辑的情况下使用等等
*
* @default false
*/
autoFit: boolean;
/** chart的loading */
loading: boolean;
/** chart的loading配置项 */
loadingOption: LoadingOption;
}
/** FlexChart的监听事件的种类类型 */
type FlexChartEventsTypes = {
type:
| "click"
| "dblclick"
| "mousedown"
| "mousemove"
| "mouseup"
| "mouseover"
| "mouseout"
| "globalout"
| "contextmenu"
| "highlight"
| "downplay"
| "selectchanged"
| "legendselectchanged"
| "legendselected"
| "legendunselected"
| "legendselectall"
| "legendinverseselect"
| "legendscroll"
| "datazoom"
| "datarangeselected"
| "graphroam"
| "georoam"
| "treeroam"
| "timelinechanged"
| "timelineplaychanged"
| "restore"
| "dataviewchanged"
| "magictypechanged"
| "geoselectchanged"
| "geoselected"
| "geounselected"
| "axisareaselected"
| "brush"
| "brushEnd"
| "brushselected"
| "globalcursortaken"
| "rendered"
| "finished";
}
/** FlexChart监听事件类型 */
export type FlexChartEventsType = {
[key in FlexChartEventsTypes["type"]]?: FlexChartEventsFuncTypeHandle | FlexChartEventsFuncType;
}
/** FlexChart监听事件回调函数类型 */
export type FlexChartEventsFuncTypeHandle = (
params: EventParams,
chartsInstance: EChartsType,
) => void;
/** FlexChart监听事件的回调函数的参数类型 */
export type EventParams = {
type: string;
encode: {
x: number[];
y: number[];
};
dimensionNames: ("x" | "y")[];
// 当前点击的图形元素所属的组件名称,
// 其值如 'series'、'markLine'、'markPoint'、'timeLine' 等。
componentType: string;
componentSubType: string;
// 系列类型。值可能为:'line'、'bar'、'pie' 等。当 componentType 为 'series' 时有意义。
seriesType: string;
// 系列在传入的 option.series 中的 index。当 componentType 为 'series' 时有意义。
seriesIndex: number;
seriesId: string;
// 系列名称。当 componentType 为 'series' 时有意义。
seriesName: string;
// 数据名,类目名
name: string | number;
// 数据在传入的 data 数组中的 index
dataIndex: number;
// 传入的原始数据项
data: Object;
// sankey、graph 等图表同时含有 nodeData 和 edgeData 两种 data,
// dataType 的值会是 'node' 或者 'edge',表示当前点击在 node 还是 edge 上。
// 其他大部分图表中只有一种 data,dataType 无意义。
dataType?: string;
// 传入的数据值
value: number | string | (number | string)[];
// 数据图形的颜色。当 componentType 为 'series' 时有意义。
color: string;
borderColor?: string;
// 用户自定义的数据。只在 graphic component 和自定义系列(custom series)
// 中生效,如果节点定义上设置了如:{type: 'circle', info: {some: 123}}。
info?: any;
event: HandleEvent;
};
/** todo 部分属性不确定用any */
export type HandleEvent = {
cancelBubble: boolean;
event: PointerEvent;
gestureEvent?: any;
offsetX: number;
offsetY: number;
pinchScale?: any;
pinchX?: any;
pinchY?: any;
stop: Function;
target: any;
topTarget: any;
type: "click";
wheelDelta: number;
which: number;
zrByTouch?: any;
};
/** flex-chart图表的风格方向 */
export type FlexChartDirection = "vertical" | "horizontal" | "verticalInverse" | "horizontalInverse";
/** 尺寸变化类型 */
export interface ResizeObserverType {
/** 监听 */
observe(target: Element): void;
/** 解除监听 */
unobserve(target: Element): void;
/** 取消连接 */
disconnect(): void;
}
/** FlexChart的状态类型 */
export interface FlexChartState {
containerRef: RefObject<HTMLElement>;
}
/** FlexChart的data属性的中数据data的value值的类型 */
export type FlexChartDataValue = number | string | null | undefined;
/** FlexChart的data属性的中数据data数组的元素类型 */
export interface FlexChartDataObject {
/** 数据项名称 */
name: string | number;
/** 单个数据项的数值 */
value: FlexChartDataValue;
}
/** FlexChart的data属性的字段转换字段名接口类型 */
export interface FieldNames {
name?: string;
data?: string;
dataName?: string;
dataValue?: string;
}
/** FlexChart的data属性的基础类型 */
export interface FlexChartDataItemBasic {
[key: string]: any;
}
/**
* @description 想着数据格式不参染样式设置,所以这里没有设置为echarts的series的数据类型包含symbol,label等各种设置
* 做了一个单纯的数据抽象,抽离出需要的纯数据或者纯对象数据
*/
export interface FlexChartDataItem {
/** 系列名 */
name: string | number;
/** 该系列数据 */
data: FlexChartDataObject[];
}
/** echarts的初始化参数配置 */
export interface EchartsInitOpts {
devicePixelRatio?: number;
renderer?: "canvas" | "svg";
width?: number | string | null;
height?: number | string | null;
useDirtyRect?: boolean; // 从 `5.0.0` 开始支持
ssr?: boolean; // 从 `5.3.0` 开始支持
locale?: string; // 从 `5.0.0` 开始支持
}
/** 主要的系列类型line与bar */
export type SeriesTypes = "bar" | "line";
export type FlexChartEventsFuncType = {
/**
* query 可为 string 或者 Object。
* 如果为 string 表示组件类型。格式可以是 'mainType' 或者 'mainType.subType'。例如:
* chart.on('click', 'series', function() {});
* chart.on('click', 'series.line', function() {});
* chart.on('click', 'dataZoom', function() {});
* chart.on('click', 'xAxis.category', function() {});
*
* 如果为 Object,可以包含以下一个或多个属性,每个属性都是可选的:
* {
* ${mainType}Index: number // 组件 index
* ${mainType}Name: string // 组件 name
* ${mainType}Id: string // 组件 id
* dataIndex: number // 数据项 index
* name: string // 数据项 name
* dataType: string // 数据项 type,如关系图中的 'node', 'edge'
* element: string // 自定义系列中的 el 的 name
* }
*
* 例如:
* chart.setOption({
* // ...
* series: [
* {
* name: 'uuu'
* // ...
* }
* ]
* });
* chart.on('mouseover', { seriesName: 'uuu' }, function() {
* // series name 为 'uuu' 的系列中的图形元素被 'mouseover' 时,此方法被回调。
* });
*
* 例如:
* chart.setOption({
* // ...
* series: [
* {
* // ...
* },
* {
* // ...
* data: [
* { name: 'xx', value: 121 },
* { name: 'yy', value: 33 }
* ]
* }
* ]
* });
* chart.on('mouseover', { seriesIndex: 1, name: 'xx' }, function() {
* // series index 1 的系列中的 name 为 'xx' 的元素被 'mouseover' 时,此方法被回调。
* });
*
* 例如:
* chart.setOption({
* // ...
* series: [
* {
* type: 'graph',
* nodes: [
* { name: 'a', value: 10 },
* { name: 'b', value: 20 }
* ],
* edges: [{ source: 0, target: 1 }]
* }
* ]
* });
* chart.on('click', { dataType: 'node' }, function() {
* // 关系图的节点被点击时此方法被回调。
* });
* chart.on('click', { dataType: 'edge' }, function() {
* // 关系图的边被点击时此方法被回调。
* });
*
* 例如:
* chart.setOption({
* // ...
* series: {
* // ...
* type: 'custom',
* renderItem: function(params, api) {
* return {
* type: 'group',
* children: [
* {
* type: 'circle',
* name: 'my_el'
* // ...
* },
* {
* // ...
* }
* ]
* };
* },
* data: [[12, 33]]
* }
* });
* chart.on('mouseup', { element: 'my_el' }, function() {
* // name 为 'my_el' 的元素被 'mouseup' 时,此方法被回调。
* });
*
* 你可以在回调函数中获得这个对象中的数据名、系列名称后在自己的数据仓库中索引得到其它的信息后更新图表,显示浮层等等,如下示例代码:
* myChart.on('click', function(parmas) {
* $.get('detail?q=' + params.name, function(detail) {
* myChart.setOption({
* series: [
* {
* name: 'pie',
* // 通过饼图表现单个柱子中的数据分布
* data: [detail.data]
* }
* ]
* });
* });
* });
*/
query?: string | Object;
handle: FlexChartEventsFuncTypeHandle;
};
export * from "./icss";