vue2+eacharts 获取后端数据显示饼图并且是父子组件的方式,目前的问题是,控制台打印子组件先出现一遍有内容,然后报错 echarts is not defined然后再出现父组件打印数据,下面是我的代码,另外如果这个弄好了,我会再引入一个会话次数饼状图,那么是不是他俩用一个子组件就行?在el-tabs的时候判断是哪个图如何设置一个变量传不同的参数就行?
父组件
<el-tabs v-model="activeName">
<el-tab-pane label="来源渠道饼状图" name="second">
<vab-chart-pie title="来源渠道饼状图" :pieData="pieData" v-if="chartDataIsReady"/>
</el-tab-pane>
<el-tab-pane label="会话次数饼状图" name="third">
<!-- <vab-chart-pie title="会话次数饼状图" /> -->
</el-tab-pane>
</el-tabs>
//return里的内容
pieData: {
//子组件中需要用到的数组
lineData: [],
SearData: [],
},
async mounted() {
await this.fetchDataPie()
this.chartDataIsReady = true;
},
//获取饼图数据
fetchDataPie(){
getListPieSource().then((res)=>{
// 将对象转换为数组对象
const arr = Object.keys(res).map(key => ({name:key, value: res[key] }));
this.pieData.SearData=arr
// this.SearData=arr
// 使用 Object.keys() 方法获取对象的键
this.pieData.lineData = Object.keys(res);
// 如果 lineData 属性之前不存在
// this.$set(this.pieData, 'SearData', arr); // 使用 Vue.set 或 this.$set 来添加响应式属性
// this.$set(this.pieData, 'lineData', Object.keys(res)); // 使用 Vue.set 或 this.$set 来添加响应式属性
console.log('父---this.pieData')
console.log(this.pieData)
})
},
子组件
<template>
<!-- <el-col :lg="8" :md="12" :sm="24" :xl="6" :xs="24"> -->
<el-col :span="24">
<el-card shadow="hover">
<template #header>
<!-- <span>{{ title }}</span> -->
</template>
<!-- :init-options="initOptions" :option="option" -->
<vab-chart ref="pieChart" theme="vab-echarts-theme" />
</el-card>
</el-col>
</template>
<script>
import VabChart from '@/extra/VabChart'
export default {
name: 'VabChartPie',
components: {
VabChart,
},
props: {
title: {
type: String,
default: '',
},
pieData: {
type: Object,
// required: true, // 这个prop是必须的
// default: () => ({}) // 提供一个默认值,如果父组件没有传递Data
},
},
data() {
return {
}
},
created() {
},
mounted() {
console.log('子———this.pieData')
console.log(this.pieData)
console.log(this.pieData.SearData)
this.initPieChart();
},
methods: {
initPieChart() {
const pieChart = echarts.init(this.$refs.pieChart);
const option = {
tooltip: {
trigger: 'item'
},
series: [{
name: '访问来源',
type: 'pie',
radius: '55%',
data: this.pieData.SearData,
// this.data.values.map((value, index) => {
// return {
// value: value,
// name: this.data.categories[index]
// };
// }),
itemStyle: {
emphasis: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}]
};
pieChart.setOption(option);
}
}
}
</script>