时间:2023-03-01 15:11:32 | 栏目: | 点击:次
本文实例为大家分享了vue-cli3+echarts实现封装一个渐变色仪表盘组件,供大家参考,具体内容如下
效果预览
1、使用两个仪表盘叠加,起始角度一样,底部仪表盘结束角度固定不变
2、通过props传入数据
3、计算在上层的仪表盘的结束角度并赋值
代码
<template> <div class="gauge"> <div class="gauge__bottom" ref="bottomGauge"></div> <div class="gauge__top" ref="topGauge"></div> <div class="gauge__label">数据占比</div> <div class="gauge__title">{{ this.gaugeData.gaugeTitle }}</div> </div> </template> <script> import echarts from "echarts"; export default { name: "gauge", props: ["gaugeData"],//传入的数据 data() { return { bottomOption: { series: [ { name: "", type: "gauge", startAngle: "225", endAngle: "-45", data: [{ value: 100, name: "" }], splitNumber: 10, detail: { show: false, }, splitLine: { show: false, }, pointer: { show: false, }, axisTick: { show: false, }, axisLabel: { show: false }, axisLine: { lineStyle: { width: 10, color: [ [ 1, new echarts.graphic.LinearGradient(0, 0, 1, 0, [ { offset: 0, // 起始颜色 color: "#707089", }, { offset: 1, // 结束颜色 color: "#707089", }, ]), ], ], }, }, }, ], }, topOption: { series: [ { name: "业务指标", type: "gauge", startAngle: "225", endAngle: "", detail: { formatter: "{value}%", color: "#01F9FF", fontSize: 18, fontFamily: "ZhenyanGB-Regular", offsetCenter: [0, 0], }, data: [{ value: "", name: "" }], splitNumber: 10, splitLine: { show: false, }, pointer: { show: false, }, axisTick: { show: false, }, axisLabel: { show: false }, axisLine: { lineStyle: { width: 10, color: "", }, }, }, ], }, }; }, mounted() { this.getTopGauge(); this.getBottomGauge(); }, methods: { getTopGauge() { const chart = this.$refs.topGauge; if (chart) { const myChart = this.$echarts.init(chart, null, { renderer: "svg" }); this.$once("hook:beforeDestroy", function () { echarts.dispose(myChart); }); this.topOption.series[0].data[0].value = this.gaugeData.gaugePercent; this.topOption.series[0].axisLine.lineStyle.color = this.gaugeData.guageColor; let tmp = 225 - 270 * (this.gaugeData.gaugePercent / 100); this.topOption.series[0].endAngle = tmp; const option = this.topOption; myChart.setOption(option); } }, getBottomGauge() { const chart = this.$refs.bottomGauge; if (chart) { const myChart = this.$echarts.init(chart, null, { renderer: "svg" }); this.$once("hook:beforeDestroy", function () { echarts.dispose(myChart); }); const option = this.bottomOption; myChart.setOption(option); } }, }, }; </script> <style lang="less"> .gauge { width: 150px; height: 165px; position: relative; &__top { position: absolute; top: 0; left: 0; width: 100%; height: 150px; } &__bottom { position: absolute; top: 0; left: 0; width: 100%; height: 150px; } &__label { position: absolute; height: 21px; width: 64px; background: #0547c9; border: 1px solid #1e92ff; border-radius: 11.5px; border-radius: 11.5px; bottom: 35px; left: 50%; transform: translate(-50%, 0); font-family: PingFangSC-Regular; font-size: 8px; color: #ffffff; text-align: center; line-height: 21px; } &__title { font-family: PingFangSC-Medium; font-size: 14px; color: #52f9cb; text-align: center; position: absolute; bottom: 5px; left: 50%; transform: translate(-50%, 0); } } </style>