Vue+Echart实现利用率表盘效果的示例代码
效果演示
组件
里面对应两个图片资源,panelBackground_red.png 和 panelBackground_green.png,请前往百度网盘进行下载。如果喜欢其他颜色,可以使用.psd来修改导出就行。
链接: https://pan.baidu.com/s/1BmupspRch3aPcqY7l01WYA 提取码: t3ur
在使用组件之前,记得引入echart组件,可以参考echart组件引入
<template> <!-- <div class="titleDiv">占用率</div> --> <div id="customGaugeContainer" ref="panel" style="height: 100%;"></div> </template> <script> import * as echarts from 'echarts' var app = {}; var ROOT_PATH = 'https://echarts.apache.org/examples'; // var _panelImageURL = ROOT_PATH + '/data/asset/img/custom-gauge-panel.png'; var _panelImageURL = require("@/assets/panel/panelBackground_green.png"); var _animationDuration = 1000; var _animationDurationUpdate = 1000; var _animationEasingUpdate = 'quarticInOut'; //这个不改 var _valOnRadianMax = 100; //这个不改 var _pointerInnerRadius = 60; //外轮廓半径 var _outerRadius = 110; //内轮廓半径 var _innerRadius = 100; //里面白色远的半径 var _insidePanelRadius = 100; var _fontSize = 50; var _currentDataIndex = 0; var _shadowColor = '#20A53A'; var _textColor = '#20A53A'; var _shadowBlur = 20; export default { name: 'SmartSchedulingSystemCustomGauge', props: { rate: { type: Number }, timeChange: { type: Number } }, watch: { rate: { handler(newValue, oldValue) { // console.log("刷新表盘数据") // console.log("oldValue:" + oldValue) // console.log("newValue:" + newValue) // console.log("rate:" + this.rate) //刷新表盘数据 this.setOptions(); }, deep: true }, }, data() { return { myChart: undefined, scheduledTask: undefined, }; }, mounted() { this.$nextTick(() => { this.initChart(); window.addEventListener('resize', this.myChart.resize()); // this.setScheduledTask(); }) }, methods: { initChart() { let dom = document.getElementById('customGaugeContainer'); let clientHeight = dom.clientHeight; // console.log("clientHeight:" + clientHeight) _outerRadius = (clientHeight / 2) * 0.9; _innerRadius = (clientHeight / 2) * 0.8; _insidePanelRadius = (clientHeight / 2) * 0.8; _fontSize = (clientHeight / 2) * 0.3; _shadowBlur = (clientHeight / 2) * 0.2; // this.myChart = echarts.init(dom, null, { // renderer: 'canvas', // useDirtyRect: false // }); this.myChart = echarts.init(this.$refs.panel); this.setOptions(); }, setOptions() { if (this.rate > 80) { _shadowColor = '#F33333'; _textColor = '#F33333'; _panelImageURL = require("@/assets/panel/panelBackground_red.png"); } else { _shadowColor = '#20A53A'; _textColor = '#20A53A'; _panelImageURL = require("@/assets/panel/panelBackground_green.png"); } let option = { animationEasing: _animationEasingUpdate, animationDuration: _animationDuration, animationDurationUpdate: _animationDurationUpdate, animationEasingUpdate: _animationEasingUpdate, //数据展示 dataset: { //100可以看成是百分比 source: [[1, this.rate]] }, tooltip: {}, angleAxis: { type: 'value', startAngle: 0, show: false, min: 0, max: _valOnRadianMax }, radiusAxis: { type: 'value', show: false }, polar: {}, series: [ { type: 'custom', coordinateSystem: 'polar', renderItem: renderItem } ] }; if (option && typeof option === 'object') { this.myChart.setOption(option); } }, /** * 设置定时任务 */ setScheduledTask() { this.scheduledTask = setInterval(function () { console.log("rate:" + this.rate) }, 2000); } }, }; function renderItem(params, api) { var valOnRadian = api.value(1); var coords = api.coord([api.value(0), valOnRadian]); var polarEndRadian = coords[3]; var imageStyle = { image: _panelImageURL, x: params.coordSys.cx - _outerRadius, y: params.coordSys.cy - _outerRadius, width: _outerRadius * 2, height: _outerRadius * 2 }; return { type: 'group', children: [ { type: 'image', style: imageStyle, clipPath: { type: 'sector', shape: { cx: params.coordSys.cx, cy: params.coordSys.cy, r: _outerRadius, r0: _innerRadius, startAngle: 0, endAngle: -polarEndRadian, transition: 'endAngle', enterFrom: { endAngle: 0 } } } }, // { // type: 'image', // style: imageStyle, // clipPath: { // type: 'polygon', // shape: { // points: makePionterPoints(params, polarEndRadian) // }, // extra: { // polarEndRadian: polarEndRadian, // transition: 'polarEndRadian', // enterFrom: { polarEndRadian: 0 } // }, // during: function (apiDuring) { // apiDuring.setShape( // 'points', // makePionterPoints(params, apiDuring.getExtra('polarEndRadian')) // ); // } // } // }, //白色中心圆 { type: 'circle', shape: { cx: params.coordSys.cx, cy: params.coordSys.cy, r: _insidePanelRadius }, style: { fill: '#fff', shadowBlur: _shadowBlur, shadowOffsetX: 0, shadowOffsetY: 0, //轮廓阴影颜色 shadowColor: _shadowColor } }, { type: 'text', extra: { valOnRadian: valOnRadian, transition: 'valOnRadian', enterFrom: { valOnRadian: 0 } }, style: { text: makeText(valOnRadian), fontSize: _fontSize, fontWeight: 700, x: params.coordSys.cx, y: params.coordSys.cy, //字体颜色 fill: _textColor, align: 'center', verticalAlign: 'middle', enterFrom: { opacity: 0 } }, during: function (apiDuring) { apiDuring.setStyle( 'text', makeText(apiDuring.getExtra('valOnRadian')) ); } } ] }; } function convertToPolarPoint(renderItemParams, radius, radian) { return [ Math.cos(radian) * radius + renderItemParams.coordSys.cx, -Math.sin(radian) * radius + renderItemParams.coordSys.cy ]; } function makePionterPoints(renderItemParams, polarEndRadian) { return [ convertToPolarPoint(renderItemParams, _outerRadius, polarEndRadian), convertToPolarPoint( renderItemParams, _outerRadius, polarEndRadian + Math.PI * 0.03 ), convertToPolarPoint(renderItemParams, _pointerInnerRadius, polarEndRadian) ]; } function makeText(valOnRadian) { // Validate additive animation calc. if (valOnRadian < -10) { alert('illegal during val: ' + valOnRadian); } return ((valOnRadian / _valOnRadianMax) * 100).toFixed(1) + '%'; } </script> <style lang="scss" scoped> #customGaugeContainer { // height: calc(100% - 20px); height: 100%; } </style>
使用方式
在页面引入组件
使用组件
<customGauge style="height: 150px;" :rate="server.jvm.usage"> </customGauge>
- height设置组件的高度
- rate属性设置利用率
到此这篇关于Vue+Echart实现利用率表盘效果的示例代码的文章就介绍到这了,更多相关Vue Echart利用率表盘效果内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
vue实现锚点跳转之scrollIntoView()方法详解
这篇文章主要介绍了vue实现锚点跳转之scrollIntoView()方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-09-09如何用vue-cli3脚手架搭建一个基于ts的基础脚手架的方法
这篇文章主要介绍了如何用vue-cli3脚手架搭建一个基于ts的基础脚手架的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-12-12vue element修改el-select控件长度style=“width:XXpx“不生效的解决
这篇文章主要介绍了vue element修改el-select控件长度style=“width:XXpx“不生效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-07-07基于vue-cli vue-router搭建底部导航栏移动前端项目
这篇文章主要介绍了基于vue-cli vue-router搭建底部导航栏移动前端项目,项目中主要用了Flex布局,以及viewport相关知识,已达到适应各终端屏幕的目的。需要的朋友可以参考下2018-02-02
最新评论