当前位置: 首页 > news >正文

vue3 echarts使用datazoom,鼠标绘制实现放大与缩小(还原)

echarts的datazoom提供了绘制放大的功能,但通过鼠标绘制只能进行放大
应需求放大与还原都通过鼠标行为实现,增加从右往左绘制时还原放大结果

放大与缩小

关键代码

// datazoom放大缩小编写
		const comp = myChart.value._model.getComponent('toolbox');
		const toolbox = myChart.value.getViewOfComponentModel(comp);
		const datazoom = toolbox._features.dataZoom;

		// 回退
		//datazoom.onclick(datazoom.ecModel,datazoom.api,'back');
		// 记录x的起始位置
		let x = -1;
		// 重写放大回调
		const onBrush = datazoom.constructor.prototype._onBrush;
		datazoom.constructor.prototype._onBrush = function (evt) {
			if (x === -1) {
				x = evt.areas[0].range[0];
			}

			if (evt.isEnd) {
				const zoomin = evt.areas[0].range[0] - x < 0;
				// 从右往左绘制返回放大前
				if (zoomin) {
					this._brushController.updateCovers([]); // 清除绘制区域
					this.onclick(this.ecModel, this.api, 'back');
				} else {
					onBrush.call(this, evt);
				}
				x = -1;
				updateTimeRange(myChart.value);
			} else {
				onBrush.call(this, evt);
			}
		};

		// 重写原型链方法后,需要重新创建datazoom对象。因为重写前创建的datazoom对象会执行原先的原型方法
		// 还原
		myChart.value._api.dispatchAction({
			type: 'restore',
			from: myChart.value.id,
			key: 'dataZoomSelect',
			dataZoomSelectActive: true,
		});
		//开启默认选中区域缩放
		myChart.value._api.dispatchAction({
			type: 'takeGlobalCursor',
			key: 'dataZoomSelect',
			dataZoomSelectActive: true,
		});
		// 拖动datazoom,更新时间
		myChart.value.on('datazoom', function (e: any) {
			updateTimeRange(myChart.value);
		});

