跳到主要内容位置

Vue 3.0 + ECharts 实现电影票房自定义环形图教程

上期视频我们实现了票房的柱状图展示,那么这期视频我们来看一个环形图的配置。先看一下最终效果,环形图的各个部分表示的是某个电影的票房占比,占比越高的颜色越浅,占比越低的颜色越深,每部分还会有指示线,配有文本指明这块区域是哪部电影,占比是多少。鼠标移到某区域的时候,会显示提示框,上面有电影名和具体的数值。

在大体了解做成什么样之后,我们来看一下组件的主要代码。

创建组件

环形图组件的代码位于 src/components/DoughnutChart.vue 中,它的代码跟柱状图的几乎一样:

  • 根据传递进来的票房数据生成图表数据。
  • 这里要注意的是,环形图需要的数据只有一个维度,在 populateMovieData() 函数中只返回了一个数组,数组中的对象有 name 和 value 属性。
  • 最后使用封装的 echarts 基础组件进行渲染。

因为和柱状图的代码极其相似,那么我们是否可以把它抽离成通用的呢?答案是肯定的,可以参照之前的 Vue 3 Todo App 教程把它抽离成 composables,这里就不演示了。

<template>
<Chart :options="options" />
</template>

<script setup>
import Chart from "./Chart.vue";
import doughnutChartCreator from "../charts/doughnutChart.js";
import { computed, toRefs } from "vue";

const props = defineProps({
boxOfficeData: Array,
});

const { boxOfficeData } = toRefs(props);

const options = computed(() => {
const data = populateMovieData(boxOfficeData.value);
return doughnutChartCreator(data);
});

function populateMovieData(rawData) {
let data = [];
rawData.forEach((movie) => {
data.push({
name: movie?.name,
value: movie?.boxOffice,
});
});
return data;
}
</script>

编写配置

我们接下来看一下 doughnutChartCreator() 中的配置项,代码位于 src/charts/doughnutChart.js 中。它导出了一个接收 data 作为参数的函数,并返回图表的配置项,我们来看一下它们的含义。

  • title 部分和柱状图的一样,设置了标题和字体。
  • tooltip 是设置鼠标移到环形图某个区域时,弹出的提示框。
    • trigger 设置为 item 意思为触发提示框的是环形图的各块区域。
    • 后面的属性分别设置了内间距、边框、阴影和文本样式。内间距的设置方法、顺序和 css 中的一样,只是用数组表示,extraCssText 则是设置自定义的 css 样式。
  • color 设置环形图所用到的颜色,通过 hsl 颜色表示法表示,只需要调整饱和度和亮度部分,就能表示浅红到深红的颜色。
  • series 用来配置环形本身。
    • 类型为 pie 饼图,然后通过 radis 设置内、外半径来把它变成环形图。
    • 起始角度设置为 160 度,这样各个电影在图表中的分布比较平均。再设置距离上方 60 个距离单位。
    • label 用来设置环形图各个部分的文本说明,给它设置为显示在外侧,与指示线对齐,调整边界的距离,颜色和字体。
      • label 中的文本使用 formatter 和 rich 来对某部分文本单独设置样式。
      • formatter 中的 {b}、{d} 是占位符,分别表示数据名,也就是电影名,和百分比。 {d}% 前边的 d | 相当于是 css 中的 class,可以在 rich 中引用。
      • rich 里通过引用 d 来设置百分比的样式,给文字添加背景、圆角和间距,这样文字就会显示为 tag 样式,然后设置字体颜色和加粗。
    • emphasis 设置鼠标移到环形区域后的高亮样式,给 label 设置加粗并增加字体尺寸,这样鼠标移上去,label 就有了放大的效果。
    • labelLine 用于设置指示线的样式。
      • length 设置起始段长度,length2 设置弯折后的长度。
      • 再把它设置为平滑、虚线。
    • 最后,把传递进来的 data 设置到 series 中。
export default (data) => ({
title: {
text: "电影当日综合票房占比",
subtext: "数据来自猫眼电影(非实时)",
textStyle: {
fontSize: 24,
color: "hsl(0deg, 100%, 100%)",
},
subtextStyle: {
fontSize: 14,
color: "hsl(0deg, 20%, 75%)",
},
},
tooltip: {
trigger: "item",
padding: [14, 24],
borderWidth: 0,
extraCssText: "box-shadow: 0 0 24px hsl(0, 100%, 50%, 0.2);",
textStyle: {
fontWeight: "bold",
color: "hsl(0deg, 0%, 40%)",
},
},
color: [
"hsl(0deg, 100%, 70%)",
"hsl(0deg, 90%, 60%)",
"hsl(0deg, 80%, 50%)",
"hsl(0deg, 70%, 45%)",
"hsl(0deg, 60%, 40%)",
"hsl(0deg, 50%, 35%)",
"hsl(0deg, 40%, 30%)",
],
series: [
{
type: "pie",
radius: ["50%", "70%"],
startAngle: 160,
top: 60,
label: {
show: true,
position: "outer",
alignTo: "labelLine",
edgeDistance: "3%",
distanceToLabelLine: 20,
color: "hsl(0deg, 100%, 98%)",
fontSize: 14,
fontWeight: "bold",
formatter: "{b} {d|{d}%}",
rich: {
d: {
backgroundColor: "hsl(0deg, 100%, 70%)",
borderRadius: 4,
padding: [4, 8],
color: "white",
fontWeight: "bold",
},
},
},
emphasis: {
label: {
show: true,
fontSize: 18,
fontWeight: "bold",
},
},
labelLine: {
length: 30,
length2: "20%",
smooth: true,
lineStyle: {
type: "dashed",
},
},
data: data,
},
],
backgroundColor: "transparent",
});

预览效果

我们在 App.vue 的 template 中加载 DoughnutChart 组件:

<template>
<div class="wrapper">
<BarChart :boxOfficeData="boxOfficeData" class="chart" />
<DoughnutChart :boxOfficeData="boxOfficeData" class="chart" />
</div>
</template>

启动一下服务,就可以看到环形图的实际效果了。 好了,这个就是 Vue + Echarts 实现电影票房环形图的教程,你学会了吗?如果有帮助,请三连,想更好的学前端,请关注峰华前端工程师,感谢观看!

提示

一系列的课程让你成为高级前端工程师。课程覆盖工作中所有常用的知识点和背后的使用逻辑,示例全部都为工作项目简化而来,学完即可直接上手开发!

即使你已经是高级前端工程师,在课程里也可能会发现新的知识点和技巧,让你的工作更加轻松!

《React 完全指南》课程,连载中现只需 48 元(领取优惠券)点击查看详情。

《Vue 3.x 全家桶完全指南与实战》课程,包括 Vue 3.x、TypeScript、Vue Router 4.x、Vuex 4.x 所有初级到高级的语法特性详解,让你完全胜任 Vue 前端开发的工作。点击查看详情。

《React即时通信UI实战》课程,利用 Storybook、Styled-components、React-Spring 打造属于自己的组件库。

《JavaScript 基础语法详解》本人所著图书,包含 JavaScript 全面的语法知识和新特性, 可在京东、当当、淘宝等各大电商购买