st-comp 0.0.147 → 0.0.149

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.
Files changed (142) hide show
  1. package/components.d.ts +3 -0
  2. package/es/ChartLayout.cjs +1 -1
  3. package/es/ChartLayout.js +2 -2
  4. package/es/Dialog.cjs +1 -1
  5. package/es/Dialog.js +26 -22
  6. package/es/FactorWarning.cjs +1 -1
  7. package/es/FactorWarning.js +112 -103
  8. package/es/Kline.cjs +1 -0
  9. package/es/Kline.js +1901 -0
  10. package/es/KlineBasic.cjs +1 -1
  11. package/es/KlineBasic.js +675 -1422
  12. package/es/KlineNew.cjs +1 -3
  13. package/es/KlineNew.js +314 -2736
  14. package/es/Pagination.cjs +1 -1
  15. package/es/Pagination.js +102 -96
  16. package/es/Table.cjs +1 -1
  17. package/es/Table.js +66 -60
  18. package/es/User.cjs +1 -1
  19. package/es/User.js +102 -95
  20. package/es/VarietySearch.cjs +1 -1
  21. package/es/VarietySearch.js +41 -32
  22. package/es/VirtualTable.cjs +13 -1
  23. package/es/VirtualTable.js +2801 -1
  24. package/es/{_initCloneObject-a8dcd058.js → _initCloneObject-14b53c6f.js} +26 -26
  25. package/es/_initCloneObject-441db749.cjs +1 -0
  26. package/es/{base-674a354a.js → base-437d17f3.js} +64 -63
  27. package/es/{base-00ce90ec.cjs → base-ec05f348.cjs} +3 -3
  28. package/es/castArray-4251bbe4.js +10 -0
  29. package/es/castArray-a45823fe.cjs +1 -0
  30. package/es/config-provider-55482a43.js +47 -0
  31. package/es/config-provider-7cdfca4d.cjs +1 -0
  32. package/es/debounce-ac30be50.js +83 -0
  33. package/es/debounce-b2ff12bd.cjs +1 -0
  34. package/es/{dropdown-ce30ada6.js → dropdown-634b5e27.js} +31 -30
  35. package/es/dropdown-d7c59a21.cjs +1 -0
  36. package/es/el-button-196807af.cjs +1 -0
  37. package/es/el-button-e1665717.js +235 -0
  38. package/es/el-checkbox-group-492b95cc.cjs +1 -0
  39. package/es/{el-checkbox-group-0554b352.js → el-checkbox-group-e8fece80.js} +10 -10
  40. package/es/{el-empty-87154b6d.cjs → el-empty-19ea04f4.cjs} +1 -1
  41. package/es/{el-empty-39b3aed7.js → el-empty-bacc6613.js} +5 -5
  42. package/es/el-form-item-5bdffd07.cjs +12 -0
  43. package/es/{el-form-item-fc6f80ab.js → el-form-item-af1855f0.js} +79 -78
  44. package/es/el-input-23e2bac3.cjs +1 -0
  45. package/es/{el-input-d249ac86.js → el-input-4961b99f.js} +84 -82
  46. package/es/el-input-number-40a81eb5.cjs +1 -0
  47. package/es/{el-input-number-2066fbb7.js → el-input-number-610fc8ba.js} +36 -35
  48. package/es/el-menu-item-78b858f2.cjs +1 -0
  49. package/es/el-menu-item-7d04c11a.js +771 -0
  50. package/es/{el-message-9859835d.js → el-message-c3b3ac96.js} +81 -79
  51. package/es/el-message-d4df8136.cjs +1 -0
  52. package/es/el-overlay-12dd9b35.js +519 -0
  53. package/es/el-overlay-bc0790a2.cjs +1 -0
  54. package/es/{el-popover-b7b43c1f.js → el-popover-0aa071f2.js} +18 -18
  55. package/es/el-popover-8a77e015.cjs +1 -0
  56. package/es/el-popper-50100766.js +2262 -0
  57. package/es/el-popper-746070ba.cjs +1 -0
  58. package/es/el-scrollbar-562d0595.js +201 -0
  59. package/es/el-scrollbar-d1c3e7f7.cjs +1 -0
  60. package/es/{el-select-bcbb7e55.js → el-select-9381b156.js} +333 -329
  61. package/es/el-select-b162dffc.cjs +1 -0
  62. package/es/{el-table-column-c1e1a206.js → el-table-column-55bffba5.js} +350 -346
  63. package/es/el-table-column-6d761fce.cjs +14 -0
  64. package/es/el-tag-985d9aff.js +279 -0
  65. package/es/el-tag-c51a6490.cjs +1 -0
  66. package/es/index-09e01b1d.js +81 -0
  67. package/es/index-0cb48e01.js +306 -0
  68. package/es/{index-45de4a12.js → index-39ec9741.js} +7 -7
  69. package/es/index-3bf8d597.cjs +1 -0
  70. package/es/index-657047bb.js +513 -0
  71. package/es/index-8a0b1c53.cjs +3 -0
  72. package/es/index-a387515d.cjs +1 -0
  73. package/es/index-a902a0d9.js +59 -0
  74. package/es/index-deb8de52.cjs +1 -0
  75. package/es/index-eea0bcb3.cjs +1 -0
  76. package/es/index.esm-8d9a2abe.js +2432 -0
  77. package/es/index.esm-94a95a2a.cjs +3 -0
  78. package/es/raf-8fc301fd.cjs +1 -0
  79. package/es/raf-b128c7b7.js +6 -0
  80. package/es/{scroll-cb696ed2.js → scroll-387fcfdb.js} +1 -1
  81. package/es/{scroll-cca17da0.cjs → scroll-41224831.cjs} +1 -1
  82. package/es/style.css +1 -1
  83. package/es/typescript-7ae59c4c.js +4 -0
  84. package/es/typescript-b63f8e83.cjs +1 -0
  85. package/es/use-form-common-props-1b84d8f4.cjs +2 -0
  86. package/es/use-form-common-props-f377e500.js +587 -0
  87. package/es/vnode-7dfd4ed5.js +14 -0
  88. package/es/vnode-7fbc61e1.cjs +1 -0
  89. package/es/{zh-cn-37af467d.cjs → zh-cn-ab9a583d.cjs} +1 -1
  90. package/es/{zh-cn-ef7d7220.js → zh-cn-eb9c2820.js} +2 -2
  91. package/lib/bundle.js +1 -1
  92. package/lib/bundle.umd.cjs +206 -206
  93. package/lib/{index-24f8572c.js → index-d2de454d.js} +33249 -31372
  94. package/lib/{python-2143eee4.js → python-22975586.js} +1 -1
  95. package/lib/style.css +1 -1
  96. package/package.json +1 -1
  97. package/packages/Kline/components/Contextmenu/index.vue +110 -0
  98. package/packages/Kline/components/Tips/index.vue +40 -0
  99. package/packages/Kline/componentsNew/KlineSlide/index.vue +155 -0
  100. package/packages/Kline/componentsNew/KlineSub/index.vue +297 -0
  101. package/packages/Kline/componentsNew/KlineTips/index.vue +66 -0
  102. package/packages/Kline/componentsNew/KlineUtils/index.vue +84 -0
  103. package/packages/Kline/componentsNew/Tips/index.vue +33 -0
  104. package/packages/Kline/formatKlineData.ts +109 -0
  105. package/packages/Kline/images/buy.svg +1 -0
  106. package/packages/Kline/images/pen.png +0 -0
  107. package/packages/Kline/images/sell.svg +1 -0
  108. package/packages/Kline/images/t.svg +1 -0
  109. package/packages/Kline/index.ts +16 -0
  110. package/packages/Kline/index.vue +891 -0
  111. package/packages/Kline/option.ts +539 -0
  112. package/packages/Kline/type.d.ts +219 -0
  113. package/packages/Kline/utils.ts +682 -0
  114. package/packages/KlineBasic/utils.js +1 -1
  115. package/packages/index.ts +2 -0
  116. package/src/pages/Kline/index.vue +12 -0
  117. package/src/router/routes.ts +5 -0
  118. package/es/_initCloneObject-7493ecd5.cjs +0 -1
  119. package/es/config-provider-419ffbf2.js +0 -120
  120. package/es/config-provider-68414290.cjs +0 -3
  121. package/es/dropdown-127a8c0d.cjs +0 -1
  122. package/es/el-button-7b9f5933.js +0 -745
  123. package/es/el-button-c00975e1.cjs +0 -1
  124. package/es/el-checkbox-group-7a313d34.cjs +0 -1
  125. package/es/el-form-item-7867f64d.cjs +0 -12
  126. package/es/el-input-2ff1628c.cjs +0 -1
  127. package/es/el-input-number-d6801a5c.cjs +0 -1
  128. package/es/el-message-ffcf690c.cjs +0 -1
  129. package/es/el-overlay-91784be2.cjs +0 -1
  130. package/es/el-overlay-f0757cc4.js +0 -525
  131. package/es/el-popover-4db657e2.cjs +0 -1
  132. package/es/el-scrollbar-35bac6b3.js +0 -2452
  133. package/es/el-scrollbar-ec09bbd3.cjs +0 -1
  134. package/es/el-select-0785c35a.cjs +0 -1
  135. package/es/el-table-column-2478adf8.cjs +0 -14
  136. package/es/el-tag-13ee17b3.cjs +0 -1
  137. package/es/el-tag-73372c6c.js +0 -359
  138. package/es/index-07b61d12.cjs +0 -1
  139. package/es/index-65b719a4.cjs +0 -1
  140. package/es/index-8b5fbc11.js +0 -66
  141. package/es/index-8c85d7c5.js +0 -858
  142. package/es/index-a49f4743.cjs +0 -2
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "st-comp",
3
3
  "public": true,
