微信小程序遍历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 相关文章推荐
jquery的Tooltip插件 qtip使用详细说明
Sep 08 Javascript
Jquery带搜索框的下拉菜单
May 06 Javascript
Javascript中查找不以XX字符结尾的单词示例代码
Oct 15 Javascript
jquery解决客户端跨域访问问题
Jan 06 Javascript
JavaScript识别网页关键字并进行描红的方法
Nov 09 Javascript
三个js循环的关键字示例(for与while)
Feb 16 Javascript
JavaScript快速切换繁体中文和简体中文的方法及网站支持简繁体切换的绝招
Mar 07 Javascript
jQuery实现对无序列表的排序功能(附demo源码下载)
Jun 25 Javascript
在angularJs中进行数据遍历的2种方法
Oct 08 Javascript
关于AOP在JS中的实现与应用详解
May 06 Javascript
layui实现数据分页功能(ajax异步)
Jul 27 Javascript
Vue路由对象属性 .meta $route.matched详解
Nov 04 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
mysql建立外键
2006/11/25 PHP
php date与gmdate的获取日期的区别
2010/02/08 PHP
php set_time_limit(0) 设置程序执行时间的函数
2010/05/26 PHP
fleaphp crud操作之findByField函数的使用方法
2011/04/23 PHP
Yii使用CLinkPager分页实例详解
2014/07/23 PHP
跟我学Laravel之安装Laravel
2014/10/15 PHP
PHP用户管理中常用接口调用实例及解析(含源码)
2017/03/09 PHP
setTimeout的延时为0时多个浏览器的区别
2012/05/23 Javascript
地址栏传递中文参数乱码在js里用escape转码
2013/08/28 Javascript
jQuery中[attribute*=value]选择器用法实例
2014/12/31 Javascript
14个有用的Jquery技巧分享
2015/01/08 Javascript
通过设置CSS中的position属性来固定层的位置
2015/12/14 Javascript
JavaScript html5 canvas绘制时钟效果
2016/03/01 Javascript
Bootstrap所支持的表单控件实例详解
2016/05/16 Javascript
javascript中对Date类型的常用操作小结
2016/05/19 Javascript
javascript中Date对象应用之简易日历实现
2016/07/12 Javascript
全面解析node 表单的图片上传
2016/11/21 Javascript
Bootstarp基本模版学习教程
2017/02/01 Javascript
Javascript中类式继承和原型式继承的实现方法和区别之处
2017/04/25 Javascript
AngularJS实现单一页面内设置跳转路由的方法
2017/06/28 Javascript
Bootstrap Multiselect 常用组件实现代码
2017/07/09 Javascript
Vue列表页渲染优化详解
2017/07/24 Javascript
element-ui组件中input等的change事件中传递自定义参数
2019/05/22 Javascript
关于微信小程序map组件z-index的层级问题分析
2019/07/09 Javascript
Layui Form 自定义验证的实例代码
2019/09/14 Javascript
JavaScript实现打砖块游戏
2020/02/25 Javascript
[03:12]TI9战队档案 - Virtus Pro
2019/08/20 DOTA
详解Django中的权限和组以及消息
2015/07/23 Python
Python如何实现守护进程的方法示例
2017/02/08 Python
Python2和Python3中@abstractmethod使用方法
2020/02/04 Python
Python 炫技操作之合并字典的七种方法
2020/04/10 Python
35款精致的 CSS3 和 HTML5 网页模板 推荐
2012/08/03 HTML / CSS
泰国折扣酒店预订:Hotels2Thailand
2018/03/20 全球购物
高考备战决心书
2014/03/11 职场文书
Mysql实现简易版搜索引擎的示例代码
2021/08/30 MySQL
Win11 25163.1010更新补丁KB5016904推送,测试服务验证管道(附更新修复汇总)
2022/07/23 数码科技