vue2 echarts 渲染数据

 

<template>
  <div ref="friendsTrend" class="mt-16 friendsTrend" />
</template>

<script>
import * as echarts from 'echarts'
import moment from 'moment'

import { getLineChartStatisticsData } from '../api/wxworkFriends'

export default {
  name: 'FriendsLine',

  props: {
    date: {
      type: Array,
      default: () => []
    },
    userIdList: {
      type: Array,
      default: () => []
    }
  },

  data() {
    return {
      myChart: null
    }
  },

  mounted() {
    this.getData()
    window.addEventListener('resize', this.resize)
  },
  beforeDestroy() {
    window.removeEventListener('resize', this.resize)
    this.myChart && this.myChart.dispose()
    this.myChart = null
  },
  methods: {
    // 缩放处理
    resize() {
      this.myChart && this.myChart.resize()
    },

    getData() {
      getLineChartStatisticsData({
        userIdList: this.userIdList.map((item) => item.id),
        startTime: `${ moment(this.date[0]).format('YYYY-MM-DD')  } 00:00:00`,
        endTime: `${ moment(this.date[1]).format('YYYY-MM-DD')  } 23:59:59`
      }).then((res) => {
        if (res.data) {
          this.appendData(res.data)
        }
      })
    },

    // 处理数据格式及渲染前处理,通过接口获取到数据后需要调用这个方法
    appendData(data) {
      // 这里需要处理横纵轴的数据展示,然后放到option里面
      const currentTotalNumberList = data.map((item) => item.currentTotalNumber)
      const todayIncreaseNumberList = data.map((item) => item.todayIncreaseNumber)
      const todayAddNumberList = data.map((item) => item.todayAddNumber)
      const todayDeleteNumberList = data.map((item) => item.todayDeleteNumber)
      const todayLossNumberList = data.map((item) => item.todayLossNumber)
      const xAxisList = data.map((item) => item.showTime)
      const option = {
        color: ['#165DFF', '#1FA087', '#D059D3', '#FF8B74', '#259DFF'],
        tooltip: {
          trigger: 'axis',
          axisPointer: {
            lineStyle: {
              color: '#86909C', // 显示竖线颜色
              type: 'dashed'
            }
          },
          backgroundColor: 'rgba(0,0,0,0)', // tooltip背景色
          borderColor: 'rgba(204,204,204,0)', // tooltip边框颜色
          borderWidth: 1,
          borderRadius: 4,
          width: 300,
          /* eslint-disable */
          formatter: function (param) {
            // 自定义tooltip内容
            let text = ''
            text += `<div style="background: rgba(204,204,204,0.1);border-radius:4px;padding:8px;backdrop-filter: blur(5px);box-shadow: 0px 0px 16px 0px rgba(29,48,92,0.15);">
                          <div style="color:#1D2129;font-size:12px;">${param[0].name}</div>`
            param.forEach((item, index) => {
              text += `<div style="background:#ffffff;border-radius:2px;margin:8px 0;padding:4px 8px;margint-bottom:30px">
                          <b style="display:inline-block;width:8px;height:8px;border-radius:6px;background-color:${param[index]?.color}"></b>
                          <span style="color:#4E5969;font-size: 12px; margin-right:50px;">${param[index]?.seriesName} </span>
                          <span style="float:right;color:#1D2129;font-size:12px;">${param[index]?.value}</span>
                        </div>`
            })
            text += `</div>`
            return text
          }
        },
        legend: {
          data: ['好友总数', '净增人数', '添加人数', '删除人数', '流失人数'],
          top: '0%',
          left: '97',
          textStyle: {
            fontSize: 14
          }
        },
        grid: {
          left: '3%',
          right: '3%',
          bottom: '1%',
          top: '14%',
          containLabel: true
        },
        xAxis: {
          type: 'category',
          boundaryGap: false,
          data: xAxisList,
          axisLine: {
            // x轴
            lineStyle: {
              color: '#E5E6EB'
            }
          },
          axisTick: {
            // x轴刻度线
            lineStyle: {
              color: '#C9CDD4'
            }
          },
          axisLabel: {
            textStyle: {
              color: '#86909C'
            }
            // interval: function (index, value) {
            //   if (xAxisList.length <= 12) {
            //     return true
            //   }
            //   // 取余后的个数
            //   const count = (xAxisList.length - 1) % 11
            //   if (index === xAxisList.length - 1 || index === 0) {
            //     return true
            //   } else {
            //     return (index % Math.floor((xAxisList.length - 1 - count) / 11) === 0) && (index < (xAxisList.length - count))
            //   }
            // },
            // formatter: function (value, index) {
            //   // 取余后的个数
            //   const count = (xAxisList.length - 1) % 11
            //   if (xAxisList.length <= 12) {
            //     return value
            //   }
            //   if (index === xAxisList.length - 1 || index === 0) {
            //     return value // 最后一个日期必须有文字展示
            //   } else if ((index % Math.floor((xAxisList.length - 1 - count) / 11) === 0) && (index < (xAxisList.length - count))) {
            //     return value // 其余的日期平均分配11个点
            //   } else {
            //     return ' '
            //   }
            // }
          }
        },
        yAxis: {
          type: 'value',
          minInterval: 1,
          nameLocation: 'end',
          nameTextStyle: {
            color: '#86909C',
            fontSize: 12,
            marginRight: 23
            //  align:"left"
          },
          axisLine: {
            // y轴线
            show: false
          },
          axisTick: {
            // y轴刻度
            show: false
          },
          axisLabel: {
            // show :false,
            color: '#86909C'
          },
          splitLine: {
            lineStyle: {
              color: '#E4E4E4',
              type: 'dashed'
            }
          }
        },
        series: [
          {
            name: '好友总数',
            type: 'line',
            data: currentTotalNumberList,
            symbol: 'none'
          },
          {
            name: '净增人数',
            type: 'line',
            data: todayIncreaseNumberList,
            symbol: 'none'
          },
          {
            name: '添加人数',
            type: 'line',
            data: todayAddNumberList,
            symbol: 'none'
          },
          {
            name: '删除人数',
            type: 'line',
            data: todayDeleteNumberList,
            symbol: 'none'
          },
          {
            name: '流失人数',
            type: 'line',
            data: todayLossNumberList,
            symbol: 'none'
          }
        ]
      }
      this.drawInit(option)
    },
    drawInit(option) {
      this.$nextTick(() => {
        const dom = this.$refs.friendsTrend
        if (dom) {
          this.myChart = echarts.init(dom)
          this.myChart.clear() // 必写,清空数据,重新赋值
          this.myChart.resize()
          this.myChart.setOption(option)
        }
      })
    }
  }
}
</script>

<style lang="scss" scoped>
.friendsTrend {
  height: 500px;
}
</style>
 

 

posted @ 2024-02-20 17:34  wjs0509  阅读(74)  评论(0编辑  收藏  举报