完整代码

	const myChart = ref();

	const initTimeChart = (date: string[], data: number[] | null[]) => {
		// const date = [
		// 	'2024-12-01',
		// 	'2024-12-02',
		// 	'2024-12-03',
		// 	'2024-12-04',
		// 	'2024-12-05',
		// 	'2024-12-06',
		// 	'2024-12-07',
		// 	'2024-12-08',
		// 	'2024-12-09',
		// 	'2024-12-10',
		// 	'2024-12-11',
		// 	'2024-12-12',
		// 	'2024-12-13',
		// 	'2024-12-14',
		// 	'2024-12-15',
		// 	'2024-12-16',
		// 	'2024-12-17',
		// ];
		// const data = [100, 100, 100, null, null, 100, 100, 100, 100, 100, null, null, 100, 100, null, 100, 100];
		myChart.value = echarts.init(timeChartRef.value);

		const option = {
			tooltip: {
				trigger: 'axis',
				position: function (pt: any) {
					return [pt[0], '10%'];
				},
			},
			title: {
				left: 'center',
				text: '数据量',
			},
			toolbox: {
				feature: {
					dataZoom: {
						show: true,
						yAxisIndex: 'none',
						iconStyle: {
							//不需要图标可以设置隐藏按钮
							opacity: 1,
						},
					},
					// restore: {},
					// saveAsImage: {},
				},
			},
			xAxis: {
				type: 'category',
				boundaryGap: false,
				data: date,
			},
			yAxis: {
				type: 'value',
				boundaryGap: [0, '100%'],
				max: 1,
				interval: 1,
				// 于设置y轴的字体
				axisLabel: {
					show: false, //这里的show用于设置是否显示y轴下的字体 默认为true
					textStyle: {
						//textStyle里面写y轴下的字体的样式
						color: '#333',
						fontSize: 13,
					},
				},
				//用于设置y轴的那一条线
				axisLine: {
					show: true, //这里的show用于设置是否显示y轴那一条线 默认为true
					lineStyle: {
						//lineStyle里面写y轴那一条线的样式
						color: '#ccc',
						width: 2, //轴线的粗细 我写的是2 最小为0,值为0的时候线隐藏
					},
				},
			},
			dataZoom: [
				{
					type: 'inside',
					start: 0,
					end: 60,
				},
				{
					start: 0,
					end: 60,
				},
			],
			series: [
				{
					name: 'Fake Data',
					type: 'line',
					symbol: 'none',
					sampling: 'lttb',
					itemStyle: {
						color: 'rgb(255, 70, 131,0)',
					},
					areaStyle: {
						color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
							{
								offset: 0,
								color: '#75aa4a',
							},
							{
								offset: 1,
								color: '#75aa4a',
							},
						]),
					},
					data: data,
				},
			],
		};

		myChart.value.setOption(option);
		updateTimeRange(myChart.value);

		// datazoom放大缩小编写
		const comp = myChart.value._model.getComponent('toolbox');
		const toolbox = myChart.value.getViewOfComponentModel(comp);
		const datazoom = toolbox._features.dataZoom;

		// 回退
		//datazoom.onclick(datazoom.ecModel,datazoom.api,'back');
		// 记录x的起始位置
		let x = -1;
		// 重写放大回调
		const onBrush = datazoom.constructor.prototype._onBrush;
		datazoom.constructor.prototype._onBrush = function (evt) {
			if (x === -1) {
				x = evt.areas[0].range[0];
			}

			if (evt.isEnd) {
				const zoomin = evt.areas[0].range[0] - x < 0;
				// 从右往左绘制返回放大前
				if (zoomin) {
					this._brushController.updateCovers([]); // 清除绘制区域
					this.onclick(this.ecModel, this.api, 'back');
				} else {
					onBrush.call(this, evt);
				}
				x = -1;
				updateTimeRange(myChart.value);
			} else {
				onBrush.call(this, evt);
			}
		};

		// 重写原型链方法后,需要重新创建datazoom对象。因为重写前创建的datazoom对象会执行原先的原型方法
		// 还原
		myChart.value._api.dispatchAction({
			type: 'restore',
			from: myChart.value.id,
			key: 'dataZoomSelect',
			dataZoomSelectActive: true,
		});
		//开启默认选中区域缩放
		myChart.value._api.dispatchAction({
			type: 'takeGlobalCursor',
			key: 'dataZoomSelect',
			dataZoomSelectActive: true,
		});
		// 拖动datazoom,更新时间
		myChart.value.on('datazoom', function (e: any) {
			updateTimeRange(myChart.value);
		});
	};


	// 根据图表时间轴范围更新时间筛选
	const updateTimeRange = (myChart: any) => {
		let startValue = myChart.getModel().option.dataZoom[0].startValue;
		let endValue = myChart.getModel().option.dataZoom[0].endValue;
		let start = myChart.getModel().option.xAxis[0].data[startValue]; //起始X轴
		let end = myChart.getModel().option.xAxis[0].data[endValue]; //结束X轴
		dataStartTime.value = start;
		dataEndTime.value = end;
	};

注意

放大缩小重写要在myChart.value.setOption(option);之后

相关文章:

  • Redis 持久化方式:RDB(Redis Database)和 AOF(Append Only File)
  • MYSQL学习笔记(十):约束介绍(如:非空、唯一、主键、外键、级联、默认、检查约束)
  • 2025年前端高频面试题(含答案)
  • JavaScript知识点4
  • MySQL--索引的优化--LIKE模糊查询
  • LeetCode 1206.设计跳表:算法详解
  • 计算机毕业设计SpringBoot+Vue.js大创管理系统(源码+文档+PPT+讲解)
  • 项目——仿RabbitMQ实现消息队列
  • Java+SpringBoot+Vue+数据可视化的在线家具定制服务平台(程序+论文+讲解+安装+调试+售后)
  • AORO M6北斗短报文终端:将“太空黑科技”转化为安全保障
  • SpringBoot+Shiro开发登录认证功能
  • MQ 笔记
  • CSS 对齐:深入理解与技巧实践
  • Vue框架学习
  • LeetCode 209. 长度最小的子数组
  • Vue2+Element实现Excel文件上传下载预览【超详细图解】
  • Flask 应用结构与模块化管理详细笔记
  • 什么是useMemo?何时使用它?
  • 什么是分布式事务?
  • 【文件基础操作】小笔记
  • 厦门做网站价格/怎么把产品快速宣传并推广
  • 奉化网站建设/青岛网站建设与设计制作
  • 商城网站建设适合于哪类企业/网站提交收录入口
  • 课程网站设计建设/广州seo服务外包
  • 做ppt网站有哪些内容吗/磁力搜索器kitty
  • 自己做的砍价网站/网络网站推广选择乐云seo