index.vue 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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 { 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 option = computed(() => {
  33. return mergeTheme(props.chartConfig.option, props.themeSetting, includes)
  34. })
  35. const dataSetHandle = (dataset: any) => {
  36. props.chartConfig.option.legend.data = dataset.seriesData.map(i => i.name)
  37. props.chartConfig.option.radar.indicator = dataset.radarIndicator
  38. props.chartConfig.option.series[0].data = dataset.seriesData
  39. }
  40. watch(
  41. () => props.chartConfig.option.dataset,
  42. newData => {
  43. dataSetHandle(newData)
  44. },
  45. {
  46. immediate: true
  47. }
  48. )
  49. const { vChartRef } = useChartDataFetch(props.chartConfig, useChartEditStore, (newData: any) => {
  50. dataSetHandle(newData)
  51. })
  52. </script>