2022-10-09 16:04:29 +08:00

94 lines
2.2 KiB
Vue

<template>
<v-chart
ref="vChartRef"
:theme="themeColor"
:option="option.value"
:manual-update="isPreview()"
autoresize
></v-chart>
</template>
<script setup lang="ts">
import { reactive, watch, PropType } from "vue";
import VChart from "vue-echarts";
import { use, graphic } from "echarts/core";
import { CanvasRenderer } from "echarts/renderers";
import { LineChart } from "echarts/charts";
import config, { includes } from "./config";
import { mergeTheme } from "@/packages/public/chart";
import { useChartEditStore } from "@/store/modules/chartEditStore/chartEditStore";
import { chartColorsSearch, defaultTheme } from "@/settings/chartThemes/index";
import {
DatasetComponent,
GridComponent,
TooltipComponent,
LegendComponent,
} from "echarts/components";
import { useChartDataFetch } from "@/hooks";
import { isPreview } from "@/utils";
const props = defineProps({
themeSetting: {
type: Object,
required: true,
},
themeColor: {
type: Object,
required: true,
},
chartConfig: {
type: Object as PropType<config>,
required: true,
},
});
use([
DatasetComponent,
CanvasRenderer,
LineChart,
GridComponent,
TooltipComponent,
LegendComponent,
]);
const chartEditStore = useChartEditStore();
const option = reactive({
value: {},
});
// 渐变色处理
watch(
() => chartEditStore.getEditCanvasConfig.chartThemeColor,
(newColor: keyof typeof chartColorsSearch) => {
if (!isPreview()) {
const themeColor = chartColorsSearch[newColor] || chartColorsSearch[defaultTheme];
props.chartConfig.option.series.forEach((value: any, index: number) => {
value.areaStyle.color = new graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: themeColor[3 + index],
},
{
offset: 1,
color: "rgba(0,0,0, 0)",
},
]);
});
}
option.value = mergeTheme(props.chartConfig.option, props.themeSetting, includes);
props.chartConfig.option = option.value;
},
{
immediate: true,
}
);
watch(
() => props.chartConfig.option.dataset,
() => {
option.value = props.chartConfig.option;
}
);
const { vChartRef } = useChartDataFetch(props.chartConfig, useChartEditStore);
</script>