Ecahrts竖向柱状图实现自动滚动

 效果如下:

1.首先声明一个timer定时器标识

let timer: NodeJS.Timer; // 定时器

2.再声明窗口展示的数量,yAxisIndex2用来记录当前index已经加了多少,方便再formatter中格式化标题的相关信息

const dataZoomEndValue = 6; // 数据窗口范围的结束数值(一次性展示几个)
let yAxisIndex2 = 0; // 表示右侧Y轴从那个刻度开始

3.在option中设置datazoom的相关参数

dataZoom: [
	{
		show: false, // 是否显示滑动条
		yAxisIndex: [0, 1], // // 表示这个 dataZoom 组件控制 第一个 和 二个 yAxis
		startValue: 0, // 数据窗口范围的起始数值
		endValue: dataZoomEndValue // 数据窗口范围的结束数值(一次性展示几个)
	}
],

4.开启一个定时器

getArrByKey(data, "name"):代表的是Y轴标题的数据

getArrByKey(data, "value"):代表的是X轴数量的数据

// 开启定时器自动滚动
if (getArrByKey(data, "name").length > 0 && data.length > 0) {
	timer = setInterval(() => {
		// 每次向后滚动一个,最后一个从头开始
		if (option.dataZoom[0].endValue === getArrByKey(data, "value").length - 1) {
			option.dataZoom[0].startValue = 0; // 数据窗口范围的起始数值
			option.dataZoom[0].endValue = dataZoomEndValue; // 数据窗口范围的结束数值
			yAxisIndex2 = 0;
		} else {
            // 数据窗口范围的起始数值
			option.dataZoom[0].startValue = option.dataZoom[0].startValue + 1; 
            // 数据窗口范围的结束数值
			option.dataZoom[0].endValue = option.dataZoom[0].endValue + 1; 
			yAxisIndex2 += 1;
		}
		myChart.setOption(option);
	}, 2000);
}

5.最后别忘了清除定时器

onUnmounted(() => {
	clearInterval(timer);
});

附上完整代码:

<template>
	<div class="h-220px" style="width: 100%" ref="pieChart"></div>
</template>

