微信小程序遍历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 相关文章推荐
多浏览器支持的右下角浮动窗口
Apr 01 Javascript
jquery中获得$.ajax()事件返回的值并添加事件的方法
Apr 15 Javascript
使用jQuery.fn自定义jQuery翻页插件
Jan 20 Javascript
js操作模态窗口及父子窗口间相互传值示例
Jun 09 Javascript
Jquery实现兼容各大浏览器的Enter回车切换输入焦点的方法
Sep 01 Javascript
js获取元素外链样式的方法
Jan 27 Javascript
JS获取图片lowsrc属性的方法
Apr 01 Javascript
JQuery radio(单选按钮)操作方法汇总
Apr 15 Javascript
JavaScript实现经典排序算法之冒泡排序
Dec 28 Javascript
angularjs实现的前端分页控件示例
Feb 10 Javascript
js编写选项卡效果
May 23 Javascript
JS正则表达式验证端口范围(0-65535)
Jan 06 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 Class 文章
2007/04/04 PHP
在WINDOWS中设置计划任务执行PHP文件的方法
2011/12/19 PHP
PHP输出时间差函数代码
2013/01/28 PHP
Apache中php.ini的设置方法
2013/02/28 PHP
PHP面向对象之工作单元(实例讲解)
2017/06/26 PHP
PHPUnit测试私有属性和方法功能示例
2018/06/12 PHP
PHP判断访客是否手机端(移动端浏览器)访问的方法总结【4种方法】
2019/03/27 PHP
10款新鲜出炉的 jQuery 插件(Ajax 插件,有幻灯片、图片画廊、菜单等)
2011/06/08 Javascript
jquery多行滚动/向左或向上滚动/响应鼠标实现思路及代码
2013/01/23 Javascript
extjs tabpanel限制选项卡数量实现思路及代码
2013/04/02 Javascript
跟我学Nodejs(二)--- Node.js事件模块
2014/05/21 NodeJs
js星星评分效果
2014/07/24 Javascript
用window.onerror捕获并上报Js错误的方法
2016/01/27 Javascript
Node.js下自定义错误类型详解
2016/10/17 Javascript
原生和jQuery的ajax用法详解
2017/01/23 Javascript
vue slot 在子组件中显示父组件传递的模板
2018/03/02 Javascript
angular4 JavaScript内存溢出问题
2018/03/06 Javascript
jQuery实现输入框的放大和缩小功能示例
2018/07/21 jQuery
JavaScript实现猜数字游戏
2020/05/20 Javascript
创建与框架无关的JavaScript插件
2020/12/01 Javascript
[01:06:19]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第二场 1月8日
2021/03/11 DOTA
Python3.5文件修改操作实例分析
2019/05/01 Python
pytorch 共享参数的示例
2019/08/17 Python
解决Pytorch 训练与测试时爆显存(out of memory)的问题
2019/08/20 Python
解决Django中checkbox复选框的传值问题
2020/03/31 Python
tensorflow dataset.shuffle、dataset.batch、dataset.repeat顺序区别详解
2020/06/03 Python
python 多线程中join()的作用
2020/10/29 Python
python基于socket模拟实现ssh远程执行命令
2020/12/05 Python
详解python中的三种命令行模块(sys.argv,argparse,click)
2020/12/15 Python
你所知道的集合类都有哪些?主要方法?
2012/12/31 面试题
现在输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按什么排序,结果为,提供reset
2012/11/09 面试题
小学师德标兵先进事迹材料
2014/05/25 职场文书
关于军训的感想
2015/08/07 职场文书
小学数学继续教育研修日志
2015/11/13 职场文书
Mysql外键约束的创建与删除的使用
2022/03/03 MySQL
浅谈如何保证Mysql主从一致
2022/03/13 MySQL