index.vue 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. <template>
  2. <div class="container-echart">
  3. <div :id="'echart' + timeId" class="interface-echart"></div>
  4. </div>
  5. </template>
  6. <script lang="ts" setup>
  7. import * as echarts from 'echarts'
  8. import { EChartsType } from 'echarts'
  9. import { onMounted, ref, watch, onBeforeUnmount, nextTick } from 'vue'
  10. const props = defineProps({
  11. xDataArray: {
  12. // 柱形图x轴数据
  13. type: Array,
  14. default: function () {
  15. return ['1', '2', '3', '4', '5']
  16. }
  17. },
  18. yDataArray: {
  19. //图标信息提示
  20. type: Array,
  21. default: function () {
  22. return [
  23. {
  24. name: '图例二',
  25. type: 'bar',
  26. label: {
  27. // 柱状图上的文字设置
  28. show: true, // 是否显示
  29. // rotate: 60, // 文字旋转角度
  30. position: 'top' // 显示位置
  31. },
  32. // barWidth: '50%', // 柱的宽度
  33. barGap: '5%', // 多个并排柱子设置柱子之间的间距
  34. data: [2, 2, 7, 5, 7, 4]
  35. },
  36. {
  37. name: '图例三',
  38. type: 'bar',
  39. label: {
  40. show: true, // 是否显示
  41. position: 'top' // 显示位置
  42. },
  43. barGap: '5%', // 多个并排柱子设置柱子之间的间距
  44. data: [4, 2, 5, 8, 4, 2]
  45. }
  46. ]
  47. }
  48. }
  49. })
  50. let myEchart: EChartsType
  51. const timeId = ref(Math.floor(new Date().getTime() * Math.random())); // 使该图表保持唯id
  52. const myEchartData = () => {
  53. const option = {
  54. // title: {
  55. // text: '接口请求耗时分布', // 标题文字
  56. // textStyle: {
  57. // color: '#C0C4CC', // 标题样式设置
  58. // fontWeight: 'bold' // 标题文字大小
  59. // }
  60. // },
  61. legend: {
  62. //图标信息提示
  63. type: 'scroll',
  64. orient: 'horizontal',
  65. // right: '50%',
  66. left: '40%',
  67. top: 0,
  68. // bottom: 20,
  69. align: 'auto',
  70. icon: 'circle'
  71. },
  72. grid: {
  73. //图表距离边框的偏离
  74. right: '8%', //图表距离容器右侧距离
  75. left: '8%',
  76. top: '20%',
  77. bottom: '20%'
  78. },
  79. tooltip: { trigger: 'axis' }, // 设置图案和容器的距离
  80. xAxis: {
  81. type: 'category',
  82. // name: '时间',
  83. nameLocation: 'end',
  84. data: props.xDataArray
  85. // axisLabel: {
  86. // interval: 20 //制显示间隔
  87. // // rotate: 60 // 设置倾斜角度
  88. // }
  89. // // 坐标轴轴线
  90. // axisLine: {
  91. // show: false
  92. // },
  93. // // 坐标轴刻度
  94. // axisTick: {
  95. // show: false
  96. // },
  97. // // 刻度标签
  98. // axisLabel: {
  99. // show: false
  100. // }
  101. },
  102. yAxis: {
  103. type: 'value',
  104. // name: '值',
  105. nameLocation: 'end',
  106. // // 坐标轴轴线
  107. // axisLine: {
  108. // show: false
  109. // },
  110. // // 坐标轴刻度
  111. // axisTick: {
  112. // show: false
  113. // },
  114. // // 刻度标签
  115. // axisLabel: {
  116. // show: false
  117. // },
  118. min: 0
  119. // splitLine: {
  120. // show: false // 不显示网格线
  121. // }
  122. // axisLabel: { formatter: '{value} ' },
  123. },
  124. series: props.yDataArray,
  125. dataZoom: [
  126. // 数据选择范围 最下面的范围拉条
  127. {
  128. type: 'slider', // 开启滑动条
  129. show: true, // 显示缩放条
  130. start: 0,
  131. end: 100,
  132. backgroundColor: '#26CAF026',
  133. selectedDataBackground: {
  134. lineStyle: {
  135. type: 'dotted'
  136. },
  137. areaStyle: {
  138. color: '#26CAF0'
  139. }
  140. },
  141. // handleSize: '150%',
  142. bottom: '3%',
  143. height: 10,
  144. brushSelect: false,
  145. handleIcon:
  146. 'image://data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAAXNSR0IArs4c6QAABQtJREFUWEfNmVtMI2UUx883M/SybXfbQNht4wM3dxMgqNEIMc26+oIYfFB4EROzhocmWizECyGRtKsRa8wuEULCPiyiEZNNQIObUN92TSSLGBL7QBYtaDUbKNIGKtPpbS7mm+10p9OyHVZo2mQyk5nv8vv+Z86Z850iKP5DsibitcfjIQYHB5+hKOo5kiSfBICzAGBFCJ3EzwVB+BcAtnieD3Act8IwzK2enp7bPp+Px49l40nX8nviEFIb+eRy1EL3UTgctlosFhdBEK8DwOnia8tpsZ1Op78OBAJjTU1NWwrIQqDivYIgiomR3+/XNzc3v0sQxPsAcOKQYMrmTCKRuDw5OXllYGCAyTzEMNIhtS8IqARGDMO06fX6rwCg/n+C5XQXBOGPUCj0hs1m+7kAZFbRvPdL/r6l0+kPKIq6dJRgeXIyzIcGg+ETmYI5ahYEDAQCpvr6+msIoe7jhJPGZln226mpKYfD4diXOYgIWggQ8Tx/vVRwEmQqlfpOq9W+plRSAsyeS2HWg6xC0/RHJpPJm4EUQxIGy8JlHGKxFGY9aI6NjY3nGxoasONgE/NZQL/ff6KlpcV/1N562MXyPP9nf39/6/j4eEyuIOI4bpggCI+aARO8AAkewEzlh9FggoMaHZk3DM3hPgJUVRBFp6Bp+uOMqe8pGA6HbZWVlb+rCcKsIMAjS3sQYQW489QpaNDfh/H+HYehYBwcVi1MPmrIgmC4M7d3ISkAbLWZ1UAyc3Nzj3d3d29iQILjOC9BEO8VXRoAYIVql6Ni0y/OGuDiGW2228XfaPhyOwXPnqLg1mPiZ1n8yfvcbDHBBXNF0alomv7cZDINI4/HQ7nd7rtqv62lAhQE4Z+6urpzKB6Pn9fpdD8WXVIBNY5TQTzd2traCyidTrspilLlHEpzHTdgNBodwV+N7xFCL5Wjgslk0ocB1xBC58oRkGXZAAaMSpmwGshSOQlmwZk5EgRBmW4/kLOUgBik/AHL3sRl7yQsy94gSbJTjYOUOg4mEokfUDKZ9Gg0Gnc5AkYiES/a3d29YDabb5Yj4MrKSifq6OjQLiws/FWOyYLNZmvG6RaVSqW8FRUV76hRsVRxcG9vb9xisVwSAVdXV22NjY13DpOwhlkB1g6ZsLIAcLdVXcI6MTHxtNPpDImAOGDH4/FhnU43rEbFeym/AGYqP31/UMqPxzaSB5WD7s8ciUQ+raqq+kzak4iAo6OjBpfLtYIQqlMDeVxtOI4LdnV1nZ+fn8d1G3FPgjcVWAq0ubnZZrVaVSevxwG5uLj4ot1uX5ZvOzGguDfJmHpIp9OpjotHCbmzs+Otrq6+LNu4iwqKYLIzzrK/oSjqlaOcvNhYsVjshtFo7MVmVVYWJMAs5NjY2EmHw3FVo9G8XGzgo3iO4ZxO59vT09NS8UisKkhOIrlinpr7+/tDRqNRlWc/LGjGrFdkyknlt5zajFQCkZ8xOLG+vt5aW1t7jSCI2oeFKNQPe+vS0tKbdrv9lwK1wayZlWBiEqt8L/v6+gwjIyMuo9E4oCaYF1kIE4lExnt7eycyoUTM7mWHBJdbPMqASVE0773E0LOzs9b29va3DAbDqwih6sMoijfi0Wj0+szMzFX8hcj0lYMpr/PLb5lOB5lbuk/U1NSQPp+v1Wq14k3/EyRJNpAkeVr+NwTHcdssy27EYrFfg8HgT52dncuhUAhPqlRMXuHPOofkyf8BM+lL3UtbDgUAAAAASUVORK5CYII='
  147. }
  148. ]
  149. }
  150. // { notMerge: true } 解决删除数据时,数据不刷新的问题
  151. myEchart.setOption(option, { notMerge: true })
  152. }
  153. watch(
  154. //监控数据变化
  155. () => props.xDataArray,
  156. () => {
  157. setTimeout(() => {
  158. myEchartData()
  159. }, 500)
  160. },
  161. { deep: true }
  162. )
  163. watch(
  164. //监控数据变化
  165. () => props.yDataArray,
  166. () => {
  167. setTimeout(() => {
  168. myEchartData()
  169. }, 500)
  170. },
  171. { deep: true }
  172. )
  173. onMounted(() => {
  174. setTimeout(() => {
  175. const dom = document.getElementById(`echart${timeId.value}`) as any
  176. myEchart = echarts.init(dom)
  177. myEchartData()
  178. }, 500)
  179. // 当窗口发生变化时
  180. window.addEventListener('resize', () => {
  181. myEchart.resize()
  182. })
  183. })
  184. onBeforeUnmount(() => {
  185. window.removeEventListener('resize', () => {
  186. myEchart.resize()
  187. })
  188. })
  189. </script>
  190. <style scoped lang="scss">
  191. .container-echart {
  192. width: 100%;
  193. height: 100%;
  194. display: flex;
  195. justify-content: center;
  196. align-items: center;
  197. overflow: hidden;
  198. }
  199. .interface-echart {
  200. width: 100%;
  201. height: 100%;
  202. }
  203. </style>