微信小程序遍历Echarts图表实现多个饼图


Posted in Javascript onApril 25, 2019

如何在微信小程序中使用Echarts可以看我的另一个教程:点击查看

首先看一个简单的例子

1.wxml文件

<view style='width:100%;height:200rpx'>
 <ec-canvas id="mychart-dom-bar" canvas-id="mychart-bar" ec="{{ ec }}"></ec-canvas>
</view>

2.js文件

import * as echarts from '../../common/ec-canvas/echarts';
function initChart(canvas, width, height) {
 const chart = echarts.init(canvas, null, {
  width: width,
  height: height
 })
 canvas.setChart(chart);
 var option = {
  series: [
   {
    name: '访问来源',
    type: 'pie',
    radius: ['60%', '70%'],
    animationType: 'scale',
    silent: true,
    labelLine: {
     normal: {
      show: false
     }
    },
    data: [
     {value:10},
     {value:3}
    ],
    color: ["#666", "#179B16"]
   }
  ]
 }
 chart.setOption(option);
 return chart;
}
Page({

 /**
  * 页面的初始数据
  */
 data: {
  ec: {
   onInit: initChart
  }
 }
})

3.json文件 (ec-canvas组件需要到官网下载,然后放到一个文件夹里面,然后在json文件中引入)

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

4.效果图

微信小程序遍历Echarts图表实现多个饼图

需求:假如有一个列表,每一条数据表示一个班级,然后通过图表展示出:女生人数占全班人数的比率。(如:上面效果图中的灰色部分表示全班人数,绿色部分表示女生人数)。

假如你已经懂了Echarts的基本配置,不懂的可以先看看官方文档:Echarts配置文档

基于上面例子我们进行分析一下:

从wxml文件可以看出ec-canvas组件定义了两个属性canvas-id和ec ,这种自定义属性一般用来传参,也就是传一些参数给ec-canvas组件内部。canvas-id我们暂时先不管,看一下ec ,在js文件中data里面定义了ec ,

ec它是一个对象,并且有个属性onInit 它的值是initChart函数(不是执行之后的喔),通过ec属性将initChart函数传入了ec-canvas组件内部,这时我们可以知道,initChart函数是在ec-canvas组件里面执行的。

打开ec-canvas.js文件,简单的看一下源码:

微信小程序遍历Echarts图表实现多个饼图

上图的两个属性,是通过组件传参的方式传进来的:

<ec-canvas id="mychart-dom-bar" canvas-id="mychart-bar" ec="{{ ec }}"></ec-canvas>

因为initChart函数赋值给了ec对象的onInit属性,所以我们可以搜索一下onInit ,可以发现它在init函数里面,如图:

微信小程序遍历Echarts图表实现多个饼图

我们先捋一捋这个逻辑,首先在引入组件的时候,通过ec属性传了个对象到ec-canvas组件内部,而这个对象有个属性onInit 值为一个函数,然后进入ec-canvas.js文件,在ready钩子函数中,判断ec对象是否存在(也就是判断用户是否传了ec进来),

如果存在,执行init方法,在上图中可以发现,init方法内部会执行onInit方法(如果条件满足的话),然后将函数返回的chart实例赋值给this.chart。

实现代码如下:

假如我们有个ecTest Page页。

1.wxml代码

<view class='test' wx:for="{{itemList}}" wx:for-item="item">
 <view>{{item.name}}</view>
 <view style='width:100%;height:200rpx'>
  <ec-canvas id="mychart-dom-bar" canvas-id="mychart-bar" tuData="{{item.data}}" ec="{{ ec }}"></ec-canvas>
 </view>
</view>

2.js代码

import * as echarts from '../../common/ec-canvas/echarts';
function initChart(canvas, width, height ,data) {//这里多加一个参数
 const chart = echarts.init(canvas, null, {
  width: width,
  height: height
 })
 canvas.setChart(chart);
 var option = {
  series: [
   {
    name: '访问来源',
    type: 'pie',
    radius: ['60%', '70%'],
    animationType: 'scale',
    silent: true,
    labelLine: {
     normal: {
      show: false
     }
    },
    data: data,
    color: ["#666", "#179B16"]
   }
  ]
 }
 chart.setOption(option);
 return chart;
}
Page({

 /**
  * 页面的初始数据
  */
 data: {
  ec: {
   onInit: initChart
  },
  itemList:[
   { name: '一年级', data: [{ value: 10 }, { value: 1 }] },
   { name: '二年级', data: [{ value: 10 }, { value: 4 }] },
   { name: '三年级', data: [{ value: 10 }, { value: 7 }] },
  ]
 }
})

3.修改ec-canvas.js文件(这个文件是从echarts官网下载的)

在wxml文件里,引用ec-canvas组件时,传了个tuData参数过去,所以我们需要在组件内部接收一下,在ec-canvas.js文件里面找到properties对象,

