vue+echarts实现动态绘制图表及异步加载数据的方法

分析:

数据变化的时候。需要重新setOption

需要注意的点:

1.echarts图表的那个div必须要有宽高才能显示。

2.如果图表不显示。先log打印一下getElementById看看是不是空的。如果是空的多半是还没加载完。需要使用this.$nextTick等加载完之后。再去init和setOption即可。

效果:

 

 

 

主要代码:

   <div class='common-flex record-2-bottom record-2-bottom-1-title'>
          <!-- 对比图表  -->
          <div class='common-card common-card-5 record-2-bottom-1'>
            <h3 class='common-title common-chart-title '>
              数据对比
            </h3>
            <div class='gdw-select-box'>
              <!--            种类-->
              <el-select
                v-model='typeSelected2'
                @change='selectChanged'
                placeholder='请选择'
                class='common-select'
              >
                <el-option label='全部种类' :value='null'></el-option>
                <el-option
                  v-for='(item, index) in typeList'
                  :key='index'
                  :label='item.name'
                  :value='item.id'
                >
                </el-option>
              </el-select>
              <!--            认证级别-->
              <el-select
                v-model='identifiedLevelSelected2'
                @change='selectChanged'
                placeholder='请选择'
                class='common-select'
              >
                <el-option label='全部级别' :value='null'></el-option>
                <el-option
                  v-for='(item, index) in identifiedLevelList'
                  :key='index'
                  :label='item.name'
                  :value='item.id'
                >
                </el-option>
              </el-select>
              <!--            项目-->
              <el-select
                v-model='projectSelected2'
                @change='selectChanged'
                placeholder='请选择'
                class='common-select'
              >
                <el-option label='全部项目' :value='null'></el-option>
                <el-option
                  v-for='(item, index) in projectList'
                  :key='index'
                  :label='item.name'
                  :value='item.id'
                >
                </el-option>
              </el-select>
            </div>
            <div class='common-title-part-cont' v-if='showOptionsrecordOnlySelected'>
              <div
                ref='echartsSelected'
                id='echartsSelected'>
                111柱状图
              </div>
            </div>
            <div class='common-title-part-cont' v-else>
              <bar-line
                ref='recordOnlyEcharts2'
                id='recordOnlyEcharts2'
                :options='$store.state.record.gdwxljlsjdb'
              >
                222柱状图
              </bar-line>
            </div>
          </div>
        </div>
  data() {
    return {
      pageMainToggle: true, // 页面切换状态
      typeSelected2: null, //种类筛选值
      identifiedLevelSelected2: null, // 认证级别筛选值
      projectSelected2: null, // 项目筛选值
      projectList: [], //项目选项
      showOptionsrecordOnlySelected: false,
      optionsRecordOnlyESelected: null
    }
  },
 /**
     * 各柱状图 筛选值改变时触发
     *
     */
    selectChanged() {
      this.showOptionsrecordOnlySelected = true
      this.getRecordGdwxljlsjdb()
    },
    // 数据对比所用数据
    async getRecordGdwxljlsjdb() {
      const ajaxData = {
        // title: {
        //     text: '人',
        //     left: '20px',
        //     textStyle: {
        //         color: "#fff",
        //         // fontSize: 17,
        //     }
        // },
        tooltip: {
          trigger: 'axis'
        },
        grid: {
          left: '3%',
          right: '4%',
          bottom: '5%',
          containLabel: true
        },
        legend: {
          itemWidth: 15,
          itemHeight: 15,
          textStyle: {
            // fontSize: 18,//字体大小
            color: '#ffffff' //字体颜色
          }
        },
        xAxis: {
          data: [],
          splitLine: {
            show: false
          },
          axisLabel: {
            show: true,
            textStyle: {
              color: '#fff'
            },
            interval: 0
          }
        },
        yAxis: {
          splitLine: {
            show: false
          },
          axisLabel: {
            show: true,
            textStyle: {
              color: '#fff'
            }
          }
        },
        series: [
        ]
      }
      await this.$api.unitTrainingData({
        corps: this.typeSelected2,//	种类(传字典id)	query	false
        identifiedLevel: this.identifiedLevelSelected2,//	认定级别(传字典id)	query	false
        project: this.projectSelected2//	项目(传字典id)	query	false
      }).then(res => {
        let seriseArr = []
        let dataArr1 = []
        let dataArr2 = []
        let dataArr3 = []

        ajaxData.xAxis.data = []
        ajaxData.series = []
        res.map(item => {
          seriseArr = item.value
          ajaxData.xAxis.data.push(item.name) // x轴赋值
          dataArr1.push(item.value[0].value)
          dataArr2.push(item.value[1].value)
          dataArr3.push(item.value[2].value)
        })
        const arr = [dataArr1, dataArr2, dataArr3]
        // 颜色数组
        const colorArr = ['#31E5F5', '#27DB9F', '#EBB84D']
        // 遍历生成3个serise,分别是3个堆叠柱状
        seriseArr.map((element, index) => {
          ajaxData.series.push({
            name: element.name,
            type: 'bar',
            stack: '使用情况',
            data: arr[index],
            barWidth: 20,
            itemStyle: {
              normal: { color: colorArr[index] }
            }
          })
        })
      })

      let arr = ajaxData.xAxis.data
      for (let i = 0; i < arr.length; i++) {
        if (arr[i]) {
          let newParamsName = '' // 最终拼接成的字符串
          let paramsNameNumber = arr[i].length // 实际标签的个数
          let provideNumber = 6 // 每行能显示的字的个数
          let rowNumber = Math.ceil(paramsNameNumber / provideNumber) // 换行的话,需要显示几行,向上取整
          /**
           * 判断标签的个数是否大于规定的个数, 如果大于,则进行换行处理 如果不大于,即等于或小于,就返回原标签
           */
          // 条件等同于rowNumber>1
          if (paramsNameNumber > provideNumber) {
            /** 循环每一行,p表示行 */
            for (let p = 0; p < rowNumber; p++) {
              let tempStr = '' // 表示每一次截取的字符串
              let start = p * provideNumber // 开始截取的位置
              let end = start + provideNumber // 结束截取的位置
              // 此处特殊处理最后一行的索引值
              if (p == rowNumber - 1) {
                // 最后一次不换行
                tempStr = arr[i].substring(start, paramsNameNumber)
              } else {
                // 每一次拼接字符串并换行
                tempStr = arr[i].substring(start, end) + '\n'
              }
              newParamsName += tempStr // 最终拼成的字符串
            }
          } else {
            // 将旧标签的值赋给新标签
            newParamsName = arr[i]
          }
          //将最终的字符串返回
          arr[i] = newParamsName
        }
      }
      ajaxData.xAxis.data = arr
      this.optionsRecordOnlyESelected = ajaxData
      this.$nextTick(() => {
        let myChart = echarts.init(document.getElementById('echartsSelected'))
        let option = this.optionsRecordOnlyESelected
        myChart.setOption(option, true)
      })
    }
#echartsSelected {
  width: 100%;
  height: 100%;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南北极之间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值