You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
1.8 KiB
76 lines
1.8 KiB
/**
|
|
* echarts 自动切换主题、重置尺寸封装
|
|
*/
|
|
import type { Ref } from 'vue';
|
|
import {
|
|
ref,
|
|
reactive,
|
|
unref,
|
|
provide,
|
|
watch,
|
|
onActivated,
|
|
onDeactivated,
|
|
nextTick
|
|
} from 'vue';
|
|
import { storeToRefs } from 'pinia';
|
|
import { THEME_KEY } from 'vue-echarts';
|
|
import type VChart from 'vue-echarts';
|
|
import { ChartTheme, ChartThemeDark } from 'ele-admin-pro/es';
|
|
import { useThemeStore } from '@/store/modules/theme';
|
|
import { onSizeChange } from './on-size-change';
|
|
|
|
export default function (chartRefs: Ref<InstanceType<typeof VChart> | null>[]) {
|
|
// 当前框架是否是暗黑主题
|
|
const themeStore = useThemeStore();
|
|
const { darkMode } = storeToRefs(themeStore);
|
|
// 是否为 deactivated 状态
|
|
const deactivated = ref<boolean>(false);
|
|
// 当前图表是否是暗黑主题
|
|
const isDark = ref<boolean>(unref(darkMode));
|
|
// 当前图表主题
|
|
const chartsTheme = reactive({
|
|
...(unref(isDark) ? ChartThemeDark : ChartTheme)
|
|
});
|
|
|
|
// 设置图表主题
|
|
provide(THEME_KEY, chartsTheme);
|
|
|
|
/* 重置图表尺寸 */
|
|
const resizeCharts = () => {
|
|
chartRefs.forEach((chartRef) => {
|
|
unref(chartRef)?.resize();
|
|
});
|
|
};
|
|
|
|
/* 屏幕尺寸变化监听 */
|
|
onSizeChange(() => {
|
|
resizeCharts();
|
|
});
|
|
|
|
/* 更改图表主题 */
|
|
const changeTheme = (dark: boolean) => {
|
|
isDark.value = dark;
|
|
Object.assign(chartsTheme, dark ? ChartThemeDark : ChartTheme);
|
|
};
|
|
|
|
onActivated(() => {
|
|
deactivated.value = false;
|
|
nextTick(() => {
|
|
if (unref(isDark) !== unref(darkMode)) {
|
|
changeTheme(unref(darkMode));
|
|
} else {
|
|
resizeCharts();
|
|
}
|
|
});
|
|
});
|
|
|
|
onDeactivated(() => {
|
|
deactivated.value = true;
|
|
});
|
|
|
|
watch(darkMode, (dark) => {
|
|
if (!unref(deactivated)) {
|
|
changeTheme(dark);
|
|
}
|
|
});
|
|
}
|