properties: {
  canvasId: {
   type: String,
   value: 'ec-canvas'
  },

  ec: {
   type: Object
  },
  tuData:{//这是新增的参数
   type: Object
  }
 }

4.找到init方法,将tuData传入onInit方法里面即可

微信小程序遍历Echarts图表实现多个饼图

5.效果图

微信小程序遍历Echarts图表实现多个饼图

总结:因为chart实例是在ec-canvas组件内部才创建的,其它页面使用ec-canvas组件时,通过传参的方式,将实例化chart的方法通过ec属性传入ec-canvas组件内部进行实例化,

所以我们可以借助这一点,把我们的数据也通过传参的方式传入ec-canvas内部即可。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS 类型转换常见方法小结
May 31 Javascript
javascript小组件 原生table排序表格脚本(兼容ie firefox opera chrome)
Jul 25 Javascript
javascript:void(0)的作用示例介绍
Oct 28 Javascript
Javascript 按位取反运算符 (~)
Feb 04 Javascript
JS合并数组的几种方法及优劣比较
Sep 19 Javascript
JavaScript制作windows经典扫雷小游戏
Mar 31 Javascript
微信小程序 自动登陆PHP源码实例(源码下载)
May 08 Javascript
Nautil 中使用双向数据绑定的实现
Oct 02 Javascript
vue使用swiper.js重叠轮播组建样式
Nov 14 Javascript
使用js实现单链解决前端队列问题的方法
Feb 03 Javascript
JavaScript对象属性操作实例解析
Feb 04 Javascript
Vue的v-model的几种修饰符.lazy,.number和.trim的用法说明
Aug 05 Javascript
在微信小程序中使用图表的方法示例
Apr 25 #Javascript
详解VUE Element-UI多级菜单动态渲染的组件
Apr 25 #Javascript
WebGL three.js学习笔记之阴影与实现物体的动画效果
Apr 25 #Javascript
WebGL学习教程之Three.js学习笔记(第一篇)
Apr 25 #Javascript
Angular封装搜索框组件操作示例
Apr 25 #Javascript
Vue使用zTree插件封装树组件操作示例
Apr 25 #Javascript
详解javascript中的Error对象
Apr 25 #Javascript
You might like
DOTA2 玩家自创拉野攻略 特色英雄快速成长篇
2020/04/20 DOTA
php cookis创建实现代码
2009/03/16 PHP
php的ajax框架xajax入门与试用介绍
2010/12/19 PHP
for循环连续求和、九九乘法表代码
2012/02/20 PHP
yii上传文件或图片实例
2014/04/01 PHP
ThinkPHP模板范围判断输出In标签与Range标签用法详解
2014/06/30 PHP
PHP多维数组元素操作类的方法
2016/11/14 PHP
php获取访问者浏览页面的浏览器类型
2017/01/23 PHP
js setTimeout 参数传递使用介绍
2013/08/13 Javascript
JavaScript中的prototype.bind()方法介绍
2014/04/04 Javascript
javascript实现微信分享
2014/12/23 Javascript
深入分析jQuery的ready函数是如何工作的(工作原理)
2015/12/17 Javascript
Node.js编写组件的三种实现方式
2016/02/25 Javascript
JS实现自动轮播图效果(自适应屏幕宽度+手机触屏滑动)
2017/06/19 Javascript
BootStrap Fileinput插件和Bootstrap table表格插件相结合实现文件上传、预览、提交的导入Excel数据操作步骤
2017/08/07 Javascript
解决Vue 浏览器后退无法触发beforeRouteLeave的问题
2017/12/24 Javascript
jQuery 防止相同的事件快速重复触发方法
2018/02/08 jQuery
webuploader实现上传图片到服务器功能
2018/08/16 Javascript
JavaScript Window浏览器对象模型原理解析
2020/05/30 Javascript
[01:01:29]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第一场
2018/04/05 DOTA
Python过滤函数filter()使用自定义函数过滤序列实例
2014/08/26 Python
python采用django框架实现支付宝即时到帐接口
2016/05/17 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
2018/05/17 Python
Python实现合并excel表格的方法分析
2019/04/13 Python
django一对多模型以及如何在前端实现详解
2019/07/24 Python
python之array赋值技巧分享
2019/11/28 Python
python识别验证码图片实例详解
2020/02/17 Python
柒牌官方商城:中国男装优秀品牌
2017/06/30 全球购物
eBay爱尔兰站:eBay.ie
2019/08/09 全球购物
智能电子应届生求职信
2013/11/10 职场文书
运动会致辞稿50字
2014/02/04 职场文书
人事科岗位职责范本
2014/03/02 职场文书
2016春季校长开学典礼致辞
2015/11/26 职场文书
Python 如何实现文件自动去重
2021/06/02 Python
Python干货实战之八音符酱小游戏全过程详解
2021/10/24 Python
Java虚拟机内存结构及编码实战分享
2022/04/07 Java/Android