SellerChart.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. <!-- 横形柱状图 -->
  2. <script lang="ts" setup>
  3. import * as echarts from 'echarts'
  4. import { onMounted, ref, reactive, watch, computed } from 'vue'
  5. const props = defineProps({
  6. SellerData: Array,
  7. Interval: Object
  8. })
  9. const seller_data = ref(props.SellerData)
  10. const seller_interval = ref(props.Interval)
  11. const seller_ref = ref()
  12. watch(
  13. () => props.SellerData,
  14. (current) => {
  15. seller_data.value = current
  16. initChart()
  17. },
  18. {
  19. deep: true
  20. }
  21. )
  22. watch(
  23. () => props.Interval,
  24. (current) => {
  25. seller_interval.value = current
  26. initOption.xAxis.max = Max.value
  27. initOption.xAxis.interval = interval.value
  28. initChart()
  29. },
  30. {
  31. deep: true
  32. }
  33. )
  34. // 最大值
  35. const Max = computed(() => {
  36. return seller_interval.value?.Max
  37. })
  38. // 刻度
  39. const interval = computed(() => {
  40. return seller_interval.value?.interval
  41. })
  42. // y轴值
  43. const sellerName = computed(() => {
  44. return seller_data.value?.map((item: any) => {
  45. return item.name
  46. })
  47. })
  48. // 数额
  49. const sellerValue = computed(() => {
  50. return seller_data.value?.map((item: any) => {
  51. return item.value
  52. })
  53. })
  54. // 获取数据中的color
  55. const ColorValue = computed(() => {
  56. return seller_data.value?.map((item: any) => {
  57. return item.color
  58. })
  59. })
  60. const initOption = reactive({
  61. // 间距
  62. grid: {
  63. top: '5%',
  64. left: '3%',
  65. right: '6%',
  66. bottom: '5%',
  67. containLabel: true // 距离包含坐标轴上的文字
  68. },
  69. // hover时的文字显示
  70. tooltip: {
  71. show: true,
  72. backgroundColor: '#2b2f36',
  73. borderColor: '#2b2f36',
  74. formatter: function (params: any) {
  75. var str =
  76. params.name + '<div style= ' + 'color:#FFF>' + params.marker + params.value + '</div>'
  77. return str
  78. },
  79. textStyle: {
  80. color: '#FFF',
  81. fontWeight: 700,
  82. fontFamily: 'Lato-Light',
  83. fontSize: '14px'
  84. }
  85. },
  86. // X轴
  87. xAxis: {
  88. splitLine: {
  89. lineStyle: {
  90. type: 'dashed'
  91. }
  92. },
  93. type: 'value',
  94. axisLine: {
  95. show: false
  96. },
  97. axisLabel: {
  98. fontFamily: 'Lato-Light',
  99. color: '#B5B9BF'
  100. },
  101. min: 0, // 最小值
  102. max: Max.value, // 最大值
  103. interval: interval.value // 刻度
  104. },
  105. // y轴
  106. yAxis: {
  107. axisLine: {
  108. show: false
  109. },
  110. axisTick: {
  111. show: false
  112. },
  113. axisLabel: {
  114. fontFamily: 'Lato-Light',
  115. color: '#B5B9BF'
  116. },
  117. type: 'category',
  118. data: sellerName,
  119. // 工具提示
  120. tooltip: {
  121. trigger: 'axis', // 触发类型,轴触发,axis为鼠标移到一条柱状图显示
  122. axisPointer: {
  123. type: 'line', // 默认为line,line为直线,cross为十字准星,shadow为阴影
  124. z: 0,
  125. lineStyle: {
  126. color: '#FFF'
  127. }
  128. }
  129. }
  130. },
  131. series: [
  132. {
  133. type: 'bar',
  134. data: sellerValue,
  135. itemStyle: {
  136. color: function (params: { dataIndex: number }) {
  137. return ColorValue.value[params.dataIndex % ColorValue.value.length]
  138. }
  139. },
  140. barCategoryGap: '0%', // 消除不同系列间的间隔
  141. // 设置柱形文字的样式
  142. label: {
  143. show: true,
  144. color: '#646A73',
  145. position: 'insideRight',
  146. fontFamily: 'Lato-Light',
  147. // 数据每三位加一个逗号
  148. formatter: function (data: { value: { toString: () => string } }) {
  149. const reg = /(\d)(?=(?:\d{3})+$)/g
  150. const newNumber = data.value.toString().replace(reg, '$1,')
  151. return newNumber
  152. }
  153. }
  154. }
  155. ]
  156. })
  157. onMounted(() => {
  158. initChart()
  159. })
  160. const initChart = () => {
  161. seller_data.value?.sort((a: any, b: any) => {
  162. return a.value - b.value // 从大到小排序
  163. })
  164. const seller_chart = echarts.init(seller_ref.value)
  165. seller_chart.setOption(initOption)
  166. //图表响应式
  167. window.addEventListener('resize', () => {
  168. seller_chart.resize()
  169. })
  170. // 监听点击事件
  171. seller_chart.on('click', function (params) {
  172. // params 包含了点击事件的数据
  173. console.log(params) // 获取点击的数据
  174. })
  175. }
  176. </script>
  177. <template>
  178. <div class="com-container">
  179. <div ref="seller_ref" id="seller_chart"></div>
  180. </div>
  181. </template>
  182. <style lang="scss" scoped>
  183. .com-container {
  184. width: 100%;
  185. height: 100%;
  186. overflow: hidden;
  187. position: relative;
  188. }
  189. #seller_chart {
  190. width: 100%;
  191. height: 272px;
  192. }
  193. </style>