Vue3+Echarts实现实时曲线及开始与暂停功能

最近做电力项目中,遇到这样一个需求:
用户选择设备的属性后(多选情况,可以选择不同设备的属性),然后请求各自的数据,使用折线图的形式实现趋势展示,同时要支持暂停和开始功能;

这个需求,重点在图表数据项的不确性,可能是一组数据,也可能是多组数据,所以要对echarts进行拆分;对于开始暂停功能,就是定时器的建立与清除;

第一步:使用设计模式思想,将变化的部分和不变的部分分开,echarts中的配置项option是固定的,series中的data数据项是变化;所以先实现曲线UI样式设计;

let option = ref({
	backgroundColor: '#374369',
	tooltip: {
		trigger: 'axis',
		axisPointer: {
			lineStyle: {
				color: '#ddd'
			}
		},
		backgroundColor: 'rgba(255,255,255,1)',
		padding: [5, 10],
		textStyle: {
			color: '#7588E4',
		},
		extraCssText: 'box-shadow: 0 0 5px rgba(0,0,0,0.3)'
	},
	legend: {
		show: true,
		shadowColor: "#fff",
		shadowBlur: 5,
		shadowOffsetX: 5,
		data: [],
		top: '5%',
		textStyle: {
			color: '#fff',
			fontSize: 14
		},
		itemHeight: 10
	},
	grid: {
		top: '30%',
		left: '7%',
		right: '8%',
		bottom: '10%',
		containLabel: true
	},
	xAxis: [{
		type: 'category',
		show: false,
		data: (function () {
			var now = new Date();
			var res = [];
			var len = 40; //显示个数
			while (len--) {
				res.unshift(now.toLocaleTimeString().replace(/^\D*/, ''));
				now = new Date(now - 2000);
			}
			return res;
		})(),
		boundaryGap: false,
		splitLine: {
			show: false
		},
		axisTick: {
			show: false
		},
		axisLine: {
			lineStyle: {
				color: '#2d67a7'
			}
		},
		axisLabel: {
			margin: 10,
			textStyle: {
				fontSize: 14
			}
		}
	}],
	yAxis: {
		type: 'value',
		splitLine: {
			show: false
		},
		axisTick: {
			show: false
		},
		axisLine: {
			lineStyle: {
				color: '#2d67a7'
			}
		},
		axisLabel: {
			margin: 10,
			textStyle: {
				fontSize: 14
			}
		}
	},
	// 需要动态生成的部分
	series: []
})

第二步:获取设备数据,进行渲染;

// 开始
function handleStart() {
	option.value.series = [] // 清空series数据缓存,防止重叠
	loading.value = true;
	emptyStatus.value = false;
	if (myChart.value) {
		myChart.value.dispose();
	}
	// 点击开始,实现DOM创建,否则回报错,因为不是页面加载时创建
	setTimeout(() => {
		myChart.value = proxy.$echarts.init(compare.value);
	}, 500);
	dataStatus.value = true;

	// 每次开始获取最新数据数据
	//图表默认数组
	var zhou1 = [], zhou2 = [], zhou3 = [], legends = ['总进线', '变频', '软起']
	for (var i = 0; i <= 40; i++) {
		zhou1[i] = 0;
		zhou2[i] = 0;
		zhou3[i] = 0;
	}
	const dataArray = []
	dataArray.push(zhou1)
	dataArray.push(zhou2)
	dataArray.push(zhou3)
	option.value.legend.data = legends
	// 使用for循环创建动态系列数据 ,就是形成多个series数据项 
	for (var i = 0; i < dataArray.length; i++) {
		option.value.series.push({
		//对配置项不熟悉的可以去查看官网文档资料
			name: legends[i],
			type: 'line',
			smooth: true,
			showSymbol: false,
			symbol: 'circle',
			symbolSize: 1,
			data: dataArray[i],
			itemStyle: {
				normal: getUniqueRandomColor(),
				emphasis: getUniqueRandomColor()
			},
			lineStyle: {
				width: 2,
				shadowColor: 'rgba(0,0,0,0.6)',
				shadowBlur: 10,
				shadowOffsetY: 5
			}
		});
	}
	// 使用定时器,进行曲线实时滚动
	timer.value = setInterval(function () {
		//数据为模拟随机数
		let electricityX = Math.random() * 100;
		let electricityY = Math.random() * 10;
		let electricityZ = Math.random() * 5;
		zhou1.shift();
		zhou1.push(electricityX);
		zhou2.shift();
		zhou2.push(electricityY);
		zhou3.shift();
		zhou3.push(electricityZ);
		let axisData = (new Date()).toLocaleTimeString().replace(/^\D*/, '');
		option.value.xAxis[0].data.shift();
		option.value.xAxis[0].data.push(axisData);
		//进行渲染
		myChart.value.setOption(option.value);
	}, 1000)
	//强制出现加载效果(业务目的),为了用户体验,哈哈哈哈
	setTimeout(() => {
		loading.value = false
	}, 500);
}

第三步:实现暂停效果,清除定时器;

// 暂停
function handleQuery() {
	dataStatus.value = false;
	clearInterval(timer.value);
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
以下是使用 Vue3 和 Echarts 实现饼图的示例代码: 1. 安装 Echarts:`npm install echarts` 2. 引入 Echarts: ```javascript import echarts from "echarts"; import "echarts/lib/chart/pie"; import "echarts/lib/component/title"; import "echarts/lib/component/tooltip"; import "echarts/lib/component/legend"; ``` 3. 在 Vue3 组件中使用 Echarts: ```vue <template> <div ref="chart" style="height: 400px;"></div> </template> <script> import echarts from "echarts"; import "echarts/lib/chart/pie"; import "echarts/lib/component/title"; import "echarts/lib/component/tooltip"; import "echarts/lib/component/legend"; export default { mounted() { // 基于准备好的dom,初始化echarts实例 var myChart = echarts.init(this.$refs.chart); // 指定图表的配置项和数据 var option = { title: { text: "饼图示例", left: "center", }, tooltip: { trigger: "item", formatter: "{a} <br/>{b}: {c} ({d}%)", }, legend: { orient: "vertical", left: "left", data: ["直接访问", "邮件营销", "联盟广告", "视频广告", "搜索引擎"], }, series: [ { name: "访问来源", type: "pie", radius: ["50%", "70%"], avoidLabelOverlap: false, label: { show: false, position: "center", }, emphasis: { label: { show: true, fontSize: "30", fontWeight: "bold", }, }, labelLine: { show: false, }, data: [ { value: 335, name: "直接访问" }, { value: 310, name: "邮件营销" }, { value: 234, name: "联盟广告" }, { value: 135, name: "视频广告" }, { value: 1548, name: "搜索引擎" }, ], }, ], }; // 使用刚指定的配置项和数据显示图表。 myChart.setOption(option); }, }; </script> ``` 在上面的示例代码中,我们在 `mounted` 钩子函数中初始化了一个 Echarts 实例,并使用 `setOption` 方法将图表的配置项和数据传递给 Echarts 实例,从而显示出饼图。 其中,`ref` 属性指定了图表所在的 DOM 元素,`title` 属性设置了图表标题,`legend` 属性设置了图例,`series` 属性设置了饼图的数据和样式。 如果需要修改饼图的样式或数据,只需要更改 `option` 对象的属性即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

渔舟唱晚@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值