st-comp 0.0.122 → 0.0.124

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 (92) hide show
  1. package/es/ChartLayout.js +2 -2
  2. package/es/Dialog.cjs +1 -1
  3. package/es/Dialog.js +14 -13
  4. package/es/FactorWarning.cjs +1 -1
  5. package/es/FactorWarning.js +26 -25
  6. package/es/Kline.cjs +1 -1
  7. package/es/Kline.js +849 -1605
  8. package/es/KlineBasic.cjs +6 -0
  9. package/es/KlineBasic.js +2888 -0
  10. package/es/KlineNew.cjs +1 -1
  11. package/es/KlineNew.js +12 -12
  12. package/es/Pagination.cjs +1 -1
  13. package/es/Pagination.js +18 -17
  14. package/es/Pie.cjs +1 -1
  15. package/es/Pie.js +1 -1
  16. package/es/Table.cjs +1 -1
  17. package/es/Table.js +18 -17
  18. package/es/User.cjs +1 -1
  19. package/es/User.js +75 -74
  20. package/es/VarietySearch.cjs +1 -1
  21. package/es/VarietySearch.js +903 -1253
  22. package/es/VirtualTable.cjs +1 -1
  23. package/es/VirtualTable.js +13 -12
  24. package/es/{base-f7877059.js → base-a8f938bd.js} +6 -6
  25. package/es/{castArray-18f43497.js → castArray-5c01dae1.js} +1 -1
  26. package/es/config-provider-4954003d.cjs +1 -0
  27. package/es/{config-provider-6479d795.js → config-provider-d3edea8a.js} +3 -3
  28. package/es/{debounce-2336e546.js → debounce-edbff018.js} +10 -10
  29. package/es/{dropdown-46daf582.js → dropdown-7e381525.js} +4 -4
  30. package/es/el-button-c7b375c4.cjs +1 -0
  31. package/es/{el-button-802f579a.js → el-button-ce99c64e.js} +6 -5
  32. package/es/{el-empty-3c5ec277.js → el-empty-ed6c115b.js} +1 -1
  33. package/es/{el-form-item-84099d46.js → el-form-item-b686a8bb.js} +9 -9
  34. package/es/{el-form-item-c39f717e.cjs → el-form-item-ff0d8d07.cjs} +1 -1
  35. package/es/{el-input-fac5b401.js → el-input-21e079e4.js} +5 -5
  36. package/es/el-menu-item-9369a2ad.js +771 -0
  37. package/es/el-menu-item-dc904a35.cjs +1 -0
  38. package/es/el-message-e97bdea1.cjs +1 -0
  39. package/es/el-message-fd827012.js +374 -0
  40. package/es/el-overlay-7b90d61c.cjs +1 -0
  41. package/es/{el-overlay-69e9ae49.js → el-overlay-9245ec1e.js} +77 -76
  42. package/es/{el-popover-694ded47.js → el-popover-6f075cee.js} +4 -4
  43. package/es/{el-popover-8735b1fa.cjs → el-popover-6f48d00b.cjs} +1 -1
  44. package/es/{el-popper-6126b1f6.js → el-popper-8dca8dd4.js} +4 -4
  45. package/es/{el-scrollbar-e0493906.js → el-scrollbar-906103f8.js} +1 -1
  46. package/es/{el-select-513126a5.js → el-select-6d6093eb.js} +10 -10
  47. package/es/el-table-column-26e7f13f.cjs +14 -0
  48. package/es/{el-table-column-3c920bdd.js → el-table-column-3f388c44.js} +15 -14
  49. package/es/{el-tag-5becabc9.js → el-tag-cdf0019e.js} +19 -19
  50. package/es/{index-7e40be25.js → index-53bce290.js} +3 -3
  51. package/es/index-669a0983.js +14 -0
  52. package/es/{index-048dca7e.js → index-6ced00c4.js} +1 -1
  53. package/es/index-c4649a37.cjs +3 -0
  54. package/es/{index-dc273ea2.cjs → index-d1b7c61e.cjs} +39 -39
  55. package/es/{index-57f8f7b9.js → index-f8e448bc.js} +5893 -5856
  56. package/es/{raf-07da7cdf.js → raf-b584bce8.js} +1 -1
  57. package/es/{refs-1b1fe6ca.js → refs-e1675167.js} +1 -1
  58. package/es/{scroll-3b521d81.js → scroll-25ec9230.js} +1 -1
  59. package/es/style.css +1 -1
  60. package/es/{use-form-common-props-f3a520d0.js → use-form-common-props-f7d2e83c.js} +18 -18
  61. package/es/use-global-config-8429db7d.js +72 -0
  62. package/es/{index-8a0b1c53.cjs → use-global-config-ac2dad80.cjs} +1 -3
  63. package/es/{vnode-25d7c2f5.js → vnode-699e61cb.js} +1 -1
  64. package/es/{zh-cn-74781bbd.js → zh-cn-61ca7f91.js} +2 -2
  65. package/es/{zh-cn-ab9a583d.cjs → zh-cn-a20960b5.cjs} +1 -1
  66. package/lib/bundle.js +1 -1
  67. package/lib/bundle.umd.cjs +213 -208
  68. package/lib/{index-62c62885.js → index-741ecbcc.js} +38391 -35484
  69. package/lib/{python-6cdad7a6.js → python-5a672b35.js} +1 -1
  70. package/lib/style.css +1 -1
  71. package/package.json +2 -2
  72. package/packages/KlineBasic/api.js +60 -0
  73. package/packages/KlineBasic/components/Contextmenu/index.vue +105 -0
  74. package/packages/KlineBasic/components/KlineSub/index.vue +297 -0
  75. package/packages/KlineBasic/components/KlineTips/index.vue +66 -0
  76. package/packages/KlineBasic/components/Tips/index.vue +33 -0
  77. package/packages/KlineBasic/index.ts +8 -0
  78. package/packages/KlineBasic/index.vue +565 -0
  79. package/packages/KlineBasic/utils.js +86 -0
  80. package/packages/VarietySearch/components/FactorScreen/index.vue +7 -7
  81. package/packages/index.ts +2 -0
  82. package/src/main.ts +2 -0
  83. package/src/pages/KlineBasic/api.js +45 -0
  84. package/src/pages/KlineBasic/index.vue +74 -0
  85. package/src/pages/KlineBasic/indicator.js +114 -0
  86. package/src/pages/VarietySearch/index.vue +3 -2
  87. package/src/router/routes.ts +5 -0
  88. package/es/config-provider-7cdfca4d.cjs +0 -1
  89. package/es/el-button-196807af.cjs +0 -1
  90. package/es/el-overlay-891dcc40.cjs +0 -1
  91. package/es/el-table-column-dd8b62aa.cjs +0 -14
  92. package/es/index-35117549.js +0 -81
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "st-comp",
3
3
  "public": true,
