Files
shgx_tz_vue-sync/src/views/kanbanManagement/FqcQualityDataBoard/KANBAN/charts/LineChart.vue
2024-10-08 17:31:24 +08:00

107 lines
1.8 KiB
Vue

<template>
<div ref="chartRef" :class="className" :style="{ height: height, width: width }" />
</template>
<script setup>
import { getCurrentInstance, watch, onMounted, ref } from 'vue';
import * as echarts from 'echarts';
import { CanvasRenderer } from 'echarts/renderers';
echarts.use([CanvasRenderer]);
import theme from './theme/dark.json';
echarts.registerTheme('theme', theme);
const { proxy } = getCurrentInstance();
const chartRef = ref(null);
const props = defineProps({
className: {
type: String,
default: 'chart'
},
width: {
type: String,
default: '100%'
},
height: {
type: String,
default: '350px'
},
autoResize: {
type: Boolean,
default: true
},
chartData: {
type: Object,
required: true
}
});
let chart = null;
watch(
() => props.chartData,
(val) => {
setOptions(val);
},
{ deep: true }
);
function setOptions({ expectedData, actualData } = {}) {
chart.setOption({
xAxis: {
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
boundaryGap: false,
axisTick: {
show: false
}
},
grid: {
left: 10,
right: 10,
bottom: 20,
top: 60,
containLabel: true
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross'
},
padding: [5, 10]
},
yAxis: {
axisTick: {
show: false
}
},
legend: {
data: ['expected', 'actual']
},
series: [
{
name: 'expected',
smooth: true,
type: 'line',
data: expectedData,
animationDuration: 2800,
animationEasing: 'cubicInOut'
},
{
name: 'actual',
smooth: true,
type: 'line',
data: actualData,
animationDuration: 2800,
animationEasing: 'quadraticOut'
}
]
});
}
function initChart() {
chart = echarts.init(proxy.$refs.chartRef, 'theme');
setOptions(props.chartData);
}
onMounted(() => {
initChart();
});
window.onresize = function () {
chart.resize();
};
</script>