微信小程序中使用ECharts&怎么动态绑定数据?报表数目不确定怎么办?

快速到达官网:ECharts官方网址说明


微信开发者工具中使用ECharts

下载ECharts官方给的GitHub项目:传送门
如果网络不行可以下载gitee的:传送门
在这里插入图片描述

然后我们把下载好的echarts-for-weixin-master文件解压
在这里插入图片描述

然后打开微信开发者工具,选择小程序=》点击导入项目=》目录选择刚才的解压文件夹=》AppID用测试号=》点击导入
在这里插入图片描述
然后我们就打开到了官方Demo项目,里面有很多报表供参考,你可以预览一下,后续我会用官方的事例来说一些使用中存在的问题。
在这里插入图片描述

然后官方封装好的组件代码都在ec-canvas这个文件夹
在这里插入图片描述
然后我简单的说一下在我们自己的项目中要怎么引入ECharts,因为使用方式就是引用组件,我就简单说一下流程,首先我们要将ec-canvas文件夹拷贝到自己的项目中,然后接下来我都会以pie饼状图为例子解说,因为pie的代码比较简洁,说起来比较清晰, 接着要修改配置pages下4个文件,json文件需引入"ec-canvas"组件 ,注意一下自己的目录层级,别搞错路径了
在这里插入图片描述
wxml文件需要引入<ec-canvas></ec-canvas>组件标签,然后外层要套一次view标签,然后view标签可以设置position或者弹性布局display,但是需要注意的是如果你只用弹性布局的话,需要给ec-canvas标签添加实高,不然报表会不显示,具体看下面GIF。
在这里插入图片描述
然后js文件要导入echarts文件(别搞错路径了,否知会报错echarts is a not function等东西),然后初始化报表方法initChart要写在Page外面,然后要在data里的ec对象的onInit属性绑定initChart初始化方法。
在这里插入图片描述
好了,经过以上步骤,就可以简单的导入一个图表了。


怎么动态绑定数据?

可以显示报表后你会发现一个问题,从后端接口拿到数据后要怎么绑定到表里面咧?其实在官方按钮的延迟加载图表中可以找到答案,但是你会发现它是手动的,并且js里面很多没用的东西,
在这里插入图片描述
所以接下来依旧以pie饼状图为例子,其实就是把加载方式换成异步的形式,然后再拿到后端的数据后在进行页面的渲染,具体看下面代码,拷贝代码替换掉官方原先pie饼状图例子里的js代码就好了

import * as echarts from '../../ec-canvas/echarts';

//设定EChart报表的状态
function setOption(chart, color_arr, series_data) {
  var option = {
    backgroundColor: "#ffffff",
    color: color_arr,
    series: [{
      label: {
        normal: {
          fontSize: 14
        }
      },
      type: 'pie',
      center: ['50%', '50%'],
      radius: ['40%', '60%'],
      data: series_data
    }]
  };
  chart.setOption(option);
}

Page({
  data: {
    ec: {
      // onInit: initChart
      // 将 lazyLoad 设为 true 后,需要手动初始化图表
      lazyLoad: true
    }
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    // 调用后端数据
    // wx.request({
    //   url: `https://xxx.com/`,
    //   data: {
    //     id: '123'
    //   },
    //   method: 'GET',
    //   header: {
    //     'content-type': 'application/x-www-form-urlencoded'
    //   },
    //   success: function (res) {
    // console.log(res)

    // 这里开始我们假设已经从后端拿到了数据
    let color_arr = ["#37A2DA", "#32C5E9", "#67E0E3", "#91F2DE", "#FFDB5C", "#FF9F7F"];
    let series_data = [{
      value: 55,
      name: '北京'
    }, {
      value: 20,
      name: '武汉'
    }, {
      value: 10,
      name: '杭州'
    }, {
      value: 20,
      name: '广州'
    }, {
      value: 38,
      name: '上海'
    }];
    // 获取组件
    let ecComponent = this.selectComponent('#mychart-dom-pie');
    ecComponent.init((canvas, width, height, dpr) => {
      // 获取组件的 canvas、width、height 后的回调函数
      // 在这里初始化图表
      const chart = echarts.init(canvas, null, {
        width: width,
        height: height,
        devicePixelRatio: dpr // new
      });
      //调用设定EChart报表状态的函数,并且把从后端拿到的数据传过去
      setOption(chart, color_arr, series_data);
      // 注意这里一定要返回 chart 实例,否则会影响事件处理等
      return chart;
    });

    //   }
    // })

  },
});