4
- "version": "0.0.147",
4
+ "version": "0.0.149",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "dev": "vite",
@@ -0,0 +1,110 @@
1
+ <!-- 右键菜单组件 -->
2
+ <template>
3
+ <div
4
+ ref="contextmenuRef"
5
+ class="contextmenu"
6
+ @contextmenu="openContextMenuContent"
7
+ @mouseleave="closeContextMenuContent"
8
+ >
9
+ <slot />
10
+ <div
11
+ ref="contextmenuContentRef"
12
+ v-if="contextmenuContentStyle.display !== 'none'"
13
+ class="contextmenu-popover"
14
+ :style="contextmenuContentStyle"
15
+ >
16
+ <slot name="popover" />
17
+ </div>
18
+ </div>
19
+ </template>
20
+
21
+ <script setup lang="ts">
22
+ import { ref, nextTick } from 'vue'
23
+
24
+ // 接收传入的自定义事件函数
25
+ const emits = defineEmits(['closeContextMenuCallBack'])
26
+
27
+ // 组件Ref
28
+ const contextmenuRef = ref()
29
+
30
+ // 悬浮菜单Ref
31
+ const contextmenuContentRef = ref()
32
+ // 悬浮菜单样式
33
+ const contextmenuContentStyle = ref({
34
+ display: 'none',
35
+ top: '0px',
36
+ left: '0px',
37
+ })
38
+
39
+ /**
40
+ * @description: 关闭悬浮菜单
41
+ * @todo: 支持触发传入的回调函数
42
+ */
43
+ const closeContextMenuContent = () => {
44
+ contextmenuContentStyle.value.display = 'none'
45
+ emits('closeContextMenuCallBack')
46
+ document.removeEventListener('click', closeContextMenuContent)
47
+ }
48
+
49
+ /**
50
+ * @description: 右键点击
51
+ * @todo: 打开悬浮菜单
52
+ */
53
+ const openContextMenuContent = (el: MouseEvent) => {
54
+ // 1.阻止默认事件 + 冒泡
55
+ el.preventDefault()
56
+ el.stopPropagation()
57
+ /**
58
+ * @todo: 解决在悬浮菜单已经打开时,右键菜单项,重复触发本函数导致菜单位置异常问题
59
+ */
60
+ if (contextmenuContentStyle.value.display === 'block') {
61
+ // 判断鼠标位置是否在悬浮菜单内,如果是,则return,否则继续执行在新的位置打开
62
+ const { offsetX, offsetY } = el // 鼠标
63
+ const { offsetWidth, offsetHeight } = contextmenuContentRef.value
64
+ if (offsetX <= offsetWidth && offsetY <= offsetHeight) {
65
+ return
66
+ }
67
+ }
68
+ contextmenuRef.value.click()
69
+ // 2.初始化展示悬浮菜单位置
70
+ contextmenuContentStyle.value = {
71
+ display: 'block',
72
+ top: `${el.offsetY}px`,
73
+ left: `${el.offsetX}px`,
74
+ }
75
+ // 3.计算悬浮菜单是否超出范围
76
+ nextTick(() => {
77
+ const { bottom, height, right, width } = contextmenuContentRef.value.getBoundingClientRect()
78
+ if (bottom > window.innerHeight) {
79
+ // 高度超出
80
+ contextmenuContentStyle.value = {
81
+ display: 'block',
82
+ top: `${el.offsetY - height}px`,
83
+ left: `${el.offsetX}px`,
84
+ }
85
+ } else if (right > window.innerWidth) {
86
+ // 宽度超出
87
+ contextmenuContentStyle.value = {
88
+ display: 'block',
89
+ top: `${el.offsetY}px`,
90
+ left: `${el.offsetX - width}px`,
91
+ }
92
+ }
93
+ })
94
+ // 4.监听点击事件 -> 调用关闭悬浮菜单事件
95
+ document.addEventListener('click', closeContextMenuContent)
96
+ }
97
+ </script>
98
+
99
+ <style lang="scss" scoped>
100
+ .contextmenu {
101
+ position: relative;
102
+ width: 100%;
103
+ height: 100%;
104
+ &-popover {
105
+ position: absolute;
106
+ z-index: 10;
107
+ display: none;
108
+ }
109
+ }
110
+ </style>
@@ -0,0 +1,40 @@
1
+ <template>
2
+ <div class="st-kline-tips">
3
+ <div class="st-kline-tips-row">
4
+ <div
5
+ v-for="item in data"
6
+ class="st-kline-tips-row-item"
7
+ :style="{ color: item.color }"
8
+ >
9
+ {{ item.label }} {{ item.value }}
10
+ </div>
11
+ </div>
12
+ </div>
13
+ </template>
14
+
15
+ <script setup lang="ts">
16
+ interface dataType {
17
+ label: string
18
+ value: any
19
+ color: string
20
+ }
21
+ const props = defineProps({
22
+ // 提示数据
23
+ data: {
24
+ type: Array as () => dataType[],
25
+ default: () => [],
26
+ },
27
+ })
28
+ </script>
29
+
30
+ <style lang="scss" scoped>
31
+ .st-kline-tips {
32
+ font-size: 12px;
33
+ &-row {
34
+ &-item {
35
+ display: inline-block;
36
+ margin-right: 10px;
37
+ }
38
+ }
39
+ }
40
+ </style>
@@ -0,0 +1,155 @@
1
+ <template>
2
+ <div class="klineSlide" ref="slideChartRef"></div>
3
+ </template>
4
+
5
+ <script setup>
6
+ import { ref, watch, onMounted, onUnmounted } from 'vue'
7
+ import * as echarts from 'echarts'
8
+
9
+ let slideChart
10
+ let resizeRo // dom元素监听事件
11
+ let slideDataZoomTimer = null // 滑动图数据缩放定时器
12
+
13
+ const emit = defineEmits(['change'])
14
+ const props = defineProps({
15
+ data: { type: Array, default: () => [] }, // 时间数据
16
+ })
17
+
18
+ const slideChartRef = ref() // 拖动轴
19
+
20
+ watch(
21
+ () => props.data,
22
+ () => {
23
+ draw()
24
+ },
25
+ { deep: true },
26
+ )
27
+
28
+ onMounted(() => {
29
+ slideChart = echarts.init(slideChartRef.value)
30
+ addEventListener()
31
+ draw()
32
+ // 绑定resize事件
33
+ let isFirst = true
34
+ resizeRo = new ResizeObserver(() => {
35
+ if (isFirst) {
36
+ isFirst = null
37
+ return
38
+ }
39
+ slideChart.resize()
40
+ })
41
+ resizeRo.observe(slideChartRef.value)
42
+ })
43
+
44
+ onUnmounted(() => {
45
+ slideChart.off("datazoom");
46
+ slideChart.dispose()
47
+ resizeRo.disconnect()
48
+ resizeRo = null
49
+ })
50
+
51
+ // 绑定事件
52
+ const addEventListener = () => {
53
+ slideChart.on('datazoom', params => {
54
+ if(!params.dataZoomId) return
55
+ clearTimeout(slideDataZoomTimer)
56
+ slideDataZoomTimer = setTimeout(() => {
57
+ const { data } = props
58
+ const { start, end } = params
59
+ const startIndex = Math.floor(start * data.length / 100)
60
+ const endIndex = end === 100 ? data.length - 1 : Math.floor(end * data.length / 100)
61
+ change(startIndex, endIndex)
62
+ clearTimeout(slideDataZoomTimer)
63
+ }, 100)
64
+ })
65
+ }
66
+
67
+ // 拖动回调
68
+ const change = (startIndex, endIndex) => {
69
+ const data = props.data
70
+ if (data.length === 0) return
71
+ const startTime = data[startIndex][0].split(' ')[0]
72
+ const endTime = data[endIndex][0].split(' ')[0]
73
+ emit('change', {
74
+ startTime: `${startTime} 00:00:00`,
75
+ endTime: `${endTime} 24:00:00`,
76
+ })
77
+ }
78
+
79
+ const draw = () => {
80
+ const { data } = props
81
+ if(data.length === 0) return
82
+ const xAxisData = data.map(item => item[0].split(' ')[0])
83
+ const lineData = data.map(item => item[1])
84
+ slideChart.setOption({
85
+ grid: {
86
+ height: 0,
87
+ left: '80px',
88
+ right: '80px',
89
+ },
90
+ xAxis: {
91
+ type: 'category',
92
+ data: xAxisData,
93
+ show: false,
94
+ },
95
+ yAxis: {
96
+ type: 'value'
97
+ },
98
+ series: [
99
+ {
100
+ data: lineData,
101
+ type: 'line'
102
+ }
103
+ ]
104
+ }, true)
105
+ }
106
+
107
+ defineExpose({
108
+ resetSlide: (startTime, endTime, maxValueSpan) => {
109
+ let slideStartIndex = -1
110
+ let slideEndIndex = -1
111
+ props.data.forEach((item, index) => {
112
+ if (slideStartIndex === -1 && item[0] === startTime) {
113
+ slideStartIndex = index
114
+ } else if (slideStartIndex === -1 && new Date(item[0]) > new Date(startTime)) {
115
+ slideStartIndex = index - 1
116
+ }
117
+ if (slideEndIndex === -1 && item[0] === endTime) {
118
+ slideEndIndex = index
119
+ } else if (slideEndIndex === -1 && new Date(item[0]) > new Date(endTime)) {
120
+ slideEndIndex = index
121
+ }
122
+ })
123
+ slideEndIndex = slideEndIndex === -1 ? props.data.length - 1 : slideEndIndex
124
+ slideChart.setOption({
125
+ dataZoom: [
126
+ {
127
+ show: true,
128
+ startValue: slideStartIndex,
129
+ endValue: slideEndIndex,
130
+ maxValueSpan,
131
+ textStyle: {
132
+ color: '#ccc',
133
+ }
134
+ },
135
+ {
136
+ type: 'inside',
137
+ startValue: slideStartIndex,
138
+ endValue: slideEndIndex,
139
+ maxValueSpan,
140
+ }
141
+ ],
142
+ })
143
+ }, // 重置
144
+ resize: () => {
145
+ slideChart?.resize()
146
+ }
147
+ })
148
+ </script>
149
+
150
+ <style lang="scss" scoped>
151
+ .klineSlide {
152
+ width: 100%;
153
+ height: 50px;
154
+ }
155
+ </style>
@@ -0,0 +1,297 @@
1
+ <template>
2
+ <div class="klineSub">
3
+ <div class="klineSub-tips">
4
+ <div
5
+ class="klineSub-tips-select"
6
+ v-if="subIndicatorTips.length"
7
+ >
8
+ <el-select
9
+ v-model="subIndicator"
10
+ size="small"
11
+ popper-class="element-dark"
12
+ class="element-dark subIndicator"
13
+ >
14
+ <el-option
15
+ v-for="item in subIndicatorList"
16
+ :key="item.value"
17
+ :label="item.label"
18
+ :value="item.value"
19
+ />
20
+ </el-select>
21
+ </div>
22
+ <Tips :data="subIndicatorTips" />
23
+ </div>
24
+ <div
25
+ class="klineSub-chart"
26
+ ref="subChartRef"
27
+ ></div>
28
+ </div>
29
+ </template>
30
+
31
+ <script setup>
32
+ import { ref, onMounted, onUnmounted, nextTick, computed } from "vue";
33
+ import * as echarts from "echarts";
34
+ import Tips from "../Tips/index.vue";
35
+ import { stMath } from "st-func";
36
+ const { round } = stMath;
37
+
38
+ let subChart;
39
+ let resizeRo; // dom元素监听事件
40
+
41
+ const emit = defineEmits(["update:modelValue"]);
42
+ const props = defineProps({
43
+ data: { type: Object, require: true },
44
+ activeIndex: { type: [Number, String], require: true },
45
+ modelValue: { type: String, required: true }, // 副图指标
46
+ subIndicatorList: { type: Array, required: true }, // 副图指标列表
47
+ });
48
+
49
+ const subChartRef = ref(); // 拖动轴
50
+ const subIndicator = computed({
51
+ get() {
52
+ return props.modelValue;
53
+ },
54
+ set(val) {
55
+ emit("update:modelValue", val);
56
+ },
57
+ });
58
+
59
+ const subIndicatorTips = computed(() => {
60
+ const { data, activeIndex } = props;
61
+ return data?.subIndicator?.map((item) => ({ label: item.key, color: item.color, value: item.data[activeIndex] || "-" })) || [];
62
+ });
63
+ onMounted(() => {
64
+ subChart = echarts.init(subChartRef.value);
65
+ // 绑定resize事件
66
+ let isFirst = true;
67
+ resizeRo = new ResizeObserver(() => {
68
+ if (isFirst) {
69
+ isFirst = null;
70
+ return;
71
+ }
72
+ subChart.resize();
73
+ });
74
+ resizeRo.observe(subChartRef.value);
75
+ });
76
+
77
+ onUnmounted(() => {
78
+ subChart.dispose();
79
+ resizeRo.disconnect();
80
+ resizeRo = null;
81
+ });
82
+
83
+ // 获取副图颜色
84
+ const getSubBarStyle = (data, index) => {
85
+ const itemData = data[index];
86
+ const preItemData = index === 0 ? data[index] : data[index - 1];
87
+ if (itemData[0] === itemData[1]) {
88
+ return itemData[0] >= preItemData[1]
89
+ ? {
90
+ color: "transparent",
91
+ borderColor: "#FF0000",
92
+ }
93
+ : {
94
+ color: "#00FFFF",
95
+ };
96
+ } else {
97
+ return itemData[1] > itemData[0]
98
+ ? {
99
+ color: "transparent",
100
+ borderColor: "#FF0000",
101
+ }
102
+ : {
103
+ color: "#00FFFF",
104
+ };
105
+ }
106
+ };
107
+
108
+ defineExpose({
109
+ connect: (chart) => {
110
+ echarts.connect([chart, subChart]);
111
+ }, // 联动
112
+ draw: (drawConfig, config) => {
113
+ nextTick(() => {
114
+ const { startValue, endValue, maxValueSpan } = drawConfig;
115
+ const { leftYAxisRange, rightYAxisRange } = props.data.subIndicator[0];
116
+ const series = props.data.subIndicator.map((item) => {
117
+ if (item.series === "bar") {
118
+ return {
119
+ name: "subMain",
120
+ xAxisIndex: 0,
121
+ yAxisIndex: 1,
122
+ type: "bar",
123
+ silent: true,
124
+ symbol: "none",
125
+ data: item.data.map((val, index) => {
126
+ if (item.seriesColor === "kline") {
127
+ return {
128
+ value: val,
129
+ itemStyle: getSubBarStyle(props.data.data, index),
130
+ };
131
+ } else if (item.seriesColor === "value") {
132
+ return {
133
+ value: val,
134
+ itemStyle: {
135
+ color: val >= 0 ? "#FF0000" : "#00FFFF",
136
+ },
137
+ };
138
+ } else {
139
+ return {
140
+ value: val,
141
+ itemStyle: {
142
+ color: item.seriesColor,
143
+ },
144
+ };
145
+ }
146
+ }),
147
+ };
148
+ } else if (item.series === "line") {
149
+ return {
150
+ xAxisIndex: 0,
151
+ yAxisIndex: item.yAxis === "right" ? 2 : 1,
152
+ name: item.key,
153
+ type: "line",
154
+ silent: true,
155
+ symbol: "none",
156
+ data: item.data,
157
+ lineStyle: {
158
+ width: 1,
159
+ },
160
+ itemStyle: {
161
+ color: item.color,
162
+ },
163
+ };
164
+ }
165
+ });
166
+
167
+ subChart.setOption(
168
+ {
169
+ animation: false,
170
+ grid: {
171
+ left: `${config.gridLeft}px`,
172
+ top: "10px",
173
+ right: `${config.gridRight}px`,
174
+ bottom: "20px",
175
+ },
176
+ dataZoom: [
177
+ {
178
+ type: "inside",
179
+ startValue,
180
+ endValue,
181
+ maxValueSpan,
182
+ },
183
+ ],
184
+ tooltip: {
185
+ trigger: "axis",
186
+ appendToBody: true,
187
+ confine: true,
188
+ axisPointer: {
189
+ type: "cross",
190
+ label: {
191
+ rich: {},
192
+ formatter: (data) => {
193
+ const { axisDimension, value } = data;
194
+ if (axisDimension === "x") {
195
+ return value;
196
+ } else if (data.axisIndex === 1) {
197
+ return String(round(value));
198
+ }
199
+ },
200
+ },
201
+ },
202
+ formatter: () => "",
203
+ },
204
+ xAxis: {
205
+ type: "category",
206
+ data: props.data.time,
207
+ axisLine: {
208
+ show: true,
209
+ },
210
+ splitLine: {
211
+ show: false,
212
+ },
213
+ axisLabel: {
214
+ show: true,
215
+ formatter: (data) => data,
216
+ },
217
+ },
218
+ yAxis: [
219
+ {
220
+ position: "right",
221
+ },
222
+ {
223
+ position: "left",
224
+ min: leftYAxisRange === "cover" ? (value) => value.min : null,
225
+ max: leftYAxisRange === "cover" ? (value) => value.max : null,
226
+ splitNumber: 1,
227
+ axisLine: {
228
+ show: true,
229
+ },
230
+ splitLine: {
231
+ show: true,
232
+ lineStyle: {
233
+ type: "dotted",
234
+ color: "#333",
235
+ },
236
+ },
237
+ },
238
+ {
239
+ position: "right",
240
+ min: rightYAxisRange === "cover" ? (value) => value.min : null,
241
+ max: rightYAxisRange === "cover" ? (value) => value.max : null,
242
+ splitNumber: 1,
243
+ axisLine: {
244
+ show: false,
245
+ },
246
+ splitLine: {
247
+ show: false,
248
+ },
249
+ axisLabel: {
250
+ show: false,
251
+ },
252
+ },
253
+ ],
254
+ series,
255
+ },
256
+ true
257
+ );
258
+ });
259
+ }, // 重置
260
+ });
261
+ </script>
262
+
263
+ <style lang="scss" scoped>
264
+ .klineSub {
265
+ width: 100%;
266
+ height: 100%;
267
+ &-tips {
268
+ height: 16px;
269
+ padding-left: 6px;
270
+ display: flex;
271
+ align-items: start;
272
+ &-select {
273
+ margin-right: 6px;
274
+ line-height: 12px;
275
+ :deep(.el-select__selection) {
276
+ display: none;
277
+ }
278
+ :deep(.el-select__wrapper) {
279
+ padding: 0;
280
+ width: 12px;
281
+ height: 12px;
282
+ min-height: 12px;
283
+ border-radius: 50%;
284
+ background-color: #ccc;
285
+ }
286
+ :deep(.el-select__icon) {
287
+ color: black;
288
+ font-size: 12px;
289
+ }
290
+ }
291
+ }
292
+ &-chart {
293
+ width: 100%;
294
+ height: calc(100% - 26px);
295
+ }
296
+ }
297
+ </style>
@@ -0,0 +1,66 @@
1
+ <template>
2
+ <div class="kline-tips">
3
+ <Tips :data="mainTips" />
4
+ <Tips :data="mainIndicatorTips" />
5
+ </div>
6
+ </template>
7
+
8
+ <script setup>
9
+ import { computed } from "vue";
10
+ import Tips from "../Tips/index.vue";
11
+ import { stMath } from "st-func";
12
+ const { round, formatValue } = stMath;
13
+
14
+ const props = defineProps({
15
+ // 提示数据
16
+ data: {
17
+ type: Object,
18
+ require: true,
19
+ },
20
+ activeIndex: {
21
+ type: [Number, String],
22
+ require: true,
23
+ },
24
+ });
25
+
26
+ const mainTips = computed(() => {
27
+ const { data, activeIndex } = props;
28
+ if (data.data && data.data[activeIndex]) {
29
+ const itemData = data.data[activeIndex];
30
+ const result = [
31
+ { label: "开", value: round(itemData[0]) },
32
+ { label: "高", value: round(itemData[3]) },
33
+ { label: "低", value: round(itemData[2]) },
34
+ { label: "收", value: round(itemData[1]) },
35
+ ];
36
+ // 特殊: 交易总额
37
+ itemData[4] !== null && result.push({ label: "额", value: formatValue(itemData[4]) });
38
+ // 特殊: 涨跌幅 公式:收盘价 - 昨收 / (昨收绝对值)
39
+ let diffColor;
40
+ if (itemData[6] > 0) {
41
+ diffColor = "red";
42
+ } else if (itemData[6] < 0) {
43
+ diffColor = "green";
44
+ }
45
+ result.push({ label: "涨跌", value: `${round(itemData[6])}%`, color: diffColor });
46
+ return result;
47
+ }
48
+ return [];
49
+ });
50
+
51
+ const mainIndicatorTips = computed(() => {
52
+ const { data, activeIndex } = props;
53
+ return (
54
+ data?.mainIndicator?.map((item) => {
55
+ return { label: item.key, value: round(item.data[activeIndex]), color: item.color };
56
+ }) || []
57
+ );
58
+ });
59
+ </script>
60
+
61
+ <style lang="scss" scoped>
62
+ .kline-tips {
63
+ padding-left: 3px;
64
+ width: 100%;
65
+ }
66
+ </style>