index.vue 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. <template>
  2. <v-chart :theme="themeColor" :option="option.value" autoresize> </v-chart>
  3. </template>
  4. <script setup lang="ts">
  5. import { PropType, reactive, watch } from 'vue'
  6. import VChart from 'vue-echarts'
  7. import { use } from 'echarts/core'
  8. import { CanvasRenderer } from 'echarts/renderers'
  9. import { PieChart } from 'echarts/charts'
  10. import { mergeTheme } from '@/packages/public/chart'
  11. import config, { includes } from './config'
  12. import { useChartDataFetch } from '@/hooks'
  13. import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
  14. import { DatasetComponent, GridComponent, TooltipComponent, LegendComponent, TitleComponent } from 'echarts/components'
  15. const props = defineProps({
  16. themeSetting: {
  17. type: Object,
  18. required: true
  19. },
  20. themeColor: {
  21. type: Object,
  22. required: true
  23. },
  24. chartConfig: {
  25. type: Object as PropType<config>,
  26. required: true
  27. }
  28. })
  29. use([DatasetComponent, CanvasRenderer, PieChart, GridComponent, TooltipComponent, LegendComponent, TitleComponent])
  30. const option = reactive({
  31. value: {}
  32. })
  33. const dataHandle = (newData: any) => {
  34. const d = parseFloat(`${newData}`) * 100
  35. let config = props.chartConfig.option
  36. config.title.text = d.toFixed(2) + '%'
  37. config.series[0].data[0].value[0] = d
  38. config.series[0].data[1].value[0] = 100 - d
  39. option.value = mergeTheme(props.chartConfig.option, props.themeSetting, includes)
  40. option.value = props.chartConfig.option
  41. }
  42. // 配置时
  43. watch(
  44. () => props.chartConfig.option.dataset,
  45. newData => {
  46. dataHandle(newData)
  47. },
  48. {
  49. immediate: true
  50. }
  51. )
  52. // 预览时
  53. useChartDataFetch(props.chartConfig, useChartEditStore, (resData: number) => {
  54. let d = parseFloat(`${resData}`) * 100
  55. // @ts-ignore
  56. option.value.title.text = d.toFixed(2) + '%'
  57. // @ts-ignore
  58. option.value.series[0].data[0].value[0] = d
  59. // @ts-ignore
  60. option.value.series[0].data[1].value[0] = 100 - d
  61. })
  62. </script>