另外,因为使用了异步加载,所以不用在data里面绑定初始化的方法,所以可以把代码写成这个样子:

import * as echarts from '../../ec-canvas/echarts';

Page({
  data: {
    ec: {
      // 将 lazyLoad 设为 true 后,需要手动初始化图表
      lazyLoad: true
    }
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    // 调用后端数据
    // wx.request({
    //   url: `https://xxx.com/`,
    //   data: {
    //     id: '123'
    //   },
    //   method: 'GET',
    //   header: {
    //     'content-type': 'application/x-www-form-urlencoded'
    //   },
    //   success: function (res) {
    // console.log(res)

    // 这里开始我们假设已经从后端拿到了数据
    let color_arr = ["#37A2DA", "#32C5E9", "#67E0E3", "#91F2DE", "#FFDB5C", "#FF9F7F"];
    let series_data = [{
      value: 55,
      name: '北京'
    }, {
      value: 20,
      name: '武汉'
    }, {
      value: 10,
      name: '杭州'
    }, {
      value: 20,
      name: '广州'
    }, {
      value: 38,
      name: '上海'
    }];
    // 获取组件
    let ecComponent = this.selectComponent('#mychart-dom-pie');
    ecComponent.init((canvas, width, height, dpr) => {
      // 获取组件的 canvas、width、height 后的回调函数
      // 在这里初始化图表
      const chart = echarts.init(canvas, null, {
        width: width,
        height: height,
        devicePixelRatio: dpr // new
      });
      //调用设定EChart报表状态的函数,并且把从后端拿到的数据传过去
      this.setOption(chart, color_arr, series_data);
      // 注意这里一定要返回 chart 实例,否则会影响事件处理等
      return chart;
    });

    //   }
    // })

  },
  //设定EChart报表的状态
  setOption(chart, color_arr, series_data) {
    var option = {
      backgroundColor: "#ffffff",
      color: color_arr,
      series: [{
        label: {
          normal: {
            fontSize: 14
          }
        },
        type: 'pie',
        center: ['50%', '50%'],
        radius: ['40%', '60%'],
        data: series_data
      }]
    };
    chart.setOption(option);
  }

});

报表数目不确定怎么办?

如果报表的数目确定的话很好办,官方给的demo有给出来,模拟器滚动到页底就可看到,page名是multiCharts
在这里插入图片描述

方法一

第一种是直接通过JS循环遍历实现,具体看下面代码,拷贝代码替换掉官方原先pie饼状图例子里的js代码就好了

import * as echarts from '../../ec-canvas/echarts';
Page({
  data: {
    ec: {
      // 将 lazyLoad 设为 true 后,需要手动初始化图表
      lazyLoad: true
    }
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    // 调用后端数据
    // wx.request({
    //   url: `https://xxx.com/`,
    //   data: {
    //     id: '123'
    //   },
    //   method: 'GET',
    //   header: {
    //     'content-type': 'application/x-www-form-urlencoded'
    //   },
    //   success: function (res) {
    //     console.log(res)

    // 这里开始我们假设已经从后端拿到了数据
    let color_arr = ["#37A2DA", "#32C5E9", "#67E0E3", "#91F2DE", "#FFDB5C", "#FF9F7F"];
    let chartData = [{
        title: '报表一',
        data: [{
          value: 40,
          name: '北京'
        }, {
          value: 30,
          name: '广州'
        }, {
          value: 30,
          name: '上海'
        }]
      },
      {
        title: '报表二',
        data: [{
          value: 20,
          name: '武汉'
        }, {
          value: 10,
          name: '杭州'
        }]
      },
    ]
    this.setData({
      chartData: chartData
    })
    chartData.forEach((e, index) => {
      let itemData = e.data;
      // 获取组件
      let ecComponent = this.selectComponent(`#mychart-dom-bar-${index}`);
      ecComponent.init((canvas, width, height, dpr) => {
        // 获取组件的 canvas、width、height 后的回调函数
        // 在这里初始化图表
        const chart = echarts.init(canvas, null, {
          width: width,
          height: height,
          devicePixelRatio: dpr // new
        });
        //调用设定EChart报表状态的函数,并且把从后端拿到的数据传过去
        this.setOption(chart, color_arr, itemData);
        // 注意这里一定要返回 chart 实例,否则会影响事件处理等
        return chart;
      });
    })

    //   }
    // })
  },

  //设定EChart报表的状态
  setOption(chart, color_arr, itemData) {
    var option = {
      backgroundColor: "#ffffff",
      color: color_arr,
      series: [{
        label: {
          normal: {
            fontSize: 14
          }
        },
        type: 'pie',
        center: ['50%', '50%'],
        radius: ['40%', '60%'],
        data: itemData
      }]
    };
    chart.setOption(option);
  }
});

