第一篇: antv g2 数据变更(vue)

1,196 阅读1分钟

1. 前言

在实际项目中使用到了antv g2做数据可视化,免不了需要调用后端接口获取数据源重新渲染图表的情况,故此篇主要是讲解获取到后端数据后如何重新渲染图表

2. 使用g2

  • vue项目中安装
npm install @antv/g2 --save
  • vue项目引入
import { Chart } from '@antv/g2'

针对特定场景图表建议封装为组件

3. 方式

  • dataset状态 设置一个状态然后用监听状态改变渲染页面,setState('name', 'value'),监听状态改变事件即可,这里主要将第二种方式,dataset状态打算放下一篇讲解
  • chart.changeData 这里我以饼图为例 关键代码
    第一步:
    const chart = new Chart({
        container: this.$props.id,
        autoFit: true,
        height: this.$props.height
      })
      chart.data(pieData)
      
      第二步:
        _instanceChart(chart = {}) {
           this.$emit('handleChange', chart)
        },
        父组件1-1:监听handleChange
         <d-pie
                   :id="'pie1'"
                   :data="toDoWorkData"
                   :is-change-data="isChangeToDoWorkData"
                   ref="work"
                   @handleChange="handleWorkDataChange"/>
       父组件1-2: 拿到子组件图表实例
        handleWorkDataChange(data) {
          this.workChart = data
        }
      第三步:在初始化图表最后加入  
       this._instanceChart(chart)
       
      第四步:父组件中调用,这样可以做到动态感知
        getToDoWorkList() {
      const { $message } = this
      getToDoWork()
        .then((res) => {
          if (res.code === 200) {
            this.toDoWorkData = res.data
              ......
            // 重新渲染图表
            // 考虑顺序问题:先加载数据还是先初始化图表
            //  1) 如先加载数据再渲染图表则直接赋值,否则按以下方式
            this.workChart.changeData(this.toDoWorkData)
            // TODO - 设置默认选中一项,参数:数组索引
            ......
          } else {
            $message.info(res.msg)
          }
        })
        .catch((error) => {
          $message.error(`load todowork error: ${error.message}`)
        })
    },
    
    第五步:设置默认项 或动态随机选中 (非必要)
    代码1:默认项
     setDefaultSelectedElements(eleIndex = 0) {
      // if (!this.$props.isOpenAnimate && this.$props.data.length !== 0) {
      //     this.interval.elements[eleIndex].setState('selected', true)
      // }
      this.interval.elements[eleIndex].setState('selected', true)
    }
    
    代码2: 动态
     clearTimeout(this.t)
        // TODO 非空判断
        var _len = this.$props.data.length
        var eleIndex = Math.floor(Math.random() * _len)
         // 设置其它元素为false,非激活状态
        for (var i = 0; i < _len; i++) {
          if (eleIndex !== i) {
             this.interval.elements[i].setState('selected', false)
             continue
          }
          this.interval.elements[eleIndex].setState('selected', true)
        }
        this.t = setTimeout(this.animate, this.$props.intervalTime)

结束

4. 总结

本人初学antv g2,可能官方有更好的实现方式,在此做个记录,欢迎学习交流。持续学习中......

图表 - Chart | G2 (antv.vision)