VueCharts.vue 997 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. <script setup lang="ts">
  2. import { onMounted, onUnmounted, ref, watch } from 'vue'
  3. import * as echarts from 'echarts'
  4. type Props = {
  5. data: string
  6. }
  7. const prop = defineProps<Props>()
  8. let instance: echarts.ECharts
  9. const dom = ref<HTMLDivElement>()
  10. const resizeHandler = () => {
  11. instance?.resize()
  12. }
  13. const showOrigin = ref(false)
  14. const setOption = () => {
  15. let data: echarts.EChartsOption
  16. try {
  17. data = JSON.parse(decodeURIComponent(prop.data))
  18. } catch (e) {
  19. console.error(e)
  20. return
  21. }
  22. instance = echarts.init(dom.value)
  23. try {
  24. instance.setOption(data)
  25. } catch (e) {
  26. showOrigin.value = true
  27. }
  28. }
  29. watch(
  30. () => prop.data,
  31. () => {
  32. setOption()
  33. }
  34. )
  35. onMounted(() => {
  36. setOption()
  37. window.addEventListener('resize', resizeHandler)
  38. })
  39. onUnmounted(() => {
  40. window.removeEventListener('resize', resizeHandler)
  41. instance?.dispose()
  42. })
  43. defineExpose<{
  44. resize: () => void
  45. }>({ resize: resizeHandler })
  46. </script>
  47. <template>
  48. <div ref="dom"></div>
  49. </template>
  50. <style scoped></style>