mx-echarts.vue 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. <template>
  2. <vue3-echarts ref="echarts" :options="localOption" :canvas-id="canvasId" :style="style"/>
  3. </template>
  4. <script setup>
  5. import {ref, computed, onActivated, onDeactivated, watch} from 'vue'
  6. /* NOTE: 因为vue3-echarts在页面快速切换过程中渲染时会报错,用这个组件包装一下,加强容错性*/
  7. import {createPropDefine} from "@/utils";
  8. import {empty} from "@/uni_modules/uv-ui-tools/libs/function/test";
  9. import {sleep} from "@/uni_modules/uv-ui-tools/libs/function";
  10. const props = defineProps({
  11. option: createPropDefine(null, Object),
  12. canvasId: createPropDefine('mx-echarts'),
  13. style: createPropDefine({height: '240px'}, Object)
  14. })
  15. const localOption = ref({})
  16. const echarts = ref(null)
  17. const paused = ref(false)
  18. const success = computed(() => echarts.value?.chart)
  19. const syncOption = async () => {
  20. const option = props.option
  21. if (empty(option)) return
  22. const valid = () => {
  23. if (paused.value) return false
  24. // 渲染成功也不用管了,如果要更精细控制,这里也要考虑
  25. if (success.value && option == localOption.value) return false
  26. return true
  27. }
  28. if (!valid()) return
  29. await sleep(500)
  30. // 双重判定
  31. if (!valid()) return
  32. localOption.value = option
  33. }
  34. onActivated(() => {
  35. paused.value = false
  36. syncOption()
  37. })
  38. onDeactivated(() => {
  39. paused.value = true
  40. })
  41. // TODO:我们的业务场景一般都是一次性赋值,所以这里没有开启深度监听
  42. // Cannot access 'syncOption' before initialization // watch.immediate只能放在定义之后
  43. watch(() => props.option, () => syncOption(), {immediate: true})
  44. </script>
  45. <style scoped>
  46. </style>