微信小程序遍历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的将DropDownlist的选中值赋给label的实现代码
May 06 Javascript
关于IE BUG与字符串截取substr的解决办法
Apr 10 Javascript
document.write()及其输出内容的样式、位置控制
Aug 12 Javascript
js中符号转意问题示例探讨
Aug 19 Javascript
JavaScript也谈内存优化
Jun 06 Javascript
javascript函数式编程程序员的工具集
Oct 11 Javascript
Sea.JS知识总结
May 05 Javascript
Vuejs第十二篇之动态组件全面解析
Sep 09 Javascript
微信小程序之MaterialDesign--input组件详解
Feb 15 Javascript
如何通过shell脚本自动生成vue文件详解
Sep 10 Javascript
解决Echarts 显示隐藏后宽度高度变小的问题
Jul 19 Javascript
javascript中正则表达式语法详解
Aug 07 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
php设计模式 State (状态模式)
2011/06/26 PHP
php的crc32函数使用时需要注意的问题(不然就是坑)
2015/04/21 PHP
Yii2框架dropDownList下拉菜单用法实例分析
2016/07/18 PHP
php7下的filesize函数
2019/09/30 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
PHP Pipeline 实现中间件的示例代码
2020/04/26 PHP
javascript 读取XML数据,在页面中展现、编辑、保存的实现
2009/10/27 Javascript
jQuery的三种$()
2009/12/30 Javascript
jQuery新闻滚动插件 jquery.roller.js
2011/06/27 Javascript
jquery zTree异步加载简单实例分享
2013/02/05 Javascript
JS刷新框架外页面七种实现代码
2013/02/18 Javascript
jquery中的常用事件bind、hover、toggle等示例介绍
2014/07/21 Javascript
JavaScript模拟深蓝vs卡斯帕罗夫的国际象棋对局示例
2015/04/22 Javascript
第一章之初识Bootstrap
2016/04/25 Javascript
JS中with的替代方法与String中的正则方法详解
2016/12/23 Javascript
.net MVC+Bootstrap下使用localResizeIMG上传图片
2017/04/21 Javascript
Angular实现图片裁剪工具ngImgCrop实践
2017/08/17 Javascript
javascript流程控制语句集合
2017/09/18 Javascript
jQuery实现的响应鼠标移动方向插件用法示例【附源码下载】
2018/08/28 jQuery
在vue中安装使用vux的教程详解
2018/09/16 Javascript
理解JavaScript中的Proxy 与 Reflection API
2020/09/21 Javascript
深入讲解Java编程中类的生命周期
2016/02/05 Python
Python cookbook(数据结构与算法)将多个映射合并为单个映射的方法
2018/04/19 Python
使用Django简单编写一个XSS平台的方法步骤
2019/03/25 Python
以SQLite和PySqlite为例来学习Python DB API
2020/02/05 Python
用python按照图像灰度值统计并筛选图片的操作(PIL,shutil,os)
2020/06/04 Python
python 使用paramiko模块进行封装,远程操作linux主机的示例代码
2020/12/03 Python
英国奢侈品概念店:Base Blu
2019/05/16 全球购物
中西医专业毕业生职业规划书
2014/02/24 职场文书
电焊工岗位职责
2014/03/06 职场文书
学生个人自我鉴定范文
2014/03/28 职场文书
园林技术专业求职信
2014/07/28 职场文书
四大名著读书笔记
2015/06/25 职场文书
2015大学迎新晚会主持词
2015/07/16 职场文书
解决SpringCloud Feign传对象参数调用失败的问题
2021/06/23 Java/Android
Mysql 文件配置解析介绍
2022/05/06 MySQL