Echarts实用

<template>

  <div :class="className" :style="{height:height,width:width}">

     <div class="tc">

          <img width="200" :src="loading_img" />

    </div>    

  </div>

</template>

<script>

import loading_img from '@/assets/img/form-loading.gif'

import echarts from 'echarts'

require('echarts/theme/macarons') // echarts theme

// import resize from './mixins/resize'

import resize from '@/components/Chart/mixins/resize'

export default {

  mixins: [resize],

  props: {

    perYear:{

    type: Boolean,

    default: false,

    },

    loading:{

      type: Boolean,

      default: true,

    },

    noLine:{

      type: Boolean,

      default: true,

    },

    className: {

      type: String,

      default: 'chart'

    },

    echartParam: {

      type: Object,

      default: {color:[]}

    },

    width: {

      type: String,

      default: '100%'

    },

    height: {

      type: String,

      default: '240px'

    },

    chartData: {

      type: Object,

      required: true

    },

  },

  data() {

    return {

      loading_img:loading_img,

      chart: null

    }

  },

  watch: {

    chartData: {

      deep: true,

      handler(val) {

        this.initChart()

      }

    }

  },

  mounted() {

  },

  beforeDestroy() {

    if (!this.chart) {

      return

    }

    this.chart.dispose()

    this.chart = null

  },

  methods: {

    echartClick() {

      this.initChart()

    },

    initChart() {

     this.chart = echarts.init(this.$el, 'macarons')

      this.setOptions(this.chartData)

    },

    setOptions({ xAxis_data,legend_data,series_data } = {}) {

      if(this.loading){

         this.chart.showLoading()

      }else{

         this.chart.hideLoading()

      }

      

      this.chart.clear();

      if(typeof series_data === 'undefined'){

        return

      }

      this.chart.setOption({

          xAxis: {

            data: xAxis_data[0].data,

            // data: ['1', '2', '3', '4', '5', '6', '7','8', '9', '10', '11', '12'],

            boundaryGap: false,

            axisTick: {

              show: false

            },

            axisLabel:{

              textStyle: 

              {color: '#999'},

              showMaxLabel: true,

              

            },

            axisLine:{

              lineStyle:{ color:'#ccc' }

            }

          },

          color:this.echartParam.color,

          grid: {

            left: '50',

            right: '50',

            bottom: 30,

            top: 55,

            containLabel: false

          },

          tooltip: {

            trigger: 'axis',

            backgroundColor:'rgba(000,000,000,0.6)',

            axisPointer: {

              type: 'cross'

            },

            padding: [5, 10]

          },

          

          yAxis: {

            type: 'value',

            axisLabel:{

                rotate:[45]

            }

          },

          legend:legend_data,

          series: series_data

      });

    }

  }

}

</script>

<template>

<el-dialog :visible.sync="dialogVisible" class="dialogWrap" :before-close="handleClose" :close-on-click-modal="false">

    <div slot="title" class="slotTitle">

      <span>关键词:{{rowDialog.keyword}}</span>

    </div>

    <div class="chooseYear">

        <span>分年显示</span>

        <el-switch v-model="perYear"></el-switch>

    </div>

      <!--  关键词广告趋势-->

      <div class="log-content">

        <div class="right-side"  v-loading="chartLoading">

            <trend-chart

            :chart-data="chartData3"

            :perYear="perYear"

            ref="mychart1"

            class="echart-box"

            height='318px'

            :echart-param="echartParam3"

            :loading="loading"

          />

        </div>

      </div>

   </el-dialog>

</template>

<script>

import trendChart from './trendChart'

import { cpc_api } from "@/api/cpc/recommendedKeywords/index";