<script lang="ts" setup>
import { watch, ref, onMounted, onBeforeUnmount } from "vue";
import * as echarts from "echarts";
import { useEcharts } from "@/hooks/useEcharts";
const pieChart = ref();
const props = defineProps({
	data: {
		type: Object,
		default: () => {}
	}
});
watch(
	() => props.data,
	() => {
		initPieChart();
	},
	{
		deep: true
	}
);
let timer: NodeJS.Timer; // 定时器
const initPieChart = () => {
	// 清除定时器的影响
	if (timer) {
		clearInterval(timer);
	}
	// 判断当前echarts是否存在
	let myChart = echarts.getInstanceByDom(pieChart.value);
	if (myChart == null) {
		myChart = echarts.init(pieChart.value);
	}
	let max = Number(props.data[0]?.stopTime ?? 0); // 假设最大值为数组的第一个元素
	for (let i = 1; i < props.data.length; i++) {
		if (Number(props.data[i].stopTime) > max) {
			// 如果当前元素比最大值大,则更新最大值
			max = props.data[i].stopTime;
		}
	}
	let backData = new Array(props.data.length).fill(max + 1);
	const getArrByKey = (data: any, k: string) => {
		let key = k || "value";
		let res: Array<number> = [];
		if (props.data) {
			props.data.forEach(function (t: any) {
				res.push(t[key]);
			});
		}
		return res;
	};
	const dataZoomEndValue = 6; // 数据窗口范围的结束数值(一次性展示几个)
	let yAxisIndex2 = 0; // 表示右侧Y轴从那个刻度开始

	const option = {
		grid: {
			top: "10%",
			bottom: "-6%",
			right: "2%",
			left: 0,
			containLabel: true
		},
		dataZoom: [
			{
				show: false, // 是否显示滑动条
				yAxisIndex: [0, 1], // // 表示这个 dataZoom 组件控制 第一个 和 二个 yAxis
				startValue: 0, // 数据窗口范围的起始数值
				endValue: dataZoomEndValue // 数据窗口范围的结束数值(一次性展示几个)
			}
		],
		xAxis: {
			show: false
		},
		yAxis: [
			{
				triggerEvent: true,
				show: true,
				inverse: true,
				data: getArrByKey(props.data, "name"),
				axisLine: {
					show: false
				},
				splitLine: {
					show: false
				},
				axisTick: {
					show: false
				},
				axisLabel: {
					interval: 0,
					color: "#8693a4",
					align: "right",
					margin: 18,
					fontSize: 12,
					fontWeight: 400
				}
			},
			{
				name: "时长         占比",
				//name的样式设计
				nameTextStyle: {
					align: "left",
					padding: [-220, 0, 0, 0], //地区名称的位置
					color: "#8693a4",
					fontSize: "12"
				},
				triggerEvent: true,
				show: true,
				inverse: true,
				data: getArrByKey(props.data, "name"),
				axisLine: {
					show: false
				},
				splitLine: {
					show: false
				},
				axisTick: {
					show: false
				},
				axisLabel: {
					interval: 0,
					color: "#8693a4",
					align: "left",
					margin: 0,
					fontSize: 12,
					fontWeight: 400,
					formatter: function (value: any, index: number) {
						// return `<div style="width: 100px; display: flex;justify-content: space-between;align-items: center;"><span>${
						// 	props.data[index + yAxisIndex2].stopTime
						// }</span><span>${props.data[index + yAxisIndex2].stopTimeRatio}%</span></div>`;
						// return props.data[index + yAxisIndex2].stopTime + "     " + props.data[index + yAxisIndex2].stopTimeRatio + "%";
						return (
							"{a|" +
							props.data[index + yAxisIndex2].stopTime +
							"}" +
							"{b|" +
							"     " +
							props.data[index + yAxisIndex2].stopTimeRatio +
							"%" +
							"}"
						);
					},
					rich: {
						a: {
							width: 40
						},
						b: {
							width: 40
						}
					}
				}
			}
		],
		series: [
			{
				name: "条",
				type: "bar",
				yAxisIndex: 0,
				data: props.data.map((item: any) => item.stopTime),
				barWidth: 10,
				itemStyle: {
					color: "#e82461",
					barBorderRadius: [0, 30, 30, 0]
				}
			},
			{
				// For shadow
				type: "bar",
				itemStyle: {
					normal: {
						color: "rgba(255, 255, 255, 0.1)",
						barBorderRadius: [0, 0, 0, 0]
					}
				},
				barWidth: 10,
				barGap: "-100%",
				barCategoryGap: "40%",
				data: backData,
				animation: false,
				yAxisIndex: 1, //使用右侧y轴
				tooltip: {
					show: false
				}
			}
		]
	};

	if (props.data.length > 0 && myChart) {
		useEcharts(myChart, option);
	} else {
		myChart.clear(); //清除图表所有配置项
	}

	// 开启定时器自动滚动
	if (getArrByKey(props.data, "name").length > dataZoomEndValue && props.data.length > dataZoomEndValue) {
		timer = setInterval(() => {
			// 每次向后滚动一个,最后一个从头开始
			if (option.dataZoom[0].endValue === getArrByKey(props.data, "value").length - 1) {
				option.dataZoom[0].startValue = 0; // 数据窗口范围的起始数值
				option.dataZoom[0].endValue = dataZoomEndValue; // 数据窗口范围的结束数值
				yAxisIndex2 = 0;
			} else {
				option.dataZoom[0].startValue = option.dataZoom[0].startValue + 1; // 数据窗口范围的起始数值
				option.dataZoom[0].endValue = option.dataZoom[0].endValue + 1; // 数据窗口范围的结束数值
				yAxisIndex2 += 1;
			}
			myChart?.setOption(option);
		}, 2000);
	}
};
onMounted(() => {
	initPieChart();
});
onBeforeUnmount(() => {
	clearInterval(timer);
});
</script>