然后把wxml改成下面代码

<!--index.wxml-->
<view class="container">
  <block wx:for="{{chartData}}" wx:for-index="index" wx:key="this">
    <text>{{item.title}}</text>
    <ec-canvas id="mychart-dom-bar-{{index}}" canvas-id="mychart-pie" ec="{{ec}}"></ec-canvas>
  </block>
</view>

为了方便观看,我们把wxss改成下面代码

/**index.wxss**/
ec-canvas {
  width: 100%;
  height: 30%;
}

最后我们看一下效果

在这里插入图片描述

方法二

另外我还在兔子先生的文章看到了通过改变源码动态传参的方式实现的,试了下不错,不过改起来较麻烦,具体看下面。
首先我们打开ec-canvas.js文件,按Ctrl+F快速定位找到properties对象,在对象里面新增一个自定义参数:chart_item: { type: Object}
在这里插入图片描述
紧接着按Ctrl+F快速定位找到onInit初始化方法,在后面补上我们刚才定义的参数:this.data.chart_item
在这里插入图片描述
接着js的话,在初始化方法initChart里面多接收我们刚才自定义的参数,并且将它赋值到option 对象对应的参数里面,

import * as echarts from '../../ec-canvas/echarts';

const app = getApp();

function initChart(canvas, width, height, dpr, chart_item) {
  const chart = echarts.init(canvas, null, {
    width: width,
    height: height,
    devicePixelRatio: dpr // new
  });
  canvas.setChart(chart);

  var option = {
    backgroundColor: "#ffffff",
    color: ["#37A2DA", "#32C5E9", "#67E0E3", "#91F2DE", "#FFDB5C", "#FF9F7F"],
    series: [{
      label: {
        normal: {
          fontSize: 14
        }
      },
      type: 'pie',
      center: ['50%', '50%'],
      radius: ['40%', '60%'],
      data: chart_item
    }]
  };

  chart.setOption(option);
  return chart;
}

Page({
  data: {
    ec: {
      onInit: initChart
    }
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    // 调用后端数据
    // wx.request({
    //   url: `https://xxx.com/`,
    //   data: {
    //     id: '123'
    //   },
    //   method: 'GET',
    //   header: {
    //     'content-type': 'application/x-www-form-urlencoded'
    //   },
    //   success: function (res) {
    //     console.log(res)

    // 这里开始我们假设已经从后端拿到了数据
    let chartData = [{
        title: '报表一',
        data: [{
          value: 40,
          name: '北京'
        }, {
          value: 30,
          name: '广州'
        }, {
          value: 30,
          name: '上海'
        }]
      },
      {
        title: '报表二',
        data: [{
          value: 20,
          name: '武汉'
        }, {
          value: 10,
          name: '杭州'
        }]
      },
    ]
    this.setData({
      chartData: chartData
    })

    //   }
    // })
  },
});

接着在wxml中需要在组件里绑定我们自定义参数

<!--index.wxml-->
<view class="container">
  <block wx:for="{{chartData}}" wx:for-index="index" wx:key="this">
    <text>{{item.title}}</text>
    <ec-canvas id="mychart-dom-bar" canvas-id="mychart-pie" ec="{{ec}}" chart_item="{{item.data}}"></ec-canvas>
  </block>
</view>

同样的,为了方便观看,我们把wxss改成下面代码

/**index.wxss**/
ec-canvas {
  width: 100%;
  height: 30%;
}

效果的话和方法一是一样的,不展示了。over

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值