原生微信小程序Echarts使用

394 阅读4分钟

对于前端开发而言,数据统计模块最熟悉的老朋友就是Echarts,毕竟图形统计比起文字+数字更加直观。一直以来h5和网页的开发中使用Echarts,五花八门的样式和事件都可以通过文档+百度都可以完美实现。在接到在小程序实现饼状图,柱状图的需求时,我的内心毫无波澜,此时的我还没意识问题的严重性。直到开始开发...

首先,我的第一反应就是像开发网页那样安装Echarts依赖,但是正准备安装时我忽然意识到,事情没有想象的那么简单。Echarts使用的第一步,就是要获取生成图表的dom元素啊,而小程序是无法获取dom元素的。啊这...

2075dbc86847acc5b72796b1bc3c622b.jpeg

当然,打工人是没那么容易认输的,马上请教我的老师——百度。好家伙,还有个微信版的Echarts,下载一个微信版的Echats,简而言之,就是专为微信小程序封装的Echarts组件,将它下载到本地的项目里面,通过引入实现对应的需求,主要我没有使用这个方法,所以具体的可以通过下载链接有详细的说明哦,附上下载链接:github.com/ecomfe/echa…

重头戏来了,为什么请教了老师但是没用上参考答案呢。因为它要下载包引入到项目里面啊(哭),众所周知,微信小程序的主包只能容纳2M,其余要通过分包去实现,而这个包推荐是放在主包的。于是我马上查看了微信小程序的开发文档,果然术业有专攻,还是得看官方啊。

1.登录微信公众开发平台(多个开发项目的,记住是登录需要引入的项目)-设置-第三方设置-插件管理-通过 wx1db9e5ab1149ea03 查找Echats插件并添加。通过申请后,就可以在小程序中使用插件啦。

2、在 app.json 中插件如下代码,AppId是指插件的AppId,不是项目的AppId,所以AppId为wx1db9e5ab1149ea03

{
  "plugins": {
    "echarts": {
      "version": "1.0.3",
      "provider": "wx1db9e5ab1149ea03"
    }
  }
}

3、微信开发中,如果组件按需引入,就需要在对应页面的json 配置文件进行配置,插件如下代码:

{
  "usingComponents": {
    "chart": "plugin://echarts/chart"
  }
}

4、在 wxml 中需要展示图表的位置,插入如下代码:

<chart chart-class="chart" option="{{ option }}" bindinstance="onInstance" />

对应的参数属性,我截图文档上面的内容,放下面啦

a.png.png

像网页一样在option里面配置对应的项来达到需求就可以啦,这边就不多说了。

重点说说"bindinstance",以饼状图为例,需求是:饼状图用于统计不同分类,然后饼状图下面是数据列表代表不同分类下的订单。效果是要实现默认其中一个分类高亮,然后点击以后切换饼状图高亮区及根据点击的分类请求接口,渲染底部列表

onInstance({
        detail: instance
}) {
        let that = this
        //设置默认高亮为饼状图数据的第一项
        instance.dispatchAction({
                type: 'highlight',
                seriesIndex: 0,
                dataIndex: 0
        });
        //instance 为返回的实例
        instance.on('click', function(parmas) {
            //that.data.pieOption.series[0].data为饼状图的data数据
            that.data.pieOption.series[0].data.forEach((item, index) => {
                    //parmas.dataIndex为当前点击的index
                    if (parmas.dataIndex != index) {
                            //判断如果不是当前点击的分类,移除高亮
                            instance.dispatchAction({
                                    type: 'downplay',
                                    seriesIndex: 0,
                                    dataIndex: index
                            });
                    } else {
                        //当前点击分类
                        that.setData({
                                cateId: item.id
                        })
                        //请求列表接口
                        that._getSelectByCateId()
                    }
            })
        })
},

以上就是bindinstance的对应使用啦,撒花~

最后再插一个柱状图三柱合一渐变色的实现,先看网页版

itemStyle: {
  color: function (params) {
    if (
      datax[1][params.dataIndex] == 0 &&
      datax[2][params.dataIndex] == 0 &&
      datax[3][params.dataIndex] == 0
    ) {
      return "#00c4e2";
    } else {
      return new echarts.graphic.LinearGradient(0, 0, 0, 1, [
        {
          offset: 1,
          color: "#00c4e2",
        },
        {
          offset: 0,
          color: "#4D85F7",
        },
      ]);
    }
  },
},

但微信小程序我们不像网页import echats,而只是在json里面配置了插件,那自然在js里面就没有new echarts.graphic.LinearGradient啊,这可咋整.不要急。只能是用回最原始的方法了...

itemStyle: {
    color: function(params) {
            if (
                    datax[1][params.dataIndex] == 0 &&
                    datax[2][params.dataIndex] == 0 &&
                    datax[3][params.dataIndex] == 0
            ) {
                    return "#00c4e2";
            } else {
                    return {
                        x: 0, //右
                        y: 0, //下
                        x2: 0, //左
                        y2: 1, //上
                        colorStops: [
                          {
                            offset: 0,
                            color: '#4D85F7' // 0% 处的颜色
                          },
                          {
                            offset: 1,
                            color: '#00c4e2' // 100% 处的颜色
                          }
                        ]
                    }
            }
    },
},

好啦,今天的code就到这里啦,周五万岁!!!