vue3和echarts,使用后台数据进行渲染,图表不显示,但是当数据写死时就,图表就会显示
mounted() {
this.load()
this.echarts1();
},
watch:{
data:{
handler(newVal,oldVal){
this.echarts1();
console.log(newVal,oldVal)
},
deep:true,
}
},
methods: {
echarts1() {
let chartDom = document.getElementById("echarts1");
let myChart = echarts.init(chartDom);
let option;
let teachingReward = [];
request({
url: '/all/number',
headers: {
isToken: true
},
timeout: 20000,
method: 'get',
}).then((res) => {
for (let i = 0; i < 11; i++) {
this.teachingReward[i] = res.data.items[i];
}
console.log(this.teachingReward);
teachingReward = this.teachingReward;
option = {
title: {
text: "",
textStyle: {
color: "#000"
}
},
tooltip: {
trigger: 'axis',
axisPointer: { // 坐标轴指示器,坐标轴触发有效
type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
}
},
toolbox: {
feature: {
saveAsImage: {}
}
},
xAxis: [{
name: '项目',
type: 'category',
axisLabel: {
fontSize: 12
},
data: ['学术论文', '纵向项目', '横向项目', '专利', '软件著作权', '科研成果奖励', '教学成果奖励', '出版刊物', '学科竞赛', '参加会议', '成果转化']
}],
yAxis: [{
type: 'value',
name: '数量',
axisLabel: {
fontSize: 18
},
},],
series: [{
name: '',
type: 'bar',
label: {
show: true,
fontSize: 18,
color: '#000',
position: 'top'
},
data: teachingReward
},
]
};
})
option && myChart.setOption(option);
}
}
这是我运行的结果和控制台打印的数据
试试option.series[0].data = this.teachingReward
this.teachingReward 是个 Proxy,不是数组呀。取 Proxy 数组转化一下 JSON.parse(JSON.stringify(teachingReward ))
但是我看你上面有 let teachingReward = [], 用这个就可以了,this.xxx 被 Vue3 代理了, 下面也要对应使用,不要一会有 this, 一会没 this
如果是这样的话,那就只有一种可能,就是你获取到的数据的格式不正确,你试着转换一下
你应该先给图表初始化init,给空的默认值,拿到后端的数据后,再调用setOption方法,类似我这样哦~
<!--示例代码-->
<template>
<div >
<!-- 柱状图 -->
<div id="echarts1" style="width: 600px; height: 250px"></div>
</div>
</template>
<script>
export default {
data() {
return {
teachingReward:[]
};
},
mounted() {
this.$nextTick(() => {
this.echarts1();
})
},
watch:{
},
methods: {
echarts1() {
let myChart= this.$echarts.init(
document.getElementById("echarts1")
);
let option;
let teachingReward = [];
this.$axios.get('http://112.125.90.247:81/api/Data/GetAsync').then(res=>{
for (let i = 0; i <res.data.response.data.length;i++){
this.teachingReward[i] = res.data.response.data[i].Num
}
teachingReward = this.teachingReward;
console.log(teachingReward)
option = {
title: {
text: "111",
textStyle: {
color: "red"
}
},
tooltip: {
trigger: 'axis',
axisPointer: { // 坐标轴指示器,坐标轴触发有效
type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
}
},
toolbox: {
feature: {
saveAsImage: {}
}
},
xAxis: [{
name: '项目',
type: 'category',
axisLabel: {
fontSize: 12
},
data: ['学术论文', '纵向项目', '横向项目', '专利', '软件著作权', '科研成果奖励', '教学成果奖励']
}],
yAxis: [{
type: 'value',
name: '数量',
axisLabel: {
fontSize: 18
},
},],
series: [{
name: '',
type: 'bar',
label: {
show: true,
fontSize: 18,
color: '#000',
position: 'top'
},
data: teachingReward
},
]
};
}).then(()=>{
option && myChart.setOption(option);
})
}
}
};
</script>
改成异步