echarts 环形图

环形图封装成了一个组件 组件名diagran.vue

javascript 复制代码
<!--环形图-->
<template>
  <div class='chartPreDonut' ref='chartPreDonut'></div>
</template>

<script>
import * as echarts from 'echarts'
export default {
  props: ['option', 'unit', 'title', 'center', 'legend', 'legendTop'],
  data () {
    return {
      chartDom: null,
      chartData: this.option
    }
  },
  watch: {
    option: {
      handler (val) {
        this.chartData = val
        this.$nextTick(() => {
          this.chartInit()
        })
      },
      deep: true,
      immediate: true
    }
  },
  mounted () {
    this.$nextTick(() => {
      this.chartInit()
    })
  },
  methods: {
    chartInit () {
      this.chartDom = echarts.init(this.$refs.chartPreDonut)

      const options = {
        tooltip: {
          trigger: 'item',
          formatter: (params) => {
            return `${params.name}:${params.value}${this.unit || ''}${params.data.rate ? `<br /> 占比${params.percent}%` : ''}`
          }
        },
        series: [
          {
            type: 'pie',
            radius: ['30%', '50%'],
            clockwise: true,
            avoidLabelOverlap: true,
            hoverOffset: 15,
            label: {
              show: true,
              position: 'outside',
              formatter: (params) => {
                return `${params.name}:${params.value}${this.unit || ''}${params.data.rate ? `\n占比${params.percent}%` : ''}`
              },
              rich: {
                hr: {
                  backgroundColor: 't',
                  borderRadius: 3,
                  width: 3,
                  height: 3,
                  padding: [3, 3, 0, -12]
                },
                a: {
                  padding: [-30, 15, -20, 15]
                }
              }
            },
            labelLine: {
              normal: {
                length: 5,
                length2: 5,
                lineStyle: {
                  width: 1
                }
              }
            },
            center: this.center || ['50%', '50%'],
            data: this.chartData
          }
        ]
      }

      if (this.legend) {
        options.legend = {
          type: 'scroll',
          orient: 'vertical',
          right: 10,
          top: this.legendTop || 100,
          bottom: 20,
          data: this.chartData.map(m => { return m.name })
        }
      }

      if (this.title) {
        options.title = {
          text: this.title,
          top: '44%',
          textAlign: 'center',
          left: '49.50%',
          textStyle: {
            color: '#104fa7',
            fontSize: 15,
            fontWeight: '400'
          }
        }
      }

      this.chartDom.setOption(options)
      window.addEventListener('resize', () => {
        this.chartDom.resize()
      })
    }
  }
}
</script>

<style lang="less" scoped>
.chartPreDonut {
  width: 100%;
  height: 100%;
}
</style>

页面引入组件

javascript 复制代码
<template>
  <div>
    <div class="left-charts">
      <Diagran :option='option' unit="人次" />
    </div>
  </div>
</template>

<script>
import Diagran from './diagran.vue'
export default {
  data () {
    return {
      option: [
        {
          "value": 11111,
          "name": "测试1"
        },
        {
          "value": 22222,
          "name": "测试2"
        },
        {
          "value": 33333,
          "name": "测试3"
        },
        {
          "value": 444444,
          "name": "测试4"
        },
        {
          "value": 555555,
          "name": "测试5"
        },
        {
          "value": 66666,
          "name": "测试6"
        },
        {
          "value": 77777,
          "name": "测试7"
        },
        {
          "value": 88888,
          "name": "测试8"
        }
      ]
    }
  },
  components: {
    Diagran
  }
}
</script>

<style lang="less" scoped>
.left-charts {
  width: calc(100% - 140px);
  height: 500px;
}
</style>
相关推荐
怕浪猫2 分钟前
React从入门到出门第六章 事件代理机制与原生事件协同
前端·javascript·react.js
天府之绝5 分钟前
uniapp 中使用uview表单验证时,自定义扩展的表单,在改变时无法触发表单验证处理;
开发语言·前端·javascript·vue.js·uni-app
be or not to be7 分钟前
Html-CSS动画
前端·css·html
初恋叫萱萱12 分钟前
技术基石与职场进阶:构建从Web后端到高性能架构的完整知识图谱
前端·架构·知识图谱
木木木一16 分钟前
Rust学习记录--C9 错误处理
前端·学习·rust
局外人LZ17 分钟前
libsodium.js:web端与 Node.js 的现代加密工具集,构建前端安全加密体系
前端·javascript·node.js
xkxnq23 分钟前
第二阶段:Vue 组件化开发(第 20天)
前端·javascript·vue.js
哈__26 分钟前
React Native 鸿蒙跨平台开发:Keyboard 键盘控制
javascript·react native·react.js
「、皓子~26 分钟前
AI 创作系列(34)海狸IM桌面版 v1.1 正式发布:Vite + Electron 性能优化与体验升级
前端·人工智能·electron·开源·开源软件·im
鹏程十八少26 分钟前
1.Android 3分钟跑通腾讯 Shadow 插件化官方Demo:零反射、手把手实战(基于源码依赖)
android·前端·面试