vue-cli3+echarts实现渐变色仪表盘组件封装

本文实例为大家分享了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>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • vue实现echarts中的仪表盘

    本文实例为大家分享了vue实现echarts中的仪表盘的具体代码,供大家参考,具体内容如下 最终结果 一.安装 1. 首先需要安装echarts依赖包 npm install echarts -S 2. 或者使用国内的淘宝镜像: npm install -g cnpm --registry=https://registry.npm.taobao.org 二.创建图表 全局引入 main.js // 引入echarts import echarts from 'echarts' Vue.proto

  • Vue中使用Echarts仪表盘展示实时数据的实现

    在vue中echarts仪表盘实时数据 彩笔一枚,简单记录一下. 业务场景:通过websocket实时推送数据,将数据渲染到仪表盘中. 第一步: 基于准备好的dom,初始化echarts仪表盘实例. 第二步: 我是通过父子组件传值把数据接收过来,在data中定义upPressure参数,并将接收来的devicePressure参数赋值给它,便于后面将值传入到echarts中 父组件中 <div class="chart" shadow="always">

  • Vue使用echarts定制特殊的仪表盘

    本文实例为大家分享了Vue使用echarts定制特殊仪表盘的具体代码,供大家参考,具体内容如下 实现的效果:(初始化以及浏览器resize的时候数字和弧形条均为递增动画) HTML部分: <!-- 为ECharts准备一个具备大小(宽高)的Dom --> <div class="main-echarts-contianer"      ref="main"> </div> CSS部分: .main-echarts-contiane

  • vue-cli3+echarts实现渐变色仪表盘组件封装

    本文实例为大家分享了vue-cli3+echarts 实现封装一个渐变色仪表盘组件,供大家参考,具体内容如下 效果预览 思路 1.使用两个仪表盘叠加,起始角度一样,底部仪表盘结束角度固定不变2.通过props传入数据3.计算在上层的仪表盘的结束角度并赋值 代码 <template>   <div class="gauge">     <div class="gauge__bottom" ref="bottomGauge&quo

  • 浅析vue cli3 封装Svgicon组件正确姿势(推荐)

    vue cli3 手把手教学封装Svgicon组件 第一步:在src文件下新建一个放置svg文件的文件夹 第二步:在components文件下新建一个Svg组件 这是一个 文件夹 专门用来存放项目里面需要使用的svg文件,比如 a.svg b.svg - svg组件源码 <template> <svg :class="svgClass" aria-hidden="true"> <use :xlink:href="iconNam

  • Vue Echarts实现图表轮播图以及图表组件封装和节流函数优化讲解

    目录 一.为什么要优雅的使用echarts 二.最初的表格组件 三.初步的封装 四.性能优化 一.为什么要优雅的使用echarts 为了提高代码的规范性.复用性,vue中最常用的就是将具有某些功能的代码封装到一个插件.如果没有对插件进行封装,在后期使用插件的时候效率会十分低下也不便于后期对程序的维护拓展,在优雅的使用echarts时,首先,我们考虑到多个地方需要用到echarts,就需要封装一个组件出来,由于每一个图中的属性均由配置项option进行控制,所以我们可以将option选项提取出来,

  • vue 基于element-ui 分页组件封装的实例代码

    具体代码如下所示: <template> <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :page-sizes="[10, 20, 30, 40]" :page-size="pageSize" layout="total, sizes, prev, pager, next, j

  • Vue cli3 库模式搭建组件库并发布到 npm的流程

    市面上目前已有各种各样的UI组件库,比如 Element 和 iView ,他们的强大毋庸置疑.但是我们面临的情况是需求越来越复杂,当它们不能再满足我们需求的时候,这个时候就有必要开发一套属于自己团队的组件库了. 所以本文的目的就是让读者能通过此文,小能做一个简单的插件供人使用,大能架构和维护一个组件库不在话下. 以下一个简单的颜色选择器插件 vColorPicker 讲述从开发到上线到npm的流程. vColorPicker 插件 DEMO 一.技术栈 如何通过新版脚手架创建项目,这里就不提了

  • Vue 组件封装 并使用 NPM 发布的教程

    正文开始 Vue 开发插件 我们可以先查看Vue的插件的开发规范 我们开发的之后期望的结果是支持 import.require 或者直接使用 script 标签的形式引入,就像这样: ps: 这里注意一下包的名字前缀是 unisoft ,组件的名字前缀是 uni import UniSoftUI from 'unisoft-ui'; // 或者 const CustomUI = require('unisoft-ui'); // 或者 <script src="...">&

  • vue弹出框组件封装实例代码

    新学vue,参考别人封装弹出层组件.好用! 1.你需要先建一个弹出框的模板: //首先创建一个mack.vue <template> <div class="mack" v-if="isShow"> <div class="mackWeb" :style="text.mackStyle"> <div class="title font_b" v-if="t

  • vue elementui 实现搜索栏公共组件封装的实例代码

    1.背景 vue后台管理系统,会有很多表格页面,表格上方会有一些搜索选项,表格直接使用el-table即可,而搜索栏区域每次写起来都很繁琐,而且多人开发情况下每个人写的样式都不相同,布局样式无法统一. 所以要考虑对搜索栏做一个封装,统一配置引用,提升开发维护效率和界面统一. 完成后的效果大概就是长这样: 2.分析 项目使用的是elementui框架,搜索栏这种表单提交,首先要使用el-form组件来封装,而复杂点就是表单项可能有很多种,例如input输入框.select选择框.日期时间选择框.日

随机推荐