zoukankan      html  css  js  c++  java
  • vue+echart 点击图表切换 类型 由 line 到bar

     

    代码:

    <template>
      <div class="container-echart">
        <div class="lineWrap">
          <div class="line_header">
            <span class="line-name">近10天趋势</span>
          </div>
          <div>
            <a-row type="flex">
              <a-range-picker
                format="YYYY-MM-DD HH:mm:ss"
                :defaultValue="[momentTime(startTime, 'YYYY-MM-DD HH:mm:ss'), momentTime(endTime, 'YYYY-MM-DD HH:mm:ss')]"
                :placeholder="['开始时间', '结束时间']"
                :showTime="{defaultValue:[momentTime('00:00:00', 'HH:mm:ss'), momentTime('23:59:59', 'HH:mm:ss')]}"
                @ok="onOk"
              />
              <div class="flex-img" @click="changOption">
                <img :src="flag== true ? require('@/assets/images/statistics/analytics-graph-chart.png'): require('@/assets/images/statistics/analytics-graph-chart3.png')" class="mr26 ml26" />
                <img :src="flag== true ? require('@/assets/images/statistics/analytics-graph-chart1.png'): require('@/assets/images/statistics/analytics-graph-chart2.png')" />
              </div>
            </a-row>
          </div>
        </div>
        <div id="chart_journal" style="height:400px; 100%"></div>
      </div>
    </template>
    <script>
      import echarts from '@/utils/echarts'
      import moment from 'moment'
      import { getTrend } from '@/api/activity'
      export default {
        props: {
          curStep: {
            type: Number,
            required: true
          }
        },
        data() {
          return {
            mpId: this.$route.params.code,
            activityId: this.$route.query.id,
            flag: true,
            startTime: moment(new Date()).subtract(10, 'days').format('YYYY-MM-DD HH:mm:ss'),
            endTime:  moment(new Date()).subtract(1, 'days').format('YYYY-MM-DD HH:mm:ss'),
            start: parseInt(moment(moment(new Date()).subtract(10, 'days').format('YYYY-MM-DD HH:mm:ss')).valueOf()/1000),  // 默认最近10 天的开始时间
            end: parseInt(moment(moment(new Date()).subtract(1, 'days').format('YYYY-MM-DD HH:mm:ss')).valueOf()/1000), // 默认最近10 天的结束时间
            xData:[],
            fans:[],
            tasks:[],
            joins:[],
            passs:[],
            lock:false
          }
        },
        watch: {
          curStep (newVal) {
            if (newVal === 1&&this.lock === false) {
              // 调用绘制图表的方法
              this.getEchartDate(true)
            }
          }
        },
        methods: {
          momentTime (time, format) {
            return moment(time, format)
          },
          changOption () {
            this.flag = !this.flag
            this.getEchartDate(this.flag)
          },
          onOk(value) {
            if(value) {
              let start = this.dateToMs(value[0])
              let end = this.dateToMs(value[1])
              this.start = parseInt(start)
              this.end  = parseInt(end)
              this.getEchartDate(this.flag)
            }
          },
          //将中国标准时间转换为时间戳
          dateToMs (date) {
            let result = new Date(date).getTime()
            return result/1000
          },
          async getEchartDate (type) {
            this.lock = true
            // 获取到echart 初始化echart
            let chart = echarts.init(document.getElementById('chart_journal'))
            // 初始化图表
            this.init(type)
            // 切换数据 必须赋值为空
            this.xData = []
            this.fans = []
            this.tasks = []
            this.joins = []
            this.passs = []
            let params = {
              mpId: this.mpId,
              activityId: this.activityId,
              info: {
                start: this.start,
                end: this.end
              }
            }
            const  {data} = await getTrend(params)
            let echartData = data.data.entries
            echartData.map(item=>{
              this.xData.push(item.createTime)
              this.fans.push(item.netGrowthNum)
              this.tasks.push(item.finishNum)
              this.joins.push(item.joinNum)
              this.passs.push(item.noSubscribeNum)
            })
            if (echartData.length  === 0) {
              this.xData = '-'
              this.fans=[0]
              this.tasks=[0]
              this.joins=[0]
              this.passs=[0]
            }
            // 重组数据
            chart.setOption({ //加载数据图表
              xAxis : {
                data : this.xData
              },
              series : [
                {
                  // 根据名字对应到相应的系列
                  data : this.fans
                },
                {
                  // 根据名字对应到相应的系列
                  data : this.tasks
                },
                {
                  data: this.joins
                },
                {
                  data: this.passs
                }
              ]
            })
          },
          init(type) {
            let chart = echarts.init(document.getElementById('chart_journal'))
            let option = {
              // backgroundColor:'#2A2C64',
              tooltip: {
                trigger: 'axis',
                axisPointer: { // 坐标轴指示器,坐标轴触发有效
                  type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
                }
              },
              grid: {
                left: '4%',
                right: '3%',
                bottom: '14%',
                top:'16%',
                containLabel: true
              },
              legend: {
                data: ['净增粉丝', '完成任务', '参与人数', '取关人数'],
                left: 100,
                textStyle: {
                  color: "#989898",
                  padding: [14, 14, 14, 14]
                },
                itemWidth: 12,
                itemHeight: 10,
                itemGap: 42
              },
              xAxis: {
                type: 'category',
                data: [],
                axisLine: {
                  lineStyle: {
                    color: '#2F2F2F',
                  }
                },
                axisLabel: {
                  fontSize: 18,
                  fontFamily: 500,
                  lineHeight: 20,
                  height: 20,
                   47,
                  padding: [39, 40, 48, 40],
                  textStyle: {
                    fontFamily: 'Roboto, Roboto-Medium',
                    color: '#2f40cb',
                    fontWeight: '500'
                  }
                },
              },
              yAxis: {
                type: 'value',
                data: [],
                axisLine: {
                  show: false,
                  lineStyle: {
                    color: 'white',
                  }
                },
                splitLine: {
                  show: true,
                  lineStyle: {
                    color: '#989898',
                    type: "dashed"
                  }
                },
                axisLabel: {
                  fontSize: 18,
                  fontFamily: 500,
                  lineHeight: 20,
                  height: 20,
                   47,
                  padding: [10, 30, 0, 0],
                  textStyle: {
                    fontFamily: 'Roboto, Roboto-Medium',
                    color: '#333333',
                    fontWeight: '500'
                  }
                }
              },
              series: [
                {
                  name: '净增粉丝',
                  type: (type === true) ? 'line' : 'bar',
                  barWidth: '8px',
                  itemStyle: {
                    normal:{
                      color:'#FB9513'
                    }
                  },
                  data: []
                },
                {
                  name: '完成任务',
                  type: (type === true) ? 'line' : 'bar',
                  barWidth: '8px',
                  itemStyle: {
                    normal:{
                      color:'#1B85FF'
                    }
                  },
                  data: []
                },
                {
                  name: '参与人数',
                  type: (type === true) ? 'line' : 'bar',
                  barWidth: '8px',
                  itemStyle: {
                    normal:{
                      color:'#30C300'
                    }
                  },
                  data: []
                },
                {
                  name: '取关人数',
                  type: (type === true) ? 'line' : 'bar',
                  barWidth: '8px',
                  itemStyle: {
                    normal:{
                      color:'#DD00A6'
                    }
                  },
                  data: []
                }
              ]
            }
            chart.setOption(option)
          }
        }
      }
    </script>
    
    <style  scoped>
      .income-i-left {
        10px;
        height:10px;
        background:rgba(217,238,236,1);
        display: inline-block;
        border-radius: 50%;
      }
      .container-echart {
        height: 526px;
        margin-top: 33px;
        background: #fdfdfd;
        border-radius: 5px;
        box-shadow: 2px 2px 20px 0px rgba(47,47,47,0.11);
      }
      .line_header {
         115px;
        height: 24px;
        font-size: 22px;
        font-family: PingFangSC, PingFangSC-Medium;
        font-weight: 500;
        text-align: left;
        line-height: 24px;
        margin-top: 30px;
        margin-bottom: 30px;
      }
      .line-name {
         115px;
        height: 24px;
        font-size: 22px;
        font-family: PingFangSC, PingFangSC-Medium;
        font-weight: 500;
        text-align: left;
        color: #2f40cb;
        line-height: 24px;
      }
      .lineWrap {
        margin-right: 66px;
        display: flex;
        flex-direction: row;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 20px;
        margin-left: 30px;
      }
      .flex-img {
        display: flex;
        align-items: center;
        justify-content: center;
      }
    </style>
  • 相关阅读:
    default.js 下的 setPromise(WinJS.UI.processAll());
    选择排序
    插入排序
    16、css实现div中图片占满整个屏幕
    21、解决关于 vue项目中 点击按钮路由多了个问号
    15、vue项目封装axios并访问接口
    17、在vue中引用移动端框架Vux:
    24、vuex刷新页面数据丢失解决办法
    18、git提交代码并将develop分支合并到master分支上
    20、解决Vue使用bus兄弟组件间传值,第一次监听不到数据
  • 原文地址:https://www.cnblogs.com/guangzhou11/p/14132449.html
Copyright © 2011-2022 走看看