zoukankan      html  css  js  c++  java
  • echart 带表格

    "echarts": "^5.2.2",

    ChartSituation1

    <template>
      <div>
        <EChartTemplate1 ref="eChartTemplate1Ref"></EChartTemplate1>
      </div>
    </template>
    
    <script>
    import EChartTemplate1 from '../EChartTemplate1'
    import mock from '../mockData'
    export default {
      name: 'ChartSituation1',
      components: {
        EChartTemplate1
      },
      props: {},
      data () {
        return {}
      },
      watch: {},
      computed: {},
      methods: {},
      created () { },
      activated () { },
      mounted () {
        const optionBusiness = {
          title: '111',
          legendData: ['历史差值', '2020年度', '2019年度'],
          dataDiff: mock.lishichazhi,
          data1: mock.year2020,
          data2: mock.year2019,
          xAxisData: mock.xAxisData
        }
        this.$refs.eChartTemplate1Ref.open(optionBusiness)
      },
      beforeDestroy () { }
    }
    </script>
    
    <style>
    </style>
    

    EChartTemplate1

    <template>
      <div>
        <EChartComponent ref="eChartCompnentRef"></EChartComponent>
      </div>
    </template>
    
    <script>
    import EChartComponent from '../EChartComponent'
    export default {
      name: 'EChartTemplate1',
      components: {
        EChartComponent
      },
      props: {},
      data () {
        return {}
      },
      watch: {},
      computed: {},
      methods: {
        open (optionB) {
          const lineList = this.getTableLine(4)
          const option = {
            color: ['#99bb5c', '#6585b8', '#b84f4b'],
            grid: {
              show: true,
              containLabel: true,
              height: 'auto' - 0,
              top: 80,
              left: 100,
              right: 150,
              bottom: 10,
            },
            title: [
              {
                textStyle: { fontSize: 30 },
                left: 'center',
                text: optionB.title
              },
              {
                top: 50,
                left: 30,
                textStyle: { lineHeight: 20 },
                text: '历\n史\n差\n值'
              },
              {
                top: 50,
                right: 70,
                textStyle: { lineHeight: 20 },
                text: '测\n评\n得\n分'
              },
            ],
            xAxis: [
              {
                axisLine: {
                  lineStyle: { color: '#ccc' },
                  onZero: false,
                },
                position: 'bottom',
                axisTick: {
                  show: true,
                  length: this.getxAxisTickLength(optionB.xAxisData) // 193,
                },
                axisLabel: {
                  color: '#464646',
                  show: true,
                  fontSize: 14,
                  lineHeight: 16,
                  interval: 0, // 全部显示
                  rotate: 0,
                  formatter: function (value, index) {
                    return '{tableup|' + value + '\n}'
                      + '\n{table|' + optionB.dataDiff[index] + '}'
                      + '\n{table|' + optionB.data1[index] + '}'
                      + '\n{table|' + optionB.data2[index] + '}'
                  },
                  rich: {
                    tableup: {
                      color: '#464646',
                      fontSize: 14,
                      lineHeight: 16,
                    },
                    table: {
                      color: '#464646',
                      fontSize: 14,
                      lineHeight: 25,
                    }
                  }
                },
                splitLine: { // 竖线
                  show: true,
                  lineStyle: { color: '#cccccc' }
                },
                splitArea: {
                  show: true
                },
                type: 'category', // 类别
                data: this.xAxisData(optionB.xAxisData),
              },
              {
                axisLine: {
                  lineStyle: {
                    color: '#ccc'
                  }
                }
              },
            ],
            yAxis: [
              { // 左边
                axisLabel: {
                  formatter: function (value, index) {
                    return value.toFixed(2)
                  },
                  fontSize: 14,
                },
                axisTick: {
                  show: true,
                },
                splitLine: { // 横线
                  show: false
                },
                min: this.getMinLeft(optionB.dataDiff, -5),
                max: this.getMaxLeft(optionB.dataDiff, 15),
                position: 'left',
                name: '',
                offset: 0,
                type: 'value'
              },
              { // 右边
                axisLabel: {
                  formatter: function (value, index) {
                    return value.toFixed(2)
                  },
                  fontSize: 14,
                },
                axisTick: {
                  show: true,
                },
                splitLine: {
                  show: false
                },
                min: this.getMinRight([...optionB.data1, ...optionB.data2], 75.00),
                max: this.getMaxRight([...optionB.data1, ...optionB.data2], 100.00),
                position: 'right',
                name: '',
                type: 'value'
              }
            ],
            legend: [
              {
                textStyle: { fontSize: 14 },
                orient: 'vertical',
                right: 10,
                top: 150,
                data: optionB.legendData
              },
              {
                textStyle: { fontSize: 14 },
                orient: 'vertical',
                left: 20,
                bottom: 13,
                data: optionB.legendData
              }
            ],
            series: [
              {
                label: {
                  show: true,
                  position: 'top'
                },
                symbol: 'rect',
                symbolSize: 10,
                yAxisIndex: 0,
                type: 'line',
                name: optionB.legendData[0],
                data: optionB.dataDiff,
              },
              {
                label: {
                  show: true,
                  position: 'bottom'
                },
                symbol: 'rect',
                symbolSize: 10,
                type: 'line',
                name: optionB.legendData[1],
                yAxisIndex: 1,
                data: optionB.data1,
              },
              {
                label: {
                  show: true,
                  position: 'top'
                },
                symbolSize: 10,
                type: 'line',
                symbol: 'diamond',
                name: '2019年度',
                yAxisIndex: 1,
                data: optionB.data2,
              },
            ],
            graphic: lineList
          }
          this.$refs.eChartCompnentRef.open(option)
        },
        getxAxisTickLength (data) {
          const arr = this.xAxisData(data)
          const getEnterNumber = str => {
            return str.split('\n').length
          }
          const numArr = arr.map(item => {
            return getEnterNumber(item)
          })
          const maxNum = Math.max(...numArr)
          // 16 是 lineHeight 多补了个回车 再加16 上面的padding是5
          // 25 是数据的 lineHeight 3行
          return maxNum * 16 + 16 + 5 + 25 * 3
        },
        getMinLeft (arr, defaultValue) { // 左侧轴 最小值计算
          const min = Math.min(...arr)
          if (min > defaultValue) {
            return defaultValue
          } else {
            return parseInt(min - 2)
          }
        },
        getMaxLeft (arr, defaultValue) { // 左侧轴 最大值计算
          const max = Math.max(...arr)
          if (max < defaultValue) {
            return defaultValue
          } else {
            return parseInt(max + 2)
          }
        },
        getMinRight (arr, defaultValue) { // 右侧轴 最小值计算
          const min = Math.min(...arr)
          if (min > defaultValue) {
            return defaultValue
          } else {
            if (min <= 2) {
              return 0
            }
            return parseInt(min - 2)
          }
        },
        getMaxRight (arr, defaultValue) { // 右侧轴 最大值计算
          const max = Math.max(...arr)
          if (max < defaultValue) {
            return defaultValue
          } else {
            if (max >= 98) {
              return 100
            }
            return parseInt(max + 2)
          }
        },
        getTableLine (num) {
          let list = []
          let bottom = 85
          let height = 25
          for (let i = 0; i < num; i++) {
            list.push({
              silent: true,
              type: 'line',
              bottom: bottom - i * height,
              // left: 50,
              right: 150 + 50,
              style: {
                stroke: 'inherit'
              },
              shape: {
                x1: 0,
                y1: 0,
                x2: 3000,
                y2: 0
              }
    
            })
          }
          list.push({
            style: {
              stroke: 'inherit'
            },
            bottom: 10,
            silent: true,
            type: 'line',
            shape: {
              x1: 0,
              y1: 0,
              x2: 0,
              y2: 75
            }
          })
          return list
        },
        xAxisData (data) {
          const ret = data.map(item => {
            if (item.indexOf(' ') > -1) {
              const t2 = item.split(' ')
              const a = t2[0].split('')
              const b = t2[1].split('')
              let k
              if (a.length > b.length) {
                k = a
              } else {
                k = b
              }
              const ret = k.map((item1, index) => {
                const a1 = a[index] ? a[index] : ' '
                const b1 = b[index] ? b[index] : ' '
                return a1 + ' ' + b1 + '\n'
              }).join('')
              return ret
            }
            return item.split('').join('\n')
          })
          const getEnterNumber = str => {
            return str.split('\n').length
          }
          const getMaxNumber = arr => {
            return Math.max(...arr)
          }
          const repeat = (src, n) => {
            let k = ''
            for (let i = 0; i < n; i++) {
              k = k + src
            }
            return k
          }
          const supplementEnter = (str, maxNumber) => { // 补上回车
            const enterLen = getEnterNumber(str)
            const needNumber = maxNumber - enterLen
            const n = repeat('\n', needNumber)
            return str + n
          }
    
          const maxNumber = getMaxNumber(ret.map(item => {
            return getEnterNumber(item)
          }))
          const ret1 = ret.map(item => {
            return supplementEnter(item, maxNumber)
          })
          return ret1
        }
      },
      created () { },
      activated () { },
      mounted () {
      },
      beforeDestroy () { }
    }
    </script>
    
    <style>
    </style>
    

    EChartComponent

    <template>
      <div v-if="chartVif">
        <ResizeZen @on-change="chartHeightSet"></ResizeZen>
        <div ref="dom"
             :style="{height: chartHeight + 'px'}"
             style=" 100%;"></div>
      </div>
    </template>
    
    <script>
    import * as echarts from 'echarts'
    export default {
      name: 'EChartComponent',
      components: {},
      props: {},
      data () {
        return {
          chartVif: false,
          chartHeight: '550',
          myChart: null
        }
      },
      watch: {},
      computed: {},
      methods: {
        chartHeightSet () {
          this.chartHeight = window.innerHeight - 300
          this.$nextTick(() => {
            this.myChart.resize()
          })
        },
        openChartVifSet (ctx, next) {
          this.chartVif = false
          this.$nextTick(() => {
            this.chartVif = true
            this.$nextTick(() => {
              next()
            })
          })
        },
        openExe (ctx, next) {
          this.myChart = echarts.init(this.$refs.dom)
          this.myChart.setOption(ctx.option)
          this.chartHeightSet()
        },
        open (option) {
          const ac = this.$getAc()
          ac.ctx.option = option
          ac.use(this.openChartVifSet)
          ac.use(this.openExe)
          ac.run()
        }
      },
      created () { },
      activated () { },
      mounted () { },
      beforeDestroy () { }
    }
    </script>
    
    <style>
    </style>
    

    ResizeZen

    <template>
      <span></span>
    </template>
    
    <script>
    // window.innerHeight
    export default {
      name: 'ResizeZen',
      components: {},
      props: {},
      data () {
        return {}
      },
      watch: {},
      computed: {},
      methods: {
        resize () {
          this.$emit('on-change')
        }
      },
      created () { },
      activated () { },
      mounted () {
        window.addEventListener('resize', this.resize)
      },
      beforeDestroy () {
        window.removeEventListener('resize', this.resize)
      }
    }
    </script>
    
    <style>
    </style>
    
    ---------------------------------------------
    生活的意义并不是与他人争高下,而在于享受努力实现目标的过程,结果是对自己行动的嘉奖。
    ↑面的话,越看越不痛快,应该这么说:

    生活的意义就是你自己知道你要做什么,明确目标。没有目标,后面都是瞎扯!
  • 相关阅读:
    第7 章 : 应用编排与管理:Job & DaemonSet
    第6 章 : 应用编排与管理:Deployment
    第5 章 : 应用编排与管理:核心原理
    第4 章 : 理解 Pod 和容器设计模式
    第3 章 : Kubernetes 核心概念
    第2 章 : 容器基本概念
    第1 章 : 第一堂“云原生”课
    阿里云原生技术公开课程-讲师记录及视频链接
    Shell中的(),{}几种语法用法-单独总结
    折腾kubernetes各种问题汇总-<1>
  • 原文地址:https://www.cnblogs.com/pengchenggang/p/15667948.html
Copyright © 2011-2022 走看看