Newer
Older
CloudBrainNew / src / components / lineChart / simpleLineChart.vue
StephanieGitHub on 4 Feb 2021 5 KB first commit
<template>
  <div
    :id="id"
    :style="`width:${curWidth};height:${curHeight}`"
  >
  </div>
</template>
<script>
/**
   * @author 王晓颖
   * @date 2020/08/19
   * @Description 简单的折线图
   * @props 数据格式:{
   *    id: 'traffic_govern_line_id',
      width: 0,
      height: 0,
      legend:['近一周日均车位占用率','近一周日均车位停车次数'], // 可不传
      xAxisData:['周一','周二','周三','周四','周五','周六','周日'],
      axisData: [
        {name:'近一周日均车位占用率',data:[120, 252, 101, 134, 290, 230, 110],color:'58,55,194'},
        {name:'近一周日均车位停车次数',data:[120, 222, 191, 234, 250, 200, 310],color:'109,202,23'},
      ]
    }
   *
   */

import { countSize } from '@/utils/utils'
export default {
  name: 'SimpleLineChart',
  props: {
    id: { // id
      type: String,
      default: 'simpleBarChart'
    },
    width: { // 宽
      type: Number | String,
      default: '100%'
    },
    height: { // 高
      type: Number | String,
      default: '100%'
    },
    unit: { // 单位
      type: String,
      default: ''
    },
    colors: { // 颜色
      type: Array,
      default: () => { return ['#01b4ff', '#0337ff'] }
    },
    axisLineColor: { // 轴线颜色
      type: String,
      default: '#101d5d'
    },
    fontColor: { // 轴线上文字颜色
      type: String,
      default: '#ffffff'
    },
    labelColor: { // 图形上文本标签颜色
      type: String,
      default: '#47c8b2'
    },
    smooth: {
      type: Boolean,
      default: true
    }, // 平滑
    seriesData: { // 数据
      type: Array,
      default: () => { return [] }
    },
    xAxisData: { // X轴数据
      type: Array,
      default: () => { return [] }
    }
  },
  data () {
    return {
      curWidth: this.width,
      curHeight: this.height,
      option: {
        grid: {
          left: 10,
          right: 30,
          bottom: 5,
          top: 20,
          containLabel: true
        },
        legend: {
          orient: 'horizontal',
          data: [],
          align: 'left',
          right: '5%',
          itemWidth: 8,
          itemHeight: 8,
          icon: 'rect',
          textStyle: {
            width: '300',
            color: '#fff',
            fontSize: 10
          }
        },
        tooltip: {
          trigger: 'axis',
          textStyle: {
            fontSize: '13'
          },
          axisPointer: {
            type: 'cross',
            label: {
              fontSize: '13'
            }
          }
        },
        xAxis: [
          {
            type: 'category',
            boundaryGap: false,
            data: [],
            axisLine: {
              lineStyle: {
                color: this.axisLineColor // 轴线的颜色
              }
            },
            axisLabel: {
              color: this.fontColor, // X轴名称颜色
              fontSize: 8
            }
          }
        ],
        yAxis: [
          {
            name: this.unit,
            type: 'value',
            color: '#fff',
            nameTextStyle: {
              color: '#fff',
              fontSize: 9,
              verticalAlign: 'middle'
            },
            splitLine: {
              lineStyle: {
                color: ['#101641'],
                type: 'dashed'
              }
            },
            axisLine: {
              lineStyle: {
                color: this.axisLineColor
              }
            },
            axisLabel: {
              color: this.fontColor,
              fontSize: 8
            }
          }
        ],

        series: []
      }
    }
  },
  watch: {
    width (newVal, oldVal) {
      this.curWidth = newVal
      this.refreshEchart()
    },
    height (newVal, oldVal) {
      this.curHeight = newVal
      this.refreshEchart()
    },
    xAxisData (newVal, oldVal) {
      this.option.xAxis[0].data = newVal
      this.refreshEchart()
    },
    legend (newVal, oldVal) {
      this.option.legend.data = newVal
      this.refreshEchart()
    },
    unit (newVal, oldVal) {
      this.option.yAxis[0].name = newVal
      this.refreshEchart()
    },
    seriesData: {
      handler (newVal, oldValue) {
        let newSeries = []
        for (let item of newVal) {
          let series = {
            name: item.name,
            type: 'line',
            symbol: 'none', // 去掉折线节点
            smooth: this.smooth, // 曲线变平滑
            itemStyle: {
              color: `rgb(${item.color})`
            },
            lineStyle: {
              width: countSize(0.03)
            },
            data: item.data
          }
          newSeries.push(series)
        }
        this.$set(this.option, 'series', newSeries)
        this.refreshEchart()
      },
      deep: true
    }
  },
  mounted () {
    this.unit && (this.option.yAxis[0].name = this.unit)
    if (this.xAxisData.length) {
      this.option.legend.data = this.legend
      this.option.xAxis[0].data = this.xAxisData
      let newSeries = []
      for (let item of this.seriesData) {
        let series = {
          name: item.name,
          type: 'line',
          symbol: 'none', // 去掉折线节点
          smooth: this.smooth, // 曲线变平滑
          itemStyle: {
            color: `rgb(${item.color})`
          },
          lineStyle: {
            width: countSize(0.03)
          },
          data: item.data
        }
        newSeries.push(series)
      }
      this.$set(this.option, 'series', newSeries)
      this.initEchart()
    }
  },
  methods: {
    refreshEchart () {
      if (this.curWidth && this.curHeight && this.xAxisData.length) {
        this.initEchart()
      }
    },
    initEchart () {
      const _div = document.getElementById(this.id)
      setTimeout(() => {
        let myChart = this.$echarts.init(_div)
        myChart.setOption(this.option, true)
        window.onresize = myChart.resize
      }, 500)
    }
  }
}
</script>

<style scoped>
</style>