|
|
@ -6,7 +6,17 @@ import type { Nullable } from '@vben/types'; |
|
|
|
|
|
|
|
|
import type EchartsUI from './echarts-ui.vue'; |
|
|
import type EchartsUI from './echarts-ui.vue'; |
|
|
|
|
|
|
|
|
import { computed, nextTick, watch } from 'vue'; |
|
|
import { |
|
|
|
|
|
computed, |
|
|
|
|
|
nextTick, |
|
|
|
|
|
onActivated, |
|
|
|
|
|
onBeforeUnmount, |
|
|
|
|
|
onDeactivated, |
|
|
|
|
|
onMounted, |
|
|
|
|
|
ref, |
|
|
|
|
|
unref, |
|
|
|
|
|
watch, |
|
|
|
|
|
} from 'vue'; |
|
|
|
|
|
|
|
|
import { usePreferences } from '@vben/preferences'; |
|
|
import { usePreferences } from '@vben/preferences'; |
|
|
|
|
|
|
|
|
@ -27,6 +37,8 @@ type EchartsThemeType = 'dark' | 'light' | null; |
|
|
function useEcharts(chartRef: Ref<EchartsUIType>) { |
|
|
function useEcharts(chartRef: Ref<EchartsUIType>) { |
|
|
let chartInstance: echarts.ECharts | null = null; |
|
|
let chartInstance: echarts.ECharts | null = null; |
|
|
let cacheOptions: EChartsOption = {}; |
|
|
let cacheOptions: EChartsOption = {}; |
|
|
|
|
|
// echart是否处于激活状态
|
|
|
|
|
|
const isActiveRef = ref(false); |
|
|
|
|
|
|
|
|
const { isDark } = usePreferences(); |
|
|
const { isDark } = usePreferences(); |
|
|
const { height, width } = useWindowSize(); |
|
|
const { height, width } = useWindowSize(); |
|
|
@ -42,6 +54,11 @@ function useEcharts(chartRef: Ref<EchartsUIType>) { |
|
|
return maybeComponent.$el ?? null; |
|
|
return maybeComponent.$el ?? null; |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
onMounted(() => (isActiveRef.value = true)); |
|
|
|
|
|
onActivated(() => (isActiveRef.value = true)); |
|
|
|
|
|
onDeactivated(() => (isActiveRef.value = false)); |
|
|
|
|
|
onBeforeUnmount(() => (isActiveRef.value = false)); |
|
|
|
|
|
|
|
|
const isElHidden = (el: HTMLElement | null): boolean => { |
|
|
const isElHidden = (el: HTMLElement | null): boolean => { |
|
|
if (!el) return true; |
|
|
if (!el) return true; |
|
|
return el.offsetHeight === 0 || el.offsetWidth === 0; |
|
|
return el.offsetHeight === 0 || el.offsetWidth === 0; |
|
|
@ -71,6 +88,9 @@ function useEcharts(chartRef: Ref<EchartsUIType>) { |
|
|
options: EChartsOption, |
|
|
options: EChartsOption, |
|
|
clear = true, |
|
|
clear = true, |
|
|
): Promise<Nullable<echarts.ECharts>> => { |
|
|
): Promise<Nullable<echarts.ECharts>> => { |
|
|
|
|
|
if (!unref(isActiveRef)) { |
|
|
|
|
|
return Promise.resolve(null); |
|
|
|
|
|
} |
|
|
cacheOptions = options; |
|
|
cacheOptions = options; |
|
|
const currentOptions = { |
|
|
const currentOptions = { |
|
|
...options, |
|
|
...options, |
|
|
@ -154,8 +174,8 @@ function useEcharts(chartRef: Ref<EchartsUIType>) { |
|
|
|
|
|
|
|
|
useResizeObserver(chartRef as never, resizeHandler); |
|
|
useResizeObserver(chartRef as never, resizeHandler); |
|
|
|
|
|
|
|
|
watch(isDark, () => { |
|
|
watch([isDark, isActiveRef], () => { |
|
|
if (chartInstance) { |
|
|
if (chartInstance && unref(isActiveRef)) { |
|
|
chartInstance.dispose(); |
|
|
chartInstance.dispose(); |
|
|
initCharts(); |
|
|
initCharts(); |
|
|
renderEcharts(cacheOptions); |
|
|
renderEcharts(cacheOptions); |
|
|
@ -168,6 +188,7 @@ function useEcharts(chartRef: Ref<EchartsUIType>) { |
|
|
chartInstance?.dispose(); |
|
|
chartInstance?.dispose(); |
|
|
}); |
|
|
}); |
|
|
return { |
|
|
return { |
|
|
|
|
|
isActive: isActiveRef, |
|
|
renderEcharts, |
|
|
renderEcharts, |
|
|
resize, |
|
|
resize, |
|
|
updateData, |
|
|
updateData, |
|
|
|