|
@@ -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, () => {
|
|
|
|
|
- if (chartInstance) {
|
|
|
|
|
|
|
+ watch([isDark, isActiveRef], () => {
|
|
|
|
|
+ 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,
|