echartLine.vue 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. <template>
  2. <div class="echartLine">
  3. <div class="line" ref="line"></div>
  4. </div>
  5. </template>
  6. <script lang="ts" setup>
  7. import { defineProps, ref, nextTick, reactive, watch } from 'vue';
  8. import * as echarts from 'echarts';
  9. let props = defineProps({
  10. echartDataGq: {
  11. type: Object,
  12. },
  13. maxY: {
  14. type: Number,
  15. },
  16. echartDw: {
  17. type: String,
  18. },
  19. echartDw1: {
  20. type: String,
  21. },
  22. gridV: {
  23. type: Object,
  24. default: () => {
  25. return {
  26. top: '15%',
  27. left: '2%',
  28. bottom: '6%',
  29. right: '2%',
  30. containLabel: true,
  31. };
  32. },
  33. },
  34. });
  35. //获取dom元素节点
  36. let line = ref<any>();
  37. let echartDataGqs = reactive({});
  38. watch(
  39. () => props.echartDataGq,
  40. (data) => {
  41. echartDataGqs = Object.assign({}, data);
  42. getOption();
  43. },
  44. { immediate: true, deep: true }
  45. );
  46. function getOption() {
  47. nextTick(() => {
  48. let myChart = echarts.init(line.value);
  49. let option = {
  50. grid: props.gridV,
  51. tooltip: {
  52. trigger: 'item',
  53. backgroundColor: 'rgba(0, 0, 0, .6)',
  54. textStyle: {
  55. color: '#fff',
  56. fontSize: 12,
  57. },
  58. },
  59. legend: {
  60. align: 'left',
  61. right: 'center',
  62. top: '0%',
  63. type: 'plain',
  64. textStyle: {
  65. color: '#7ec7ff',
  66. fontSize: 14,
  67. },
  68. // icon:'rect',
  69. itemGap: 25,
  70. itemWidth: 18,
  71. icon: 'path://M0 2a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v0a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2z',
  72. data: [
  73. {
  74. name: echartDataGqs.maxData ? echartDataGqs.maxData.lengedData : '',
  75. },
  76. {
  77. name: echartDataGqs.minData ? echartDataGqs.minData.lengedData : '',
  78. },
  79. {
  80. name: echartDataGqs.aveValue ? echartDataGqs.aveValue.lengedData : '',
  81. },
  82. ],
  83. },
  84. xAxis: [
  85. {
  86. type: 'category',
  87. boundaryGap: false,
  88. axisLabel: {
  89. // formatter: '{value}',
  90. fontSize: 14,
  91. margin: 20,
  92. textStyle: {
  93. color: '#b3b8cc',
  94. },
  95. formatter: function (params) {
  96. let newParamsName = ref(''); // 最终拼接成的字符串
  97. let paramsNameNumber = ref(params.length); // 实际标签的个数
  98. let provideNumber = ref(10); // 每行能显示的字的个数
  99. let rowNumber = Math.ceil(paramsNameNumber.value / provideNumber.value); // 换行的话,需要显示几行,向上取整
  100. /**
  101. * 判断标签的个数是否大于规定的个数, 如果大于,则进行换行处理 如果不大于,即等于或小于,就返回原标签
  102. */
  103. // 条件等同于rowNumber>1
  104. if (paramsNameNumber.value > provideNumber.value) {
  105. /** 循环每一行,p表示行 */
  106. for (var p = 0; p < rowNumber; p++) {
  107. var tempStr = ''; // 表示每一次截取的字符串
  108. var start = p * provideNumber.value; // 开始截取的位置
  109. var end = start + provideNumber.value; // 结束截取的位置
  110. // 此处特殊处理最后一行的索引值
  111. if (p == rowNumber - 1) {
  112. // 最后一次不换行
  113. tempStr = params.substring(start, paramsNameNumber.value);
  114. } else {
  115. // 每一次拼接字符串并换行
  116. tempStr = params.substring(start, end) + '\n';
  117. }
  118. newParamsName.value += tempStr; // 最终拼成的字符串
  119. }
  120. } else {
  121. // 将旧标签的值赋给新标签
  122. newParamsName.value = params;
  123. }
  124. //将最终的字符串返回
  125. return newParamsName.value;
  126. },
  127. },
  128. axisLine: {
  129. lineStyle: {
  130. // color: 'rgba(14, 53, 95)',
  131. color: '#244a94',
  132. },
  133. },
  134. splitLine: {
  135. show: false,
  136. // lineStyle: {
  137. // color: '#243753',
  138. // },
  139. },
  140. axisTick: {
  141. show: false,
  142. },
  143. data: echartDataGqs.xData ? echartDataGqs.xData : [],
  144. },
  145. ],
  146. yAxis: [
  147. {
  148. boundaryGap: false,
  149. type: 'value',
  150. max: props.maxY,
  151. axisLabel: {
  152. textStyle: {
  153. color: '#b3b8cc',
  154. },
  155. formatter: '{value}',
  156. },
  157. name: props.echartDw,
  158. nameTextStyle: {
  159. color: '#fff',
  160. fontSize: 12,
  161. lineHeight: 10,
  162. },
  163. splitLine: {
  164. lineStyle: {
  165. // color: 'rgba(14, 53, 95)',
  166. color: '#0d2973',
  167. },
  168. },
  169. axisLine: {
  170. show: true,
  171. lineStyle: {
  172. // color: 'rgba(14, 53, 95)',
  173. color: '#244a94',
  174. },
  175. },
  176. axisTick: {
  177. show: false,
  178. },
  179. },
  180. {
  181. boundaryGap: false,
  182. type: 'value',
  183. max: props.maxY,
  184. axisLabel: {
  185. textStyle: {
  186. color: '#b3b8cc',
  187. },
  188. formatter: '{value}',
  189. },
  190. name: props.echartDw1,
  191. nameTextStyle: {
  192. color: '#fff',
  193. fontSize: 12,
  194. lineHeight: 10,
  195. },
  196. splitLine: {
  197. lineStyle: {
  198. color: 'rgba(14, 53, 95)',
  199. },
  200. },
  201. axisLine: {
  202. show: true,
  203. lineStyle: {
  204. color: 'rgba(14, 53, 95)',
  205. },
  206. },
  207. axisTick: {
  208. show: false,
  209. },
  210. },
  211. ],
  212. series: [
  213. {
  214. name: echartDataGqs.maxData ? echartDataGqs.maxData.lengedData : '',
  215. type: 'line',
  216. smooth: true,
  217. showSymbol: true,
  218. symbolSize: 8,
  219. zlevel: 3,
  220. itemStyle: {
  221. color: '#19a3df',
  222. borderColor: '#a3c8d8',
  223. },
  224. lineStyle: {
  225. normal: {
  226. width: 2,
  227. color: '#19a3df',
  228. },
  229. },
  230. data: echartDataGqs.maxData ? echartDataGqs.maxData.data : [],
  231. },
  232. {
  233. name: echartDataGqs.minData ? echartDataGqs.minData.lengedData : '',
  234. type: 'line',
  235. smooth: true,
  236. showSymbol: true,
  237. symbolSize: 8,
  238. zlevel: 3,
  239. itemStyle: {
  240. color: '#4fffad',
  241. borderColor: '#a3c8d8',
  242. },
  243. lineStyle: {
  244. normal: {
  245. width: 2,
  246. color: '#4fffad',
  247. },
  248. },
  249. data: echartDataGqs.minData ? echartDataGqs.minData.data : [],
  250. },
  251. {
  252. name: echartDataGqs.aveValue ? echartDataGqs.aveValue.lengedData : '',
  253. type: 'line',
  254. smooth: true,
  255. showSymbol: true,
  256. symbolSize: 8,
  257. zlevel: 3,
  258. itemStyle: {
  259. color: '#fc8452',
  260. borderColor: '#a3c8d8',
  261. },
  262. lineStyle: {
  263. normal: {
  264. width: 2,
  265. color: '#fc8452',
  266. },
  267. },
  268. data: echartDataGqs.aveValue ? echartDataGqs.aveValue.data : [],
  269. },
  270. ],
  271. };
  272. myChart.setOption(option);
  273. window.onresize = function () {
  274. myChart.resize();
  275. };
  276. });
  277. }
  278. </script>
  279. <style scoped lang="less">
  280. .echartLine {
  281. width: 100%;
  282. height: 100%;
  283. .line {
  284. width: 100%;
  285. height: 100%;
  286. }
  287. }
  288. </style>