<style lang="scss" scoped></style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/727250.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言程序设计-7 数组

在程序设计中&#xff0c;为了处理方便&#xff0c;把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在&#xff23;语言中&#xff0c;数组属于构造数据类型。一个数 组可以分解为多个数组元素&#xff0c;这些数组元素可以是基本数…

Hive笔记-3

3.2.2 查看表 1) 展示所有表 (1) 语法: 语法: SHOW TABLES [IN database_name] LIKE [identifier_with_wildcards]; In database_name 写的是查哪个数据库,一般不写默认是当前数据库 Like 后面跟通配符表达式 (2) 案例: 查看在 db_hive1 数据库里有没有以 stu 开头的表 …

DeviceNet总线粗缆和细缆连接器

DeviceNet总线粗缆和细缆连接器 DeviceNet的粗缆和细缆连接器是网络中不可或缺的部分&#xff0c;它们负责将不同的设备连接起来&#xff0c;实现数据的传输。粗缆通常用于主干线路&#xff0c;而细缆则用于分支线路。粗缆和细缆的芯位分布有所不同&#xff0c;粗缆通常有五个…

申办乙级资信证书,河南工程咨询单位流程详解

河南工程咨询单位申办乙级资信证书的流程详解如下&#xff1a; 一、前期准备阶段 研读政策文件&#xff1a; 研读《工程咨询行业管理办法》&#xff08;国家发展改革委2017年第9号令&#xff09;以及《国家发展改革委关于印发<工程咨询单位资信评价标准>的通知》&#x…

【嵌入式Linux】<总览> 文件IO(更新中)

文章目录 前言 一、常用函数 1. open函数 2. close函数 3. write函数 4. read函数 5. dup函数 6. dup2函数 二、文件读写细节 1. 换行符 2. 文件描述符 3. errno和perror 前言 在Linux系统中&#xff0c;一切皆文件。因此&#xff0c;掌握Linux下文件IO常用的函数…

高效电商数据分析:电商爬虫API与大数据技术的融合应用

一、引言 随着电子商务的迅猛发展和数据量的爆炸式增长&#xff0c;电商数据分析已成为企业决策的关键依据。在竞争激烈的电商市场中&#xff0c;如何高效、准确地获取并分析数据&#xff0c;以洞察市场趋势、优化运营策略、提升用户体验&#xff0c;成为电商企业面临的重要挑…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 连续字母长度(100分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

3D Web轻量化引擎HOOPS Commuicator是如何创建AEC查看器的?

在当今数字化时代&#xff0c;建筑、工程和施工&#xff08;AEC&#xff09;行业正经历着一场技术革命。HOOPS Communicator&#xff0c;一款基于HOOPS Web平台的3D Web轻量化引擎&#xff0c;正是这场革命的先锋之一。本文将探讨HOOPS Communicator是如何创建AEC查看器的&…

[论文笔记]Are Large Language Models All You Need for Task-Oriented Dialogue?

引言 今天带来论文Are Large Language Models All You Need for Task-Oriented Dialogue?的笔记。 主要评估了LLM在完成多轮对话任务以及同外部数据库进行交互的能力。在明确的信念状态跟踪方面&#xff0c;LLMs的表现不及专门的任务特定模型。然而&#xff0c;如果为它们提…

【Codesys】-计算开机通电运行时间,累计正常使用时间,故障停机时间

应客户要求&#xff0c;在程序添加了这个用来计算开机运行时间&#xff0c;原理就是取当前时间减去一开始记录的时间&#xff0c;没什么特别要求&#xff0c;记录一下使用的变量类型和数据写法&#xff0c;防止忘记了。 下文只写了一个开机通电运行时间的写法&#xff0c;累计…

解决navicat连接oracle19c数据库缺少oci.dll