4
- "version": "0.0.122",
4
+ "version": "0.0.124",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "dev": "vite",
@@ -20,7 +20,7 @@
20
20
  "element-plus": "^2.9.4",
21
21
  "monaco-editor": "0.47.0",
22
22
  "pinia": "^2.1.6",
23
- "st-func": "^0.0.58",
23
+ "st-func": "^0.0.59",
24
24
  "talib.js": "^0.1.0",
25
25
  "vue-router": "^4.2.5"
26
26
  },
@@ -0,0 +1,60 @@
1
+ import axios from "axios";
2
+ import { getToken, getUserData } from 'st-func'
3
+
4
+ const token = getToken();
5
+ const host = "http://127.0.0.1:7001";
6
+
7
+ // 获取K线数据以及基础数据
8
+ export const getKlineBasic = async (data) => {
9
+ const res = await axios({
10
+ method: "post",
11
+ headers: { token },
12
+ url: `${host}/middleLayer/kline/getKlineBasic`,
13
+ data: { ...data, userId: getUserData('id')},
14
+ });
15
+ return res.data;
16
+ }
17
+
18
+ // 获取K线数据
19
+ export const getKline = async (data) => {
20
+ const res = await axios({
21
+ method: "post",
22
+ headers: { token },
23
+ url: `${host}/middleLayer/kline/getKline`,
24
+ data,
25
+ });
26
+ return res.data;
27
+ }
28
+
29
+ // 画线预警
30
+ export const addWarningLine = async (data) => {
31
+ const res = await axios({
32
+ method: "post",
33
+ headers: { token },
34
+ url: `${host}/middleLayer/post/alarm/deliversign/addAlarmPrice`,
35
+ data: { ...data, userId: getUserData('id')},
36
+ });
37
+ return res.data;
38
+ };
39
+
40
+ // 获取画线预警列表
41
+ export const getWarningLine = async (data) => {
42
+ const res = await axios({
43
+ method: "post",
44
+ headers: { token },
45
+ url: `${host}/middleLayer/post/alarm/deliversign/findAlarmPriceByUserId`,
46
+ data: { ...data, userId: getUserData('id')},
47
+ });
48
+ return res.data;
49
+ };
50
+
51
+ // 更新画线预警
52
+ export const updateWarningLine = async (data) => {
53
+ const res = await axios({
54
+ method: "post",
55
+ headers: { token },
56
+ url: `${host}/middleLayer/post/alarm/deliversign/updateAlarmPrice`,
57
+ data: { ...data, userId: getUserData('id')},
58
+ });
59
+ return res.data;
60
+ };
@@ -0,0 +1,105 @@
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 parentDomInfo = contextmenuRef.value.getBoundingClientRect();
78
+ const menuDomInfo = contextmenuContentRef.value.getBoundingClientRect();
79
+ // 宽度超出
80
+ if (menuDomInfo.left + menuDomInfo.width >= parentDomInfo.right) {
81
+ contextmenuContentStyle.value.left = `${el.offsetX - menuDomInfo.width}px`;
82
+ }
83
+ // 高度超出
84
+ if (menuDomInfo.top + menuDomInfo.height >= parentDomInfo.bottom) {
85
+ console.log("高度超出");
86
+ contextmenuContentStyle.value.top = `${el.offsetY - menuDomInfo.height}px`;
87
+ }
88
+ });
89
+ // 4.监听点击事件 -> 调用关闭悬浮菜单事件
90
+ document.addEventListener("click", closeContextMenuContent);
91
+ };
92
+ </script>
93
+
94
+ <style lang="scss" scoped>
95
+ .contextmenu {
96
+ position: relative;
97
+ width: 100%;
98
+ height: 100%;
99
+ &-popover {
100
+ position: absolute;
101
+ z-index: 10;
102
+ display: none;
103
+ }
104
+ }
105
+ </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>
@@ -0,0 +1,33 @@
1
+ <template>
2
+ <div class="kline-tips">
3
+ <div
4
+ v-for="(item, index) in data"
5
+ :key="index"
6
+ class="kline-tips-item"
7
+ :style="{ color: item.color }"
8
+ >{{ item.label }} {{ item.value }}</div>
9
+ </div>
10
+ </template>
11
+
12
+ <script setup lang="ts">
13
+ defineProps({
14
+ // 提示数据
15
+ data: {
16
+ type: Array,
17
+ require: true,
18
+ },
19
+ })
20
+ </script>
21
+
22
+ <style lang="scss" scoped>
23
+ .kline-tips {
24
+ width: 100%;
25
+ color: #fff;
26
+ font-size: 12px;
27
+ line-height: 1.5;
28
+ &-item {
29
+ display: inline-block;
30
+ margin-right: 10px;
31
+ }
32
+ }
33
+ </style>
@@ -0,0 +1,8 @@
1
+ import { App } from "vue";
2
+ import StKlineBasic from "./index.vue";
3
+
4
+ export default {
5
+ install(app: App) {
6
+ app.component("st-klineBasic", StKlineBasic);
7
+ },
8
+ }