index.vue 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. <template>
  2. <v-chart ref="vChartRef" :theme="themeColor" :option="option" :manual-update="isPreview()" autoresize></v-chart>
  3. </template>
  4. <script setup lang="ts">
  5. import { ref, computed, PropType, watch } from 'vue'
  6. import VChart from 'vue-echarts'
  7. import { use } from 'echarts/core'
  8. import { CanvasRenderer } from 'echarts/renderers'
  9. import { RadarChart } from 'echarts/charts'
  10. import { includes } from './config'
  11. import { mergeTheme } from '@/packages/public/chart'
  12. import { useChartDataFetch } from '@/hooks'
  13. import { CreateComponentType } from '@/packages/index.d'
  14. import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
  15. import { isPreview } from '@/utils'
  16. import { DatasetComponent, GridComponent, TooltipComponent, LegendComponent } from 'echarts/components'
  17. const props = defineProps({
  18. themeSetting: {
  19. type: Object,
  20. required: true
  21. },
  22. themeColor: {
  23. type: Object,
  24. required: true
  25. },
  26. chartConfig: {
  27. type: Object as PropType<CreateComponentType>,
  28. required: true
  29. }
  30. })
  31. use([DatasetComponent, CanvasRenderer, RadarChart, GridComponent, TooltipComponent, LegendComponent])
  32. const vChartRef = ref<typeof VChart>()
  33. const option = computed(() => {
  34. return mergeTheme(props.chartConfig.option, props.themeSetting, includes)
  35. })
  36. const dataSetHandle = (dataset: any) => {
  37. if (dataset.seriesData) {
  38. props.chartConfig.option.series[0].data = dataset.seriesData
  39. // @ts-ignore
  40. props.chartConfig.option.legend.data = dataset.seriesData.map((i: { name: string }) => i.name)
  41. }
  42. if (dataset.radarIndicator) {
  43. props.chartConfig.option.radar.indicator = dataset.radarIndicator
  44. }
  45. if (vChartRef.value && isPreview()) {
  46. vChartRef.value.setOption(props.chartConfig.option)
  47. }
  48. }
  49. watch(
  50. () => props.chartConfig.option.dataset,
  51. newData => {
  52. dataSetHandle(newData)
  53. },
  54. {
  55. deep: false
  56. }
  57. )
  58. useChartDataFetch(props.chartConfig, useChartEditStore, (newData: any) => {
  59. dataSetHandle(newData)
  60. })
  61. </script>