export default {

  components: {

    trendChart

  },

    props: {

       dialogVisible:{

           type:Boolean,

           default: true

       },

       accountTotal:{

           type:Object,

           default: {}

       },

       searchData1:{

           type:Object,

           default: {}

       },

    },

    data(){

       return{

        echartParam3: { color: ["#27B8D0", "#FA8C16"] },

        pageData: {

          page: 1,

          size: 10,

          total: 0,

          sizes: [10, 20, 50]

        },

        perYear:false,

        selectList:{},

        tagkeys1:[],//"cpc_exposure", "cpc_click_number"

        tagkeys:[],

        saveArr1:[],

        chartLoading: false,

        chartData3:{},

        select_value: '',

        select_value2: '',

        isShow:'true',

        isTargetSelsct:[],

        topTargetArr:[],

        select_id:'',

        select_id2:'',

        select_value:'',

        radio:'1',

        targetData:[],

        selectData:[],

        loading:false,

        rowDialog:{}

       }

    },

    watch: {

    perYear: {

      deep: true,

      handler(val) {

        this.getMesgInfo()

      }

    }

    },

    created() {

    },

    methods: {

      toSplit(value){

      let value1 = value.toString()

      var str1 = value1.substring(0,4)

      var str2 = value1.substr(4,2)

      return str1 + '-' + str2

    },

      handleClose(){

         this.$emit("click", false)

      },

      getAjax(row){

        this.rowDialog=row

        this.getMesgInfo()

      },

       // 折线图展示

       getMesgInfo() {

        this.loading =true

        let params={

          keyword_id: this.rowDialog.id || this.rowDialog.keyword_id,

          related_id: this.rowDialog.related_id,

          ...this.$AdSearchDateData

        }; 

        cpc_api.get_search_trend_list(params).then(res => {

          this.loading = false;

          let chartData1,chartData2

          if(res.code==200 && res.data){

            // let seriesData = res.data.series;

              let   seriesData = res.data.list

              if(this.perYear == false){

                chartData1 = seriesData.map((item)=>{

                return item.searches

              })

                chartData2 = seriesData.map((item)=>{

                return this.toSplit(item.month)

              })

                res.data.series = [{

                    data: chartData1,

                    name: '搜索量',

                    type: "line"

                }];

                res.data.xAxis_data = [{

                    data: chartData2,

                    name: '',

                    type: "line"

                }];

              }

              else{

                let seriesData = res.data.list_year

                  //把数据按年进行拆分

                let chartData4 = seriesData.map((item)=>(item.year_num).toString())

                  seriesData.forEach((item)=>{

                      if(item.year_num){

                          item.type= 'line'

                          item.name = (item.year_num).toString()

                          delete item.year_num

                      }

                  }

                  )

                  

                  res.data.xAxis_data = [{

                    type: "category",

                    data: ['1', '2', '3', '4', '5', '6', '7','8', '9', '10', '11','12']

                    }];

                  res.data.legend_data = [{

                    data: chartData4,

                    // top: '4%',

                    // left: '2.5%',

                    // icon: "rect",

                    }];

                  res.data.series =  seriesData

                }

              this.$set(this.chartData3, 'xAxis_data', res.data.xAxis_data);

              this.$set(this.chartData3, 'legend_data', res.data.legend_data);

              this.$set(this.chartData3, 'series_data', res.data.series);

              this.$refs.mychart1.echartClick();

          }

      });

    }, 

    }

}

</script>

<style lang='scss' scoped>

.chooseYear{

    margin-left: 84%;

}

.dialogWrap{

  /deep/.el-dialog{

    width: 962px !important;

    height: 394px !important;

    min-height: 394px !important;

    margin-top: 0vh !important;

    .slotTitle{

      span{

        font-size: 16px;

        font-weight: 500;

        color: #333333;

      }

    }

  }

  >>>.el-dialog__header{

      display: flex;

      align-items: center;

      box-sizing: border-box;

      border-bottom: none;

      .el-dialog__headerbtn{

          top: 25px;

      }

  }

  >>> .el-dialog__body{

    padding:0px 0px 24px 24px !important;

    overflow-y: auto;

  }

}

    .log-content {

        display: flex;

        width: 100%;

        height: 306px;

        .right-side {

            width: 100%;

            height: 100%;

            .echart-box {

                width: 100%;

                height: 100%;

            }

        }

        .table-class {

          font-size: 13px;

          width: 100%;

          table-layout: auto;

          .highlight-left {

              border-left: 4px solid #3788fa;

              background-color: #ebf3fe;

          }

          .highlight {

              background-color: #ebf3fe !important;

          }

          th {

              color: #666666;

              font-weight: bold;

              background: #fafafa;

          }

          th,

          td {

              padding: 14px 20px;

              border: 1px solid #e9e9e9;

          }

        }

       

    }

</style>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值