
需求:三级分类的饼图
- 1、一级分类通过左右箭头切换的方式展现
- 2、二级分类通过饼图的形式展现(默认不显示每块区域name,高亮时候显示name)
- 3、三级分类通过鼠标放在饼图某一区域上时以文字的形式呈现(自定义提示文字)
<template>
<div class="w100 h100">
<!-- 左右切换箭头及一级分类名字 -->
<div>
<div class="title">{{ pieData[index].name }}</div>
<div v-if="index > 0" @click="onLeft" class="left">《</div>
<div v-if="index < pieData.length - 1" @click="onRight" class="right">
》
</div>
</div>
<div ref="pie" class="w100 h100"></div>
</div>
</template>
<script>
import { ququ } from "../../public/static/theme/ququ";
export default {
data() {
return {
size: null,
pieChart: null,
pieData: [
{
name: "服装",
children: [
{
name: "上衣",
value: 100,
children: [
{
name: "男士",
value: 10,
},
{
name: "女士",
value: 30,
},
],
},
{
name: "裤子",
value: 210,
children: [
{
name: "男士",
value: 10,
},
{
name: "女士",
value: 30,
},
],
},
{
name: "裙子",
value: 400,
children: [
{
name: "男士",
value: 10,
},
{
name: "女士",
value: 30,
},
],
},
{
name: "棒球服",
value: 233,
children: [
{
name: "男士",
value: 10,
},
{
name: "女士",
value: 30,
},
],
},
{
name: "羽绒服",
value: 280,
children: [
{
name: "男士",
value: 10,
},
{
name: "女士",
value: 30,
},
],
},
],
},
{
name: "手机",
children: [
{
name: "apple",
value: 220,
children: [
{
name: "大屏",
value: 110,
},
{
name: "小屏",
value: 30,
},
],
},
{
name: "华为",
value: 410,
children: [
{
name: "大屏",
value: 150,
},
{
name: "小屏",
value: 230,
},
],
},
],
},
],
index: 0,
};
},
mounted() {
this.init();
this.getData();
window.addEventListener("resize", this.screenResize);
this.screenResize();
},
beforeDestroy() {
window.removeEventListener("resize", this.screenResize);
},
methods: {
init() {
this.$echarts.registerTheme("ququ", ququ);
this.pieChart = this.$echarts.init(this.$refs.pie, "ququ");
let initOption = {
title: {
text: "▍三级饼图",
left: 40,
top: 40,
textStyle: {
color: "#fff",
},
},
tooltip: {
trigger: "item",
show: true,
formatter: (arg) => {
let str = "";
arg.data.children.forEach((item) => {
str += `${item.name}:${item.value}
`;
});
return str;
},
},
legend: {
show: true,
top: 130,
icon: "circle",
textStyle: {
color: "#fff",
},
},
series: [
{
type: "pie",
radius: "50%",
center: ["50%", "50%"],
label: {
show: false,
},
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: "rgba(0, 0, 0, 0.5)",
},
label: {
show: true,
},
labelLine: {
show: false,
},
},
},
],
};
this.pieChart.setOption(initOption);
},
onLeft() {
this.index--;
this.getData();
},
onRight() {
this.index++;
this.getData();
},
getData() {
let dataOption = {
series: [
{
name: this.pieData[this.index].name,
data: this.pieData[this.index].children,
},
],
};
this.pieChart.setOption(dataOption);
},
screenResize() {
this.$nextTick(() => {
let width = this.$refs.pie.offsetWidth;
this.size = (width / 100) * 3.6;
let screenOption = {
title: {
textStyle: {
fontSize: this.size,
},
},
legend: {
itemWidth: this.size / 2,
itemHeight: this.size / 2,
},
};
this.pieChart.setOption(screenOption);
this.pieChart.resize();
});
},
},
};
</script>
<style scoped lang="less">
.left,
.right,
.title {
color: #fff;
position: absolute;
z-index: 999;
}
.left {
left: 60px;
top: 50%;
transform: translateY(-50%);
}
.right {
right: 60px;
top: 50%;
transform: translateY(-50%);
}
.title {
right: 60px;
bottom: 60px;
font-size: 30px;
}
</style>