如何在微信小程序开发中使用echarts以及踩坑记录(最全教程)

8,592 阅读4分钟

一、Echarts 简介

  Echarts是一个基于JavaScript的开源可视化图表库,可以用于创建各种类型的图表,包括折线图、柱状图、散点图、饼图、地图等。Echarts具有丰富的交互功能,可以通过鼠标滚轮缩放、拖拽、点击等方式与图表进行交互,同时也支持动态数据更新和多图表联动等高级功能。Echarts的使用非常灵活,可以通过简单的配置实现各种复杂的图表效果,同时也支持自定义主题和扩展插件。Echarts广泛应用于数据可视化、商业分析、地理信息系统等领域。

二、在小程序中引入echarts

那如何将 echarts 引入到微信小程序项目中呢?

1.下载echarts插件

官网中介绍到:echarts-for-weixin 项目提供了一个小程序组件,用这种方式可以方便地使用 ECharts。

  echarts-for-weixin 下载地址:github.com/ecomfe/echa…

下载下来后解压后目录文件如下:

image.png 将 “ec-canvas”文件夹放置小程序的项目目录下(无要求 components里pages里 均可 根据个人习惯,我是直接放到pages里)

image.png github 网页下载时,可以看到 ec-canvas 的版本号为 5.3.3 版本尤为重要,后面会说明原因

image.png

2.定制图形,生成 echarts.min.js 文件

因为小程序限制大小的原因 用“ec-canvas” 目录中的 echarts.js有些大,小程序后期上线对文件大小有要求,所以建议进行定制下载导入可减少文件大小占比

接下来就是找到官网,去定制自己需要的图表;

  官网地址:echarts.apache.org/zh/index.ht…

  进入官网后,点击下载如下图:

image.png 进入在线定制页面后,

第一步,选择下载的版本;必须和上面下载的ec-canvas中的echarts.js的版本一致,否则是无法正常使用的,如下图所示:

image.png 第二步,选择要打包的图表,其它默认,如下图所示:

image.png 第三步,翻到最下面,点击下载按钮,生成 echarts.min.js 文件,如下图:

image.png

3、替换 echarts.js 文件

下载完成后, 找到你下载的文件:echarts.min.js;然后把项目中 “ec-canvas” 目录中的 echarts.js 文件替换为 echarts.min.js;

image.png 注意: ec-canvas.js的import引入的是原来的echarts.js文件,你需要自己改成刚才下载的文件,如下图所示:

image.png

三、小程序中使用 Echarts

上面我们已经将echarts引入到项目中了,接下来就是如何去使用它生成图表。下面我将以代码的形式详细阐述用法:

正常创建page,各文件配置如下:

pages/index/index.json

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

pages/index/index.wxml

<view class="container">
  <view class="echarts">
    <ec-canvas id="myChart" canvas-id="myChart" ec="{{ec}}"></ec-canvas>
  </view>    
    <button bindtap="change">改变</button> //相当于模拟动态改变echarts数据
</view>

pages/index/index.wxss

.container {
  width: 100%;
}
.echarts {
  width: 100%;
  height: 500rpx;
}
.ec-canvas {
  width: 100%;
  height: 100%;
}

pages/index/index.js

// 1、引入脚本
import * as echarts from '../../ec-canvas/echarts';
 
Page({
  data: {
    ec: {
      lazyLoad: true // 懒加载
    }
  },
  //button绑定事件----动态修改表的内容,和初始化一样
  change(){
    let data = [2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0];
    this.initchart(data);
  },
 
  loadchart(data){
    // 绑定组件(ec-canvas标签的id)
    let ec_canvas = this.selectComponent('#myChart');
    ec_canvas.init((canvas,width,height,dpr)=>{
      const chart =echarts.init(canvas, null, {
        width: width,
        height: height,
        devicePixelRatio: dpr // 解决模糊显示的问题
      })
      // echart表格的内容配置
      var myoption = {
        title: {},
        tooltip: {
          trigger: 'axis'
        },
        legend: {},
        xAxis: {
          type: 'category',
          boundaryGap: false,
          data: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
        },
        yAxis: {
          type: 'value',
          axisLabel: {
            formatter: '{value} '
          }
        },
        series: [
          {
            name: 'price',
            type: 'line',
            data: data, // 动态修改的数据
            markPoint: {
              data: [
                { type: 'max', name: 'Max' },
                { type: 'min', name: 'Min' }
              ]
            }
          }
        ]
      }
      chart.setOption(myoption);
      return chart;
    })
  },
  initchart(data){
    // 传递后台数据到图表中,进行懒加载图表
    this.loadchart(data);
  },
 
  onLoad: function (options) {
    //模拟后台数据初始化
    let data = [1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0];
    this.initchart(data);
  },
})

四、常见的坑(持续更新)

小程序中echarts图滑动消失

tooltip提示框显示后拇指移动到图表外时echart图消失
在tooltip属性中添加triggerOn: 'click', 使提示框只能在点击时出现

微信小程序echarts中formatter配置全部无效

更新数据时setOption将formatter加上如:

let option = {
					xAxis: {
						data: this.recordTime,
						axisLabel: {
							interval: this.recordTime.length - 2,
							formatter: function(value, index) {
								let [c, n] = value.split(" ")
								if (n) {
									return c + "\n" + n
								}
								return c
							}
						}
					},
					yAxis: myref.option.yAxis
				}

				option.yAxis[1].axisLabel = {
					formatter: value => {
						return value != 0 ? value : ''
					},
				}
				chart.setOption(option)

关于引入依赖,引入库,按照官方的使用方法使用后,echarts 图不显示的问题

html在使用 echarts 时,外层包裹着的 view 标签也要设置宽高,也就是上面wxss代码中的container (官方的方法样式里没有设置外层元素的宽高,在官方的示例中又可以显示,这就误导了很多人会掉坑)

关于 devicePixelRatio 的作用

当你设置了 devicePixelRatio 后,会发现echarts的图表在微信开发者工具中看到的 echarts 图表像素是很差的,用手机预览的时候,是很清晰的,当把 devicePixelRatio 去掉后,微信开发者工具中看到的 echarts 图表像素变得很清晰,手机看到的是像素变差了,所以这个属性根据自己实际情况需要去选择是否添加devicePixelRatio

const chart =echarts.init(canvas, null, {
        width: width,
        height: height,
        devicePixelRatio: dpr // 解决模糊显示的问题
      })

ec-canvas出现上下滑动页面会漂移

在标签内加 force-use-old-canvas="true"