具体效果如下
soogif (2).gif
具体代码如下
<template>
<div class="container">
<div class="echarts" ref="echarts"></div>
</div>
</template>
<script>
import echarts from "echarts";
export default {
name: "safe",
data() {
return {
chartInstance: null,
allData: null, //服务器返回的数据
currentPage: 1, //当前显示页数
totalPage: 0, // 共有多少页
timerId: null, // 定时器标识
};
},
mounted() {
this.initChart();
this.getData();
window.addEventListener("resize", this.screenAdapter);
// 在页面加载完成的时候, 主动进行屏幕的适配
this.screenAdapter();
},
destroyed() {
clearInterval(this.timerId);
// 在组件销毁的时候, 需要将监听器取消掉
window.removeEventListener("resize", this.screenAdapter);
},
methods: {
// 初始化echartInstance对象
initChart() {
this.chartInstance = echarts.init(this.$refs.echarts);
// 对图表初始化配置的控制
var initOption = {
backgroundColor: "#000E1A",
title: {
text: "▎商家销售统计",
left: 20,
top: 20,
},
grid: {
top: "20%",
left: "3%",
right: "6%",
bottom: "3%",
containLabel: true, // 距离是包含坐标轴上的文字
},
xAxis: {
type: "value",
},
yAxis: {
type: "category",
},
tooltip: {
trigger: "axis",
axisPointer: {
type: "line",
z: 0,
lineStyle: {
width: 66,
color: "#2D3443",
},
},
},
series: [
{
type: "bar",
label: {
show: true,
position: "right",
textStyle: {
color: "white",
},
},
barWidth: 33,
itemStyle: {
barBorderRadius: [0, 33, 33, 0],
// 指明颜色渐变的方向
// 指明不同百分比之下颜色的值
color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [
// 百分之0状态之下的颜色值
{
offset: 0,
color: "#5052EE",
},
// 百分之100状态之下的颜色值
{
offset: 1,
color: "#AB6EE5",
},
]),
},
},
],
};
this.chartInstance.setOption(initOption);
// 对图标鼠标事件监听
this.chartInstance.on("mouseover", () => {
clearInterval(this.timerId);
});
this.chartInstance.on("mouseout", () => {
this.startInterval();
});
},
// 获取服务器的数据
async getData() {
const { data: res } = await this.$http.get("seller");
// console.log(res);
this.allData = res;
// 对数据排序
this.allData.sort((a, b) => {
return b.value - a.value;
});
// 每五个元素显示一页
// console.log(this.allData.length);
this.totalPage =
this.allData.length % 5 === 0
? this.allData.length / 5
: this.allData.length / 5 + 1;
this.updateChart();
// 启动定时器
this.startInterval();
},
// 更新图表
updateChart() {
const start = (this.currentPage - 1) * 5;
const end = this.currentPage * 5;
const showData = this.allData.slice(start, end);
const sellerName = showData.map((item) => {
return item.name;
});
const sellerValue = showData.map((item) => {
return item.value;
});
// console.log(res);
var dataOption = {
yAxis: {
data: sellerName,
},
series: [
{
data: sellerValue,
},
],
};
this.chartInstance.setOption(dataOption);
},
startInterval() {
if (this.timerId) {
clearInterval(this.timerId);
}
this.timerId = setInterval(() => {
this.currentPage++;
if (this.currentPage > this.totalPage) {
this.currentPage = 1;
}
this.updateChart();
}, 3000);
},
// 当浏览器的大小发生变化的时候, 会调用的方法, 来完成屏幕的适配
screenAdapter() {
const titleFontSize = (this.$refs.echarts.offsetWidth / 100) * 3.6;
// 和分辨率大小相关的配置项
const adapterOption = {
title: {
textStyle: {
fontSize: titleFontSize,
},
},
tooltip: {
axisPointer: {
lineStyle: {
width: titleFontSize,
},
},
},
series: [
{
barWidth: titleFontSize,
itemStyle: {
barBorderRadius: [0, titleFontSize / 2, titleFontSize / 2, 0],
},
},
],
};
this.chartInstance.setOption(adapterOption);
// 手动的调用图表对象的resize 才能产生效果
this.chartInstance.resize();
},
},
};
</script>
<style scoped lang="less">
.container {
width: 100%;
height: 100%;
.echarts {
width: 100%;
height: 100%;
}
}
</style>











网友评论