小程序引入多个e-charts
小程序引入e-charts图表
这里是狗尾草第一次发表掘金文章,日后望各位大佬多多支持~
前言:运营助手,见名知意,没有图表数据的展示,看上去是有多空白。因此,俺们UI做了很好的交互,一个页面来了4个e-charts图表,且基本都不一样。身为一个职业前端,怎么能猥琐呢?
干就完了~
实现思路
因为一个页面要引入多个图表,所以需要对e-charts图表进行封装。然鹅问题来了,怎么引入呢?
为了兼容小程序 Canvas,ECharts提供了一个小程序的组件,用这种方式可以方便地使用 ECharts。插件下载地址
其中,ec-canvas 是ECharts提供的组件,其他文件是如何使用该组件的示例。
ec-canvas 目录下有一个 echarts.js,默认ECharts会在每次 echarts-for-weixin 项目发版的时候替换成最新版的 ECharts。如有必要,可以自行从 ECharts 项目中下载最新发布版,或者从官网自定义构建以减小文件大小
这里引入,我们只需要引入ec-canvas目录到小程序项目即可。
单页面引入
一个页面只需要引入一个图表的,我们在相关的js文件书写即可。这样引入比较简单,也可以减少不必要的很多问题。但只限于一个页面引入一个图表 ,如果有一种情况,正如狗尾草所要完成的,一个页面4个图表,各不相同。则就需要封装组件了
话不多说,直接撸~
index.json配置
{
"usingComponents": {
"ec-canvas": "../../ec-canvas/ec-canvas"
}
}
index.wxml
<view class="container">
<ec-canvas id="mychart-dom-bar" canvas-id="mychart-bar" ec="{{ ec }}"></ec-canvas>
</view>
index.js
function initChart(canvas, width, height) {
const chart = echarts.init(canvas, null, {
width: width,
height: height
});
canvas.setChart(chart);
var option = {
...
};
chart.setOption(option);
return chart;
}
Page({
data: {
ec: {
onInit: initChart
}
}
});
以上为单页面引入图表,需要注意的是,
引入文件的路径,改成自己项目中的实际路径。
option配置可查看e-charts官方文档按需配置。
小程序的层级因为是原生组件,所以小程序的层级无法修改。
由于原生组件脱离在 WebView 渲染流程外,因此在使用时有以下限制: 组件的层级是最高的,所以页面中的其他组件无论设置 z-index 为多少,都无法盖在原生组件上。 后插入的原生组件可以覆盖之前的原生组件。 原生组件还无法在 scroll-view、swiper、picker-view、movable-view 中使用。 部分CSS样式无法应用于原生组件,例如: 无法对原生组件设置 CSS 动画 无法定义原生组件为 position: fixed 不能在父级节点使用 overflow:hidden 来裁剪原生组件的显示区域,
因此在使用时,可能遇到这个问题,图表的层级很高,而且不会跟随屏幕滚动。大概就是以上原因造成的。
这里狗尾草的解决是通过修改布局。因为这里本人造成图表不随屏幕滚动的原因是采用了,圣杯布局。因此在将圣杯布局去掉后。采用本来的默认布局,就修改了这个问题。
虽然问题得到了解决,但需求比较急,还没有查找到完美的解决方案,小伙伴有的话,可以告知一下,在这里先说一声谢谢啦~
引入多个图表
狗尾草的完成,页面引入多个图表,如果还如上面所示,在单页面中引入多个方法,配置会更加复杂。
这里,需要引入竖向柱状图,横向柱状图,饼状图。
因此将每个类型的图标单独放到一个组件中,在需要引入的页面只引入这些个组件就够。
在父组件得到数据后,将数据传入子组件。子组件更新view即可。但是会遇到这么一个问题
子组件在得到传递的值后,并不会更新view。因此狗尾草是通过修改引入的ec-canvas组件来完成视图的更新。
听着可能有点懵逼,理一下。
父组件给子组件传递数据
子组件做视图的option配置
源码组件接受数据
大概就是这么个意思
先来看一下目录结构
这里只给大家引用一下饼状图
父组件
Wxml
<view class='echarts-department'>
<echarts-depart oData="{{echarts.departNumber}}"></echarts-depart>
</view>
Wxss
.echarts-department {
width: 100%;
height: 498rpx;
}
Json
{
"usingComponents": {
"echarts-depart": "/components/eChartsSubDepartment/index"
}
}
Js
// 数据日报
const $api = require('../../api/index.js');
const $util = require('../../utils/utils.js');
const regeneratorRuntime = require('../../utils/runtime.js');
Page({
onShareAppMessage: function (res) {
return {
title: '数据日报',
path: '/pages/eCharts/index',
success: function () { },
fail: function () { }
}
},
data: {
subParams: {
distCode: "",
beginTime: $util.formatDate(new Date()),
endTime: $util.formatDate(new Date())
}, //获取除过审医生数外的其他的所有api params
echarts: {
departNumber: [],
} //图标传入的数据
},
// 获取二级科室诊疗统计
getDepartNumber() {
$api.DATADAILY.getDepartNumber(this.data.subParams)
.then(res => {
if(res.length == 0) {
this.setData({
"echarts.departNumber": [{name:'',value:''}]
})
return ;
}
let arr = [];
res.map(item => {
let obj = {};
obj.value = item.count;
obj.name = item.date;
arr.push(obj);
})
this.setData({
"echarts.departNumber":arr
})
})
},
onReady() {
this.getDepartNumber(); //获取二级科室诊疗总排行
},
});
这里就是父组件的引入
封装的子组件
wxml
<!-- 数据日报 二级科室诊疗排行 -->
<view class='box'>
<ec-canvas id="mychart-dom-bar" oData = "{{oData}}" canvas-id="mychart-bar" ec="{{ ec }}"></ec-canvas>
</view>
需要注意的是oData就是传递过来的数据
wx.json
{
"component": true,
"usingComponents": {
"ec-canvas": "/ec-canvas/ec-canvas"
}
}
js
// 数据日报 二级科室诊疗统计
// 1、引入依赖脚本
import * as echarts from '../../ec-canvas/echarts';
let chart = null;
// 2、进行初始化数据
function initChart(canvas, width, height,data) {
chart = echarts.init(canvas, null, {
width: width,
height: height
});
canvas.setChart(chart);
var option = {
tooltip: {
position: function (px) {
return [px[0], '20%'];
}
},
color: ['#48C6EB', '#60E3CA', '#5E9ED5', '#9F9FF5', '#72C7FD'],
grid: {
x: 0,
y: 0,
x2: 0,
y2: 0
}, //图标距离上下左右的距离
series: [{
// name: 'pie',
type: 'pie',
// selectedMode: 'single', //点击的时候是否区域进行分离
// selectedOffset: 30, //区域分离的距离
clockwise: true,
label: {
normal: {
show: false,
textStyle: {
fontSize: '14px',
color: '#333333'
},
// backgroundColor: '#061F3D',
}
},
// labelLine: {
// normal: {
// lineStyle: {
// color: '#999999'
// }
// }
// }, //label线条的颜色
data: data,
itemStyle: {
normal: {
borderWidth: 2,
borderColor: '#ffffff',
opacity: .7
}
}
}]
};
chart.setOption(option);
return chart;
}
Component({
/**
* Component properties
*/
properties: {
oData: {
type: Array,
value: [],
observer: function (newVal, oldVal, changedPath) {
// 属性被改变时执行的函数(可选),也可以写成在methods段中定义的方法名字符串, 如:'_propertyChange'
// 通常 newVal 就是新设置的数据, oldVal 是旧数据
}
}
},
/**
* Component initial data
*/
data: {
ec: {
onInit: initChart // 3、将数据放入到里面
}
},
/**
* Component methods
*/
methods: {
},
})
需要修改的源码组件
ec-canvas > ec-canvas.js
properties: {
canvasId: {
type: String,
value: 'ec-canvas'
},
ec: {
type: Object
},
oData: {
type: Object,
observer: function(newVal,oldVal) {
if(newVal.length == 0) {
return ;
}
this.init();
}
} //oData为父传子,子传这里
},
在这里将传的数据作为参数
啊,噗~
至此,一条数据流就算完成。其他类型的图标也按照这种方式引入即可
补充,让小程序支持ES7
因为引入多个图表的话,更多的需要控制顺序,因此,这里给大家补充一下ES7的引入
npm install regenerator
引用:
const regeneratorRuntime = require('../../libs/regenerator-runtime')
这里就可以放心使用async和await来控制api请求的顺序了。
当然大家可以引入相关的js文件也是可以的。
小程序引入多个e-charts的更多相关文章
- 微信小程序引入md5.js
今天给大家安利一下微信小程序引入md5.js的方法,不多说 md5.js在下面 直接复制到项目的utils/md5.js即可 /* * A JavaScript implementation of t ...
- uni-app开发微信小程序引入UI组件库(Vant-weapp)步骤
uni-app开发微信小程序引入UI组件库(Vant-weapp)步骤 这里以vant-weapp为例 uni-app官方文档介绍引入组件的方法 1. 新建相关目录 根目录下创建 wxcomponen ...
- 微信小程序引入ECharts组件
首先打开ECharts网页 https://echarts.apache.org/zh/tutorial.html#%E5%9C%A8%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8 ...
- 小程序引入百度api天气预报
先看下最终的效果(默认可以获得未来三天数据): 第一:首先准备条件(必须): 1.小程序已认证,有appID 2.必须把https://api.map.baidu.com 添加到小程序的合法域名列表中 ...
- 微信小程序——引入背景图片【六】
前言 之前写了一些小程序的博文只是看文档边看边写,了解下他,这次可是真枪真刀的做了! 框架使用的是美团的mpvue,我也是一边学习,一边写的,如有错误之处,还望大家指出. 在这里我有个问题,为什么微信 ...
- 微信小程序 没有找到node_modules目录 ,小程序引入vant框架报错。
如果大家是按照官网的引入方法,是否报错如图 不着急,大家就试试我的方法吧!两步走完美搞定! 第一步: 在小程序顶部点击设置->项目设置,会弹出下面的窗口.大家把使用npm模块勾上对勾. 第二步: ...
- 微信小程序引入外部组件 iView Weapp
iview Weapp组件的使用方法: 1. 下载小程序组件库 (前提是你已经有了项目目录) 你可以直接去github把iView Weapp的代码下载下来,也可以用过npm来下载. github地址 ...
- 微信小程序引入腾讯地图API方法
微信小程序大热,在小程序过程中,我们很多时候都会用到地图.不管是企业的地址,还是商家的配送都会用到地图: 我在刚写地图这一块时,在网上也参考了很多网友的方法,始终有Bug(类似于地图拖拽是画面抖动,无 ...
- 微信小程序 引入公共页面的几种情况
1.不带参数 首先在pages文件夹中新建一个template文件夹,文件夹中新建一个template.wxml文件,代码如下 <!--template.wxml--> <templ ...
随机推荐
- 正则表达式提取HTML中img标签的src地址
一般来说一个 HTML 文档有很多标签,比如“”.“”.“”等, 想把文档中的 img 标签提取出来并不是一件容易的事. 由于 img 标签样式变化多端,使提取的时候用程序寻找并不容易. 于是想要寻找 ...
- asp.net Core MVC + form validation + ajax form 笔记
asp.net Core MVC 有特别处理form,controller可以自己处理model的验证,最大的优势是写form时可以少写代码 先了解tag helper ,这东西就是element上的 ...
- C# Interface中的属性
只能写get,和set,到具体类实现的时候才确定get的是哪个字段的值,set的是哪个字段的值.
- 滑动窗口解决Substring Search Problem
2018-07-18 11:19:19 一.Minimum Window Substring 问题描述: 问题求解: public String minWindow(String s, String ...
- SVN提交文件失败:系统找不到指定路径
完成程序代码工作后,进行SVN的文件提交.先进行项目的更新,然后在修改的文件上进行提交操作,发现SVN弹出提示信息,“系统找不到指定路径”提交失败,如下图: ...
- R语言plot函数参数合集
最近用R语言画图,plot 函数是用的最多的函数,而他的参数非常繁多,由此总结一下,以供后续方便查阅. plot(x, y = NULL, type = "p", xlim = N ...
- 转发一篇分析LinQ是什么?
LINQ(发音:Link)是语言级集成查询(Language INtegrated Query) ?LINQ是一种用来进行数据访问的编程模型,使得.NET语言可以直接支持数据查询 ?LINQ的目标是降 ...
- (转)不要自称是程序员,我十多年的 IT 职场总结
其他: 我是一名程序员,工作很努力,为什么绩效还总是垫底? 外企,中年失业何去何从? 来公司半年了,也悟出了一些道理. 如果我可以给每个工程教育增加一门课,它不会涉及编译器.门电路或是时间复杂度,而是 ...
- LeetCode--175--组合两个表
问题描述: 表1: Person +-------------+---------+ | 列名 | 类型 | +-------------+---------+ | PersonId | int | ...
- 12月15日 session:Ruby on Rails Security Guide//从第3节开始没有学习//关于find_by 和where的区别用法思考。
http://guides.rubyonrails.org/security.html#user-management 2.session笔记见13日的随笔. http://www.cnblogs.c ...