父组件:
<pieChartNormal :opt="contractStatics" style="width: 100%;height: 100%;" />
import pieChartNormal from "./components/pieChartNormal";
data() {
return {
contractStatics: {
seriesData: [{
name: '技术服务类',
value: 30.5,
itemStyle: {
color: '#3562D4',
},
},
{
name: '监理监测类',
value: 41.4,
itemStyle: {
color: '#2BC4CD',
},
},
{
name: '工程总承包类',
value: 21.1,
itemStyle: {
color: '#E68B29',
},
}],
}
}
}
子组件:
<template>
<div style="width: 100%;height: 100%;">
<ChartPanel ref="chart" :option="options" :style="opt.yAxisName ? 'height:calc(100% - 16px)' : ''"></ChartPanel>
</div>
</template>
<script>
import * as echarts from 'echarts'
import ChartPanel from '@/components/ChartPanel';
export default {
components: {
ChartPanel
},
props: {
opt: {
type: Object,
default() {
return {}
}
}
},
data() {
return {
options: null
}
},
watch: {
opt: {
deep: true,
immediate: true,
handler(val) {
this.getOpt(val)
}
}
},
methods: {
getOpt(val) {
let {
seriesData
} = val
let color = ['#3666E0', '#26D7E0', '#F0922E']
this.options = {
animation: true,
legend: {
orient: 'vertical',
show: true,
x: '40%',
y: 'center',
itemWidth: 0,
itemHeight: 0,
textStyle: {
color: '#595D64',
fontSize: 14,
lineHeight: 20,
rich: {
percent0: {
color: color[0],
fontSize: 14,
fontWeight: 700
},
percent1: {
color: color[1],
fontSize: 14,
fontWeight: 700
},
percent2: {
color: color[2],
fontSize: 14,
fontWeight: 700
},
},
},
formatter: name => {
let dataIndex = 0
let obj = (seriesData.filter((item, index) => {
if (item.name == name) {
dataIndex = index
return item
}
}))[0]
return obj.name + ' {percent'+ dataIndex +'|' + obj.value + '亿元} ' +
' {percent' + dataIndex + '|30%}'
},
},
tooltip: {
borderWidth: 0,
show: true,
formatter: params => {
if (params.seriesName != '内边线') {
return `<div style="font-weight:700">${params.name}</div>
<div>
<span style="color:${params.color};font-weight:700">${params.value}亿元 ${params.percent}%</span>
</div>
`
}
}
},
series: [
{
type: 'pie',
roseType: 'area',
radius: ['45%', '90%'],
center: ['15%', '50%'],
hoverAnimation: false,
z: 10,
color: color,
label: {
show: false,
},
data: seriesData,
labelLine: {
show: false,
},
},
{
type: "pie",
name: '内边线',
center: ["15%", "50%"],
radius: ["89%", "90%"],
label: {
show: false
},
hoverAnimation: false,
data: [{
value: 1,
itemStyle: {
normal: {
color: 'rgba(242, 244, 247, 1)'
}
}
}]
},
],
};
this.$nextTick(() => {
this.$refs.chart.initChart(echarts, chart => {
this.options && chart.setOption(this.options, true);
});
})
}
}
}
</script>