Newer
Older
Nanping_sponge_JXKH / src / views / home / rightComp / centerRight.vue
@liyingjing liyingjing on 25 Oct 6 KB 海绵绩效考个
<template>
  <div>
    <div ref="assetEchart" class="asset_echart"></div>
  </div>
</template>
<script lang="ts" setup>
import { init } from 'echarts';
import { reactive, toRefs, Ref, ref, onMounted, watchEffect, defineProps } from 'vue';
const assetEchart: Ref<HTMLElement | null | any> = ref(null);
let {
  xData,
  bottom,
  yData,
  yData2,
  all,
  realValue,
  itemUnit,
  itemTarget,
  data: { titleArray },
} = defineProps(['data', 'bottom', 'xData', 'yData', 'yData2','all','realValue','itemUnit','itemTarget']);
// const all = xData.reduce((n, v) => {
//   return n + v.value;
// }, 0);
console.log("realValue", realValue)
console.log("yData", yData)
console.log("itemTarget", itemTarget)
const initM = () => {
  const chart = init(assetEchart.value as HTMLElement);
  window.addEventListener('resize', () => {
    chart.resize();
  });
  chart.setOption({
    grid: {
      top: '0%',
      right: '0%',
      left: '-3%',
      bottom:'12%',
      containLabel: true,
    },
    tooltip: {
      show: true,
      trigger: 'axis',
      axisPointer: {
        type: 'shadow',
      },
      textStyle: {
        fontSize: 12,
      },
      formatter: function (params) {
        let dom = `${params[0].name}
              <br/>`;
        for (let i of params) {
          dom += `${i.marker}
              ${i.seriesName}
                : 
              ${i.value}
              <br/>`;
        }
        return dom;
      },
    },
    legend: {
      show: true,
      itemWidth: 10,
      top: '0',
      left: '89.1%',
      data: titleArray,
      textStyle: {
        color: '#333333',
        fontSize:'9'
      },
    },
    xAxis: [
      {
        color: '#333333',
        data: xData,
        axisLabel: {
          margin: 10,
          color: '#333333',
          textStyle: {
            fontSize: 13,
          },
          formatter: function (params){
                    var index = 4; //字数为6个超出就显示成点
                    var newstr = '';
                    for(var i = 0; i< params.length; i += index){
                        var tmp = params.substring(i, i+index);
                        newstr += tmp +'';
                    }
                    if( newstr.length > 4)
                        return newstr.substring(0, 4) + '...';
                    else
                        return '\n'+newstr;
                },
        },
        axisLine: {
          lineStyle: {
            color: '#333333',
          },
        },
        axisTick: {
          show: true,
          lineStyle: {
            color: '#ddd',
          },
        },
      },
    ],
    yAxis: [
      {
        min: 0,
        show: false,
        axisLabel: {
          color: '#333333',
          textStyle: {
            fontSize: 16,
          },
        },
        axisLine: {
          lineStyle: {
            color: '#333333',
          },
        },
        axisTick: {
          show: false,
        },
        splitLine: {
          lineStyle: {
            color: '#ddd',
            type: 'dashed',
          },
        },
      },
    ],
    series: [
      {
        name: titleArray[0]+'%',
        type: 'bar',
        data: yData,
        barWidth: '30px',
        itemStyle: {
          normal: {
            label: { //柱体上显示数值
                     rotate: 30, // 设置倾斜角度
                       interval: 0,
                    show: true,//开启显示
                    offset: [1, 0],
                    textStyle: {//数值样式
                        fontSize: '10px',
                        color: '#4487F5',
                        // 设置横坐标文字全部显示
                    },
                    formatter: function ({dataIndex}) {
                      console.log("dataIndex", dataIndex)
                      return  realValue[dataIndex]>0 ? realValue[dataIndex]+itemUnit[dataIndex] :'0' ;
                },
                },
            color: {
              type: 'linear',
              x: 0, //右
              y: 0, //下
              x2: 0, //左
              y2: 1, //上
              colorStops: [
                {
                  offset: 0,
                  color: '#4487F5  ', // 0% 处的颜色
                },
                {
                  offset: 1,
                  color: '#A7EFFF ', // 100% 处的颜色
                },
              ],
            },
            barBorderRadius: [0, 0, 0, 0],
          },
        },
      },
      {
        name: titleArray[1]+'%',
        type: 'bar',
        data: yData2,
        barWidth: '30px',
        itemStyle: {
          normal: {
            label: { //柱体上显示数值
                    show: true,//开启显示
                    rotate: 30, // 设置倾斜角度
                       interval: 0,
                    textStyle: {//数值样式
                        fontSize: '10px',
                        color: '#4487F5'
                    },
                    formatter: function ({dataIndex }) {
                      return itemTarget[dataIndex]>0 ? itemTarget[dataIndex]+itemUnit[dataIndex] :'0' ;
                },
                },
            color: {
              type: 'linear',
              x: 0, //右
              y: 0, //下
              x2: 0, //左
              y2: 1, //上
              colorStops: [
                {
                  offset: 0,
                  color: '#48E38F  ', // 0% 处的颜色
                },
                {
                  offset: 1,
                  color: '#D1FBE4  ', // 100% 处的颜色
                },
              ],
            },
            barBorderRadius: [0, 0, 0, 0],
          },
        },
      },
    ],
  });
};
function chartSize(container, charts) {
  function getStyle(el, name) {
    if (window.getComputedStyle) {
      return window.getComputedStyle(el, null);
    } else {
      return el.currentStyle;
    }
  }
  const hi = getStyle(container, 'height').height;
  charts.style.height = hi;
}
watchEffect(() => {});
onMounted(() => {
  initM();
});
</script>

<style lang="scss" scoped>
.asset_echart {
  width: 554px;
  height: 150px;
  margin: 0 10px;
  &_echart {
    width: 100%;
    height: 100%;
  }
}
</style>