下载oci.dll文件 搜索Oracle Instant Client Downloads Oracle Instant Client Downloads点击 Oracle Instant Client Downloads 超链接 根据自己的操作系统按需选择 以windows64位为例&#xff0c;下载 Version 19.23.0.0.0的OCI压缩包 解压到Navicat的安装根路径下&#xff…

红黑树(数据结构篇)

数据结构之红黑树 红黑树(RB-tree) 概念&#xff1a; 红黑树是AVL树的变种&#xff0c;它是每一个节点或者着成红色&#xff0c;或者着成黑色的一棵二叉查找树。对红黑树的操作在最坏情形下花费O(logN)时间&#xff0c;它的插入操作使用的是非递归形式实现红黑树的高度最多是…

视频融合共享平台LntonCVS视频监控安防系统运用多视频协议建设智慧园区方案

智慧园区&#xff0c;作为现代化城市发展的重要组成部分&#xff0c;不仅推动了产业的升级转型&#xff0c;也成为了智慧城市建设的核心力量。随着产业园区之间的竞争日益激烈&#xff0c;如何打造一个功能完善、智能化程度高的智慧园区&#xff0c;已经成为了业界广泛关注的焦…

软考高级论文真题“论大数据lambda架构”

论文真题 大数据处理架构是专门用于处理和分析巨量复杂数据集的软件架构。它通常包括数据收集、存储、处理、分析和可视化等多个层面&#xff0c;旨在从海量、多样化的数据中提取有价值的信息。Lambda架构是大数据平台里最成熟、最稳定的架构&#xff0c;它是一种将批处理和流…

怎么将几段音频合并在一起,试试这几个音频拼接小妙招

怎么将多个音频合并在一起呢&#xff1f;音频是我们日常工作生活中常见的文件&#xff0c;音频与我们息息相关&#xff0c;无论你是音乐爱好者&#xff0c;还是喜欢记录生活中的声音&#xff0c;都离不开音频。因此我们会遇到关于很多音频剪辑的难题&#xff0c;就像今天小编给…

某棋牌渗透测试

前言 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 一、信息收集 这里通过fofa进行收集&#xff0c;语法为&#xff1a;body某棋牌 && titlexxx 图1-1 fofa资产收集 …

第 402 场 LeetCode 周赛题解

A 构成整天的下标对数目 I 计数&#xff1a;遍历 h o u r s hours hours &#xff0c;记录 h o u r s [ i ] % 24 hours[i]\%24 hours[i]%24 的出现次数 class Solution {public:long long countCompleteDayPairs(vector<int>& hours) {vector<int> cnt(24);…

图像处理:Python使用OpenCV 减少图片噪音

文章目录 1. 均值滤波 (Mean Filtering)2. 高斯滤波 (Gaussian Filtering)3. 中值滤波 (Median Filtering)4.代码实现示例5.效果展示 在图像处理中&#xff0c;均值滤波、高斯滤波和中值滤波是三种常用的降噪方法。它们的实现原理各有不同&#xff1a; 1. 均值滤波 (Mean Filte…

Paper Reading: EfficientAD:毫秒级延迟的准确视觉异常检测

EfficientAD 简介方法高效的patch描述PDN教师pretraining 轻量级的师生模型逻辑异常检测异常图像的标准化 实验局限性 EfficientAD: Accurate Visual Anomaly Detection at Millisecond-Level Latencies EfficientAD&#xff1a;毫秒级延迟的准确视觉异常检测, WACV 2024 paper…

贪吃蛇——c语言版

文章目录 演示效果实现的基本功能技术要点源代码实现功能GameStart打印欢迎界面和功能介绍绘制地图创建蛇创建食物 GameRun打印提示信息蛇每走一步 GameEnd蛇死亡后继续游戏 演示效果 贪吃蛇1.0演示视频 将终端应用程序改为控制台主机 实现的基本功能 贪吃蛇地图绘制蛇吃食物的…