需求:月份、 公司 、显示字段、柱形图(折线图),都为动态可选的。
(此例子:模拟数据都为随机数,所以每次截图值都会不同)
(Vue3 + echarts 5.4.2版本)
<template>
<div>
<div>
<label>公司:</label>
<a-select v-model:value="selectedCompany" style="width: 180px; margin-left: 8px" allow-clear mode="multiple" :maxTagCount="1">
<a-select-option :value="v" v-for="(v, index) in companies" :key="index">{{ v }}</a-select-option>
</a-select>
</div>
<div>
<label>月份:</label>
<a-select v-model:value="selectedMonth" style="width: 180px; margin-left: 8px" allow-clear>
<a-select-option :value="v" v-for="(v, index) in months" :key="index">{{ v }}月份</a-select-option>
</a-select>
</div>
<div>
<label>显示字段:</label>
<a-select v-model:value="selectType" style="width: 180px; margin-left: 8px" allow-clear mode="multiple" :maxTagCount="1">
<a-select-option :value="v" v-for="(v, index) in typeList" :key="index">{{ v }}</a-select-option>
</a-select>
</div>
<div>
<label>echarts图类型:</label>
<a-space direction="vertical">
<a-radio-group v-model:value="selectEcharts" :options="plainOptions" />
</a-space>
</div>
<button @click="btnSave">确定</button>
<div id="chart" ref="chart" style="width: 100%;height: 440px;"></div>
</div>
</template>
<script setup>
import { onMounted,ref,nextTick,watch } from 'vue';
import dayjs from 'dayjs';
import * as echarts from 'echarts';// 使用的版本:"echarts": "^5.4.2",
const dataList = ref([]);
const chart = ref(null);
let chartInstance = null;
// 选择条件
const companies = ['A公司', 'B公司', 'C公司','D公司'];
const months = ['1','2','3','4','5','6','7','8','9','10','11','12'];
const typeList = ['铅笔','钢笔','毛笔','碳素笔'];
const plainOptions = [
{
label: '柱形图',
value: '1',
},
{
label: '折线图',
value: '2',
}
];
// 选中的值
const selectedCompany = ref([]);
const selectedMonth = ref('');
const selectType = ref([]);
const selectEcharts = ref('1');
// 组装后变量
const sourceList = ref([]);
const seriesList = ref([]);
const btnSave = ()=>{
sourceList.value = [];
seriesList.value = [];
const arrCompany = ['product',...selectedCompany.value];
sourceList.value.push(arrCompany)
const arrType = selectType.value.map(item=>[item]);
for (let index = 0; index < arrType.length; index++) {
const element = arrType[index];
let arr =[]
for (let j = 0; j < selectedCompany.value.length; j++) {
const num = Math.random()*100;
arr.push(num.toFixed(2))
}
sourceList.value.push([...element,...arr])
}
console.log(sourceList.value);
for (let i = 0; i < selectedCompany.value.length; i++) {
if(selectEcharts.value === '1'){
seriesList.value.push({ type: 'bar' });
}else{
seriesList.value.push({ type: 'line' });
}
}
// 要把数据拼装成这样的
// sourceList.value = [
// // ['product', 'A公司', 'B公司', 'C公司','D公司'],
// // ['铅笔', 43.3, 85.8, 93.7,11],
// // ['钢笔', 83.1, 73.4, 55.1,22],
// // ['毛笔', 86.4, 65.2, 82.5,33],
// // ['碳素笔', 72.4, 53.9, 39.1,44]
// ];
getData();
}
// 获得数据
// ecahrts
const getData = ()=>{
if(!chartInstance){
chartInstance = echarts.init(chart.value);
const option = {
legend: {},
tooltip: {},
dataset: {
source: sourceList.value
},
xAxis: { type: 'category' },
yAxis: {},
series: seriesList.value
};
chartInstance.setOption(option);
}else{
chartInstance.setOption({
series: seriesList.value,
dataset: {
source: sourceList.value
},
});
}
}
onMounted(() => {
// 获取数据
// getData();
});
</script>