echartLine.vue 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. <template>
  2. <!-- 折线图 -->
  3. <div>
  4. <div class="echartitem">
  5. <!-- <h3 class="selcal">{{ props.selval }}</h3> -->
  6. <div id="line2" ref="chartContainer" style="width:100%;height:500px;"></div>
  7. </div>
  8. </div>
  9. </template>
  10. <script setup>
  11. import { ref, onMounted, reactive,markRaw, inject,watch,nextTick} from "vue";
  12. import { RouterView, RouterLink } from "vue-router"
  13. import { request, uploadFile } from "@/utils/request";
  14. import { ElMessage, ElButton, ElDialog, ElSelect } from 'element-plus'
  15. import * as echarts from 'echarts'
  16. let vars=ref([]);
  17. let vals=ref([]);
  18. let series=ref([]);
  19. let xdata=ref([]);
  20. let chartContainer=ref(null);
  21. let myChart;
  22. let chartDom=ref()
  23. let option=ref(null);
  24. let convergeDate=ref([]);
  25. let curvedata=ref('')
  26. let state = reactive({
  27. instance: null,
  28. })
  29. const props = defineProps({
  30. echartdata: {
  31. type: String,
  32. },
  33. curvedata:{
  34. type: String,
  35. },
  36. })
  37. onMounted(() => {
  38. chartContainer.value.style.width=window.innerWidth-220+'px';
  39. myChart = echarts.init(chartContainer.value);
  40. linechart();
  41. window.addEventListener("resize",function() {
  42. chartContainer.value.style.width='';
  43. myChart.resize();
  44. })
  45. })
  46. //初始化
  47. const echatinit=()=>{
  48. convergeDate.value=[];
  49. series.value=[];
  50. xdata.value=[];
  51. }
  52. // 从websocket取数据
  53. // const getsockechart=(data)=>{
  54. // curvedata.value=data;
  55. // series.value=[];
  56. // let rows=curvedata.value;
  57. // for(let i=0;i<rows.length;i++){
  58. // vars.value=(rows[i].vars).split(",");
  59. // vals.value=(rows[i].vals).split(" ");
  60. // let data= vals.value.map((str) => Number(str));
  61. // convergeDate.value.push(data);
  62. // xdata.value.push(rows[i].step);
  63. // }
  64. // for(let j=0;j<vars.value.length;j++){
  65. // let firstColumn=(convergeDate.value.map((row) => row[j]));
  66. // let item= {
  67. // name:vars.value[j] ,
  68. // type: 'line',
  69. // stack: 'Total',
  70. // data: firstColumn
  71. // }
  72. // series.value.push(item)
  73. // }
  74. // myChart.setOption({
  75. // legend: {
  76. // data:vars.value
  77. // },
  78. // xAxis:{
  79. // data: xdata.value,
  80. // },
  81. // series: series.value
  82. // });
  83. // }
  84. const getsockechart=(data)=>{
  85. curvedata.value=data;
  86. convergeDate.value=[];
  87. series.value=[];
  88. xdata.value=[];
  89. let rows=JSON.parse(curvedata.value);
  90. let num=0;
  91. for(let i=0;i<rows.length;i++){
  92. num+=1;
  93. vars.value=(rows[i].vars).split(",");
  94. vals.value=(rows[i].vals).split(" ");
  95. let data= vals.value.map((str) => Number(str));
  96. convergeDate.value.push(data);
  97. xdata.value.push(num);
  98. }
  99. console.log(convergeDate.value);
  100. // console.log( convergeDate.value);
  101. for(let j=0;j<vars.value.length;j++){
  102. let firstColumn= convergeDate.value.map(row => row[j]);
  103. let item= {
  104. name:vars.value[j] ,
  105. type: 'line',
  106. stack: 'Total',
  107. data: firstColumn
  108. }
  109. series.value.push(item)
  110. }
  111. myChart.setOption({
  112. legend: {
  113. data:vars.value
  114. },
  115. xAxis:{
  116. data: xdata.value,
  117. },
  118. series: series.value
  119. });
  120. }
  121. const linechart= ()=>{
  122. option.value = {
  123. title: {
  124. text: '折线图'
  125. },
  126. tooltip: {
  127. trigger: "axis",//item
  128. backgroundColor: "rgba(0,0,0,.6)",
  129. borderColor: "rgba(147, 235, 248, .8)",
  130. textStyle: {
  131. color: "#FFF",
  132. },
  133. },
  134. legend: {
  135. data:vars.value
  136. },
  137. grid: {
  138. show: false,
  139. left: '3%',
  140. right: '4%',
  141. bottom: '3%',
  142. containLabel: true
  143. },
  144. toolbox: {
  145. feature: {
  146. saveAsImage: {}
  147. }
  148. },
  149. xAxis: {
  150. type: 'category',
  151. boundaryGap: false,
  152. data: xdata.value,
  153. axisLine: {//X轴线
  154. show: true,
  155. lineStyle: {
  156. color: '#000', // 线的颜色
  157. width: 2, // 线宽
  158. type: 'solid' // 线的类型,默认为实线,可选:'solid', 'dashed', 'dotted'
  159. }
  160. },
  161. splitLine: {
  162. show: true // 如果不需要网格线,可以设置为 false
  163. }
  164. },
  165. yAxis: {
  166. type: 'value',
  167. axisLine: {//Y轴线
  168. show: true,
  169. lineStyle: {
  170. color: '#000', // 线的颜色
  171. width: 2, // 线宽
  172. type: 'solid' // 线的类型,默认为实线,可选:'solid', 'dashed', 'dotted'
  173. }
  174. },
  175. },
  176. series:series.value
  177. };
  178. option.value && myChart.setOption(option.value);
  179. window.onresize = function() {
  180. // 让图表自适应大小
  181. myChart.resize();
  182. };
  183. }
  184. // 监听数据变化,重绘图表
  185. // watch( myChart.value, () => {
  186. // console.log(11111)
  187. // window.onresize = function() {
  188. // // 让图表自适应大小
  189. // myChart.value.resize();
  190. // };
  191. // });
  192. //window.addEventListener('resize', handleResize);
  193. // watch(series, () => {
  194. // linechart();
  195. // }, { deep: true });
  196. // watch(() =>props.echartdata, (newValue, oldValue) => {
  197. // // 这里处理 echartData 变化的逻辑
  198. // console.log(11111)
  199. // console.log('echartData changed:', newValue);
  200. // // console.log(optmonitor1.value);
  201. // }, {deep: true ,immediate: true });
  202. defineExpose({linechart,getsockechart,echatinit});
  203. </script>
  204. <style lang="scss" scoped>
  205. .selcal{
  206. position: absolute;
  207. top: 37%;
  208. width: 26px;
  209. color: #000;
  210. font-size: 14px;
  211. font-weight: bold;
  212. left: 5px
  213. }
  214. .diedai{
  215. color: #000;
  216. font-size: 14px;
  217. padding-bottom: 20px;
  218. font-weight: bold;
  219. }
  220. </style>