微信小程序使用echarts

这周做的项目需要在小程序上画一个折线图和一个柱状图,之前用的插件有些旧了,尺寸只能使用px,在小程序上可以说是非常致命了,找了一下发现echarts居然有小程序版本,当场决定换个轮子
github地址:ecomfe/echarts-for-weixin
这是一个小程序的组件,帮我们兼容了小程序的canvas,使得我们可以方便的在小程序上使用echarts,
echarts自然不用多说,涵盖了各种类型的图表,高度的可自定化,可以说是数据可视化的标配解决方案了

下载

首先下载该项目,文件路径如下
在这里插入图片描述
其中ec-canvas是这个组件,其他的代码是一个完整的实例小程序,可以直接跑,也可以参考一下实例代码,安装的话,把ec-canvas文件夹拷贝到自己的项目内,然后当做一个自定义组件使用就可以了
要注意ec-canvas目录下有一个echarts.js文件,这个是echarts的代码,这里推荐去echarts官网自己整理一个项目中要用的来替换调,以减少代码体积
echarts的定制网址
将自己要用的东西打包成一个js文件来替换掉原本的echarts.js

使用

首先在json中像使用其他组件一样将它引入

{
  "usingComponents": {
    "ec-canvas": "/components/ec-canvas/ec-canvas"
  }
}

然后在页面中使用该组件
这里要注意一定要用一个有宽高的盒子将它包起来,确保它在初始化时候可以获取到宽高

<view class="{{showChart?'bt_2p-chart':'bt_2p-chart hidden'}}">
	<ec-canvas id="mychart-dom-bar" canvas-id="mychart-bar" ec="{{ ec }}"></ec-canvas>
</view>

组件的ec是一个在js中定义的对象,它是图表可以在加载时被设置

import * as echarts from '../../components/ec-canvas/echarts';
function initChart(canvas, width, height, dpr) {
  const chart = echarts.init(canvas, null, {
    width: width,
    height: height,
    devicePixelRatio: dpr // 像素
  });
  canvas.setChart(chart);

  var option = {
    ...
  };
  chart.setOption(option);
  return chart;
}

Page({
  data: {
    ec: {
      onInit: initChart
    }
  }
});

将option信息完整的填写后,就可以在页面上画出一个图表了
option的设置完全遵从echarts的设置,我们可以和配置echarts一样配置它
当然现在的图表还不能使用,数据是写死在option中的,实际项目中肯定需要从接口获取,需要图表在数据返回后再生成,这里可以参考实例代码里的pages/lazyLoad,展示了如何获取数据后再初始化图表

具体步骤如下
首先要在ec中增加lazyload字段,将 lazyLoad 设为 true 后,就需要手动初始化图表了

  data: {
  	...
    ec: {
      // 手动初始化图表
      lazyLoad: true
    }

然后获取页面上图表的dom节点

  onReady: function () {
    // 获取组件
    this.ecComponent = this.selectComponent('#mychart-dom-bar');
  },

在数据返回后,再初始化图表即可

(){
// callback
    this.ecComponent.init((canvas, width, height, dpr) => {
      // 获取组件的 canvas、width、height 后的回调函数
      // 在这里初始化图表
      const chart = echarts.init(canvas, null, {
        width: width,
        height: height,
        devicePixelRatio: dpr // new
      });
      const option = {
		...
      }
	  chart.setOption(option)
      // 将图表实例绑定到 this 上,可以在其他成员函数中访问
      this.chart = chart;

      // 注意这里一定要返回 chart 实例,否则会影响事件处理等
      return chart;
    });
}

这样就可以达到获取数据后再初始化图表的效果了
下面贴上完整代码
要注意如果图表的dom节点可能会被wx:if隐藏的话,一定要确保在selectComponent的时候是展示的,否则会获取到null

  // 生成图表,如果是7天则传入最近7天的Categories,不是则不用传,固定使用24小时的Categories
  // 数据返回后调用该方法即可
  // DONE 更新为echarts for weixin  https://github.com/ecomfe/echarts-for-weixin
  createCharts(data, sevenDayCategories) {
    // 先隐藏图表缺省页,使图表的dom节点可以被获取
    this.setData({
      emptyCharts: false
    })
    // 再获取页面的图表dom节点
    const ecComponent = this.selectComponent('#mychart-dom-line');
    // 遍历数据,生成图表数据,顺便判断图表是否为空,为空则直接设置为缺省页
    let series = []
    let option = []
    if (JSON.stringify(data) == "{}") {
      chartsData.push({
        name: '首页',
        data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        format: function (val) {
          return val
        }
      })
    } else {
      let emptyCharts = true
      for (let key in data) {
        option.push(key)
        let arr = []
        for (let hour in data[key]) {
          arr[hour] = data[key][hour]
          if (data[key][hour] != 0) emptyCharts = false
        }
        series.push({
          name: key,
          type: 'line',
          smooth: true,
          data: arr
        })
      }
      if (emptyCharts) {
        this.setData({
          emptyCharts: true
        })
        return
      }
    }
    ecComponent.init((canvas, width, height, dpr) => {
      // 获取组件的 canvas、width、height 后的回调函数
      // 在这里初始化图表
      const chart = echarts.init(canvas, null, {
        width: width,
        height: height,
        devicePixelRatio: dpr // new
      });
      const option = {
        color: ["#37A2DA", "#67E0E3", "#9FE6B8"],
        legend: {
          data: option,
          left: 'center',
          z: 100
        },
        minInterval: 1,
        grid: {
          containLabel: true,
          bottom: 0,
          top: '20%',
          left: "5%",
          right: "5%"
        },
        tooltip: {
          show: true,
          trigger: 'axis',
          formatter: function (params) {
            let str = `${params[0].axisValue}\n`
            for (let i = 0; i < params.length; i++) {
              if (i == params.length - 1) {
                str += params[i].seriesName + ':' + params[i].value
              } else {
                str += params[i].seriesName + ':' + params[i].value + '\n'
              }
            }
            return str
          }
        },
        xAxis: {
          type: 'category',
          boundaryGap: true,
          data: sevenDayCategories ? sevenDayCategories : ['0时', '1时', '2时', '3时', '4时', '5时', '6时', '7时', '8时', '9时', '10时', '11时', '12时', '13时', '14时', '15时', '16时', '17时', '18时', '19时', '20时', '21时', '22时', '23时'],
        },
        yAxis: {
          type: 'value',
          splitLine: {
            lineStyle: {
              type: 'dashed'
            }
          }
        },
        series: series
      };
      chart.setOption(option);
      // 注意这里一定要返回 chart 实例,否则会影响事件处理等
      return chart;
    })


  },

完整的图表效果如下
x轴为小时的图表
在这里插入图片描述

x轴为天的图表
在这里插入图片描述

数据都为空的缺省
在这里插入图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值