echartLine.vue 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  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.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. showSymbol: true,
  221. symbolSize: 8,
  222. zlevel: 3,
  223. itemStyle: {
  224. color: '#19a3df',
  225. borderColor: '#a3c8d8',
  226. },
  227. lineStyle: {
  228. normal: {
  229. width: 2,
  230. color: '#19a3df',
  231. },
  232. },
  233. data: echartDataGqs.maxData ? echartDataGqs.maxData.data : [],
  234. },
  235. {
  236. name: echartDataGqs.minData ? echartDataGqs.minData.lengedData : '',
  237. type: 'line',
  238. smooth: true,
  239. showSymbol: true,
  240. symbolSize: 8,
  241. zlevel: 3,
  242. itemStyle: {
  243. color: '#4fffad',
  244. borderColor: '#a3c8d8',
  245. },
  246. lineStyle: {
  247. normal: {
  248. width: 2,
  249. color: '#4fffad',
  250. },
  251. },
  252. data: echartDataGqs.minData ? echartDataGqs.minData.data : [],
  253. },
  254. {
  255. name: echartDataGqs.avgData ? echartDataGqs.avgData.lengedData : '',
  256. type: 'line',
  257. smooth: true,
  258. showSymbol: true,
  259. symbolSize: 8,
  260. zlevel: 3,
  261. itemStyle: {
  262. color: '#fc8452',
  263. borderColor: '#a3c8d8',
  264. },
  265. lineStyle: {
  266. normal: {
  267. width: 2,
  268. color: '#fc8452',
  269. },
  270. },
  271. data: echartDataGqs.avgData ? echartDataGqs.avgData.data : [],
  272. },
  273. {
  274. name: echartDataGqs.curData ? echartDataGqs.curData.lengedData : '',
  275. type: 'line',
  276. smooth: true,
  277. showSymbol: true,
  278. symbolSize: 8,
  279. zlevel: 3,
  280. itemStyle: {
  281. color: '#fc8452',
  282. borderColor: '#a3c8d8',
  283. },
  284. lineStyle: {
  285. normal: {
  286. width: 2,
  287. color: '#fc8452',
  288. },
  289. },
  290. data: echartDataGqs.curData ? echartDataGqs.curData.data : [],
  291. },
  292. ],
  293. };
  294. myChart.setOption(option);
  295. window.onresize = function () {
  296. myChart.resize();
  297. };
  298. });
  299. }
  300. </script>
  301. <style scoped lang="less">
  302. .echartLine {
  303. width: 100%;
  304. height: 100%;
  305. .line {
  306. width: 100%;
  307. height: 100%;
  308. }
  309. }
  310. </style>