index.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  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. NamechartData: {
  12. // 柱形图x轴数据
  13. type: Array,
  14. default: true
  15. },
  16. ArrOneData: {
  17. // 柱形图x轴数据
  18. type: Array,
  19. default: true
  20. },
  21. ArrTwoData: {
  22. // 柱形图x轴数据
  23. type: Array,
  24. default: true
  25. }
  26. })
  27. let myEchart: EChartsType
  28. const timeId = ref(Math.floor(new Date().getTime() * Math.random())); // 使该图表保持唯id
  29. const myEchartData = () => {
  30. const option = {
  31. legend: {
  32. //图标信息提示
  33. type: 'scroll',
  34. left: '40%',
  35. top: 0,
  36. align: 'auto',
  37. icon: 'circle',
  38. textStyle: {
  39. color: "white"
  40. }
  41. },
  42. grid: {
  43. //图表距离边框的偏离
  44. right: '8%', //图表距离容器右侧距离
  45. left: '12%',
  46. top: '20%',
  47. bottom: '20%'
  48. },
  49. tooltip: { trigger: 'axis' }, // 设置图案和容器的距离
  50. xAxis: {
  51. type: 'category',
  52. nameLocation: 'end',
  53. data: props.NamechartData
  54. },
  55. yAxis: {
  56. type: 'value',
  57. nameLocation: 'end',
  58. // 坐标轴轴线
  59. axisLine: {
  60. show: false
  61. },
  62. // 坐标轴刻度
  63. axisTick: {
  64. show: false
  65. },
  66. min: 0,
  67. splitLine: {
  68. show: false // 不显示网格线
  69. }
  70. // axisLabel: { formatter: '{value} ' },
  71. },
  72. series: [
  73. {
  74. name: '2023',
  75. type: 'bar',
  76. stack: 'Ad',
  77. emphasis: {
  78. focus: 'series'
  79. },
  80. data: props.ArrOneData
  81. },
  82. {
  83. name: '2024',
  84. type: 'bar',
  85. stack: 'Ad',
  86. emphasis: {
  87. focus: 'series'
  88. },
  89. data: props.ArrTwoData
  90. }
  91. ],
  92. dataZoom: [
  93. // 数据选择范围 最下面的范围拉条
  94. {
  95. type: 'slider', // 开启滑动条
  96. show: true, // 显示缩放条
  97. start: 0,
  98. end: 20,
  99. backgroundColor: '#26CAF026',
  100. selectedDataBackground: {
  101. lineStyle: {
  102. type: 'dotted'
  103. },
  104. areaStyle: {
  105. color: '#26CAF0'
  106. }
  107. },
  108. bottom: '3%',
  109. height: 14,
  110. brushSelect: false,
  111. }
  112. ]
  113. }
  114. // { notMerge: true } 解决删除数据时,数据不刷新的问题
  115. myEchart.setOption(option, { notMerge: true })
  116. }
  117. watch(
  118. //监控数据变化
  119. () => props.NamechartData,
  120. () => {
  121. setTimeout(() => {
  122. myEchartData()
  123. }, 500)
  124. },
  125. { deep: true }
  126. )
  127. watch(
  128. //监控数据变化
  129. () => props.ArrOneData,
  130. () => {
  131. setTimeout(() => {
  132. myEchartData()
  133. }, 500)
  134. },
  135. { deep: true }
  136. )
  137. watch(
  138. //监控数据变化
  139. () => props.ArrTwoData,
  140. () => {
  141. setTimeout(() => {
  142. myEchartData()
  143. }, 500)
  144. },
  145. { deep: true }
  146. )
  147. onMounted(() => {
  148. setTimeout(() => {
  149. const dom = document.getElementById(`echart${timeId.value}`) as any
  150. myEchart = echarts.init(dom)
  151. myEchartData()
  152. }, 500)
  153. // 当窗口发生变化时
  154. window.addEventListener('resize', () => {
  155. myEchart.resize()
  156. })
  157. })
  158. onBeforeUnmount(() => {
  159. window.removeEventListener('resize', () => {
  160. myEchart.resize()
  161. })
  162. })
  163. </script>
  164. <style scoped lang="scss">
  165. .container-echart {
  166. width: 100%;
  167. height: 100%;
  168. display: flex;
  169. justify-content: center;
  170. align-items: center;
  171. overflow: hidden;
  172. }
  173. .interface-echart {
  174. width: 100%;
  175. height: 100%;
  176. }
  177. </style>