echartLine.vue 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  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: 'axis',
  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: '-20',
  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.avgData ? echartDataGqs.avgData.lengedData : '',
  75. },
  76. {
  77. name: echartDataGqs.maxData ? echartDataGqs.maxData.lengedData : '',
  78. },
  79. {
  80. name: echartDataGqs.minData ? echartDataGqs.minData.lengedData : '',
  81. },
  82. {
  83. name: echartDataGqs.curData ? echartDataGqs.curData.lengedData : '',
  84. },
  85. ],
  86. },
  87. xAxis: [
  88. {
  89. type: 'category',
  90. boundaryGap: false,
  91. axisLabel: {
  92. // formatter: '{value}',
  93. fontSize: 14,
  94. margin: 20,
  95. textStyle: {
  96. color: '#b3b8cc',
  97. },
  98. formatter: function (params) {
  99. let newParamsName = ref(''); // 最终拼接成的字符串
  100. let paramsNameNumber = ref(params.length); // 实际标签的个数
  101. let provideNumber = ref(10); // 每行能显示的字的个数
  102. let rowNumber = Math.ceil(paramsNameNumber.value / provideNumber.value); // 换行的话,需要显示几行,向上取整
  103. /**
  104. * 判断标签的个数是否大于规定的个数, 如果大于,则进行换行处理 如果不大于,即等于或小于,就返回原标签
  105. */
  106. // 条件等同于rowNumber>1
  107. if (paramsNameNumber.value > provideNumber.value) {
  108. /** 循环每一行,p表示行 */
  109. for (var p = 0; p < rowNumber; p++) {
  110. var tempStr = ''; // 表示每一次截取的字符串
  111. var start = p * provideNumber.value; // 开始截取的位置
  112. var end = start + provideNumber.value; // 结束截取的位置
  113. // 此处特殊处理最后一行的索引值
  114. if (p == rowNumber - 1) {
  115. // 最后一次不换行
  116. tempStr = params.substring(start, paramsNameNumber.value);
  117. } else {
  118. // 每一次拼接字符串并换行
  119. tempStr = params.substring(start, end) + '\n';
  120. }
  121. newParamsName.value += tempStr; // 最终拼成的字符串
  122. }
  123. } else {
  124. // 将旧标签的值赋给新标签
  125. newParamsName.value = params;
  126. }
  127. //将最终的字符串返回
  128. return newParamsName.value;
  129. },
  130. },
  131. axisLine: {
  132. lineStyle: {
  133. // color: 'rgba(14, 53, 95)',
  134. color: '#244a94',
  135. },
  136. },
  137. splitLine: {
  138. show: false,
  139. // lineStyle: {
  140. // color: '#243753',
  141. // },
  142. },
  143. axisTick: {
  144. show: false,
  145. },
  146. data: echartDataGqs.xData ? echartDataGqs.xData : [],
  147. },
  148. ],
  149. yAxis: [
  150. {
  151. boundaryGap: false,
  152. type: 'value',
  153. max: props.maxY,
  154. axisLabel: {
  155. textStyle: {
  156. color: '#b3b8cc',
  157. },
  158. formatter: '{value}',
  159. },
  160. name: props.echartDw,
  161. nameTextStyle: {
  162. color: '#fff',
  163. fontSize: 12,
  164. lineHeight: 10,
  165. },
  166. splitLine: {
  167. lineStyle: {
  168. // color: 'rgba(14, 53, 95)',
  169. color: '#0d2973',
  170. },
  171. },
  172. axisLine: {
  173. show: true,
  174. lineStyle: {
  175. // color: 'rgba(14, 53, 95)',
  176. color: '#244a94',
  177. },
  178. },
  179. axisTick: {
  180. show: false,
  181. },
  182. },
  183. {
  184. boundaryGap: false,
  185. type: 'value',
  186. max: props.maxY,
  187. axisLabel: {
  188. textStyle: {
  189. color: '#b3b8cc',
  190. },
  191. formatter: '{value}',
  192. },
  193. name: props.echartDw1,
  194. nameTextStyle: {
  195. color: '#fff',
  196. fontSize: 12,
  197. lineHeight: 10,
  198. },
  199. splitLine: {
  200. lineStyle: {
  201. color: 'rgba(14, 53, 95)',
  202. },
  203. },
  204. axisLine: {
  205. show: true,
  206. lineStyle: {
  207. color: 'rgba(14, 53, 95)',
  208. },
  209. },
  210. axisTick: {
  211. show: false,
  212. },
  213. },
  214. ],
  215. series: [
  216. {
  217. name: echartDataGqs.maxData ? echartDataGqs.maxData.lengedData : '',
  218. type: 'line',
  219. smooth: true,
  220. symbol: 'none',
  221. zlevel: 3,
  222. itemStyle: {
  223. color: '#19a3df',
  224. borderColor: '#a3c8d8',
  225. },
  226. lineStyle: {
  227. normal: {
  228. width: 2,
  229. color: '#19a3df',
  230. },
  231. },
  232. data: echartDataGqs.maxData ? echartDataGqs.maxData.data : [],
  233. },
  234. {
  235. name: echartDataGqs.minData ? echartDataGqs.minData.lengedData : '',
  236. type: 'line',
  237. smooth: true,
  238. symbol: 'none',
  239. zlevel: 3,
  240. itemStyle: {
  241. color: '#4fffad',
  242. borderColor: '#a3c8d8',
  243. },
  244. lineStyle: {
  245. normal: {
  246. width: 2,
  247. color: '#4fffad',
  248. },
  249. },
  250. data: echartDataGqs.minData ? echartDataGqs.minData.data : [],
  251. },
  252. {
  253. name: echartDataGqs.avgData ? echartDataGqs.avgData.lengedData : '',
  254. type: 'line',
  255. smooth: true,
  256. symbol: 'none',
  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.avgData ? echartDataGqs.avgData.data : [],
  269. },
  270. {
  271. name: echartDataGqs.curData ? echartDataGqs.curData.lengedData : '',
  272. type: 'line',
  273. smooth: true,
  274. symbol: 'none',
  275. zlevel: 3,
  276. itemStyle: {
  277. color: '#fc8452',
  278. borderColor: '#a3c8d8',
  279. },
  280. lineStyle: {
  281. normal: {
  282. width: 2,
  283. color: '#fc8452',
  284. },
  285. },
  286. data: echartDataGqs.curData ? echartDataGqs.curData.data : [],
  287. },
  288. ],
  289. };
  290. myChart.setOption(option);
  291. window.onresize = function () {
  292. myChart.resize();
  293. };
  294. });
  295. }
  296. </script>
  297. <style scoped lang="less">
  298. .echartLine {
  299. width: 100%;
  300. height: 100%;
  301. .line {
  302. width: 100%;
  303. height: 100%;
  304. }
  305. }
  306. </style>