├── docs
├── pie-clicked.jpeg
├── pie-not-click.jpeg
└── pie-center-filled.jpeg
├── examples
├── lazy-load
│ └── lazy-load.vue
└── multi-charts
│ └── multi-charts.vue
├── uni-ec-canvas
├── wx-canvas.js
└── uni-ec-canvas.vue
└── README.md
/docs/pie-clicked.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yah0130/echarts-wx-uniapp/HEAD/docs/pie-clicked.jpeg
--------------------------------------------------------------------------------
/docs/pie-not-click.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yah0130/echarts-wx-uniapp/HEAD/docs/pie-not-click.jpeg
--------------------------------------------------------------------------------
/docs/pie-center-filled.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yah0130/echarts-wx-uniapp/HEAD/docs/pie-center-filled.jpeg
--------------------------------------------------------------------------------
/examples/lazy-load/lazy-load.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
10 |
11 |
12 |
13 |
108 |
115 |
--------------------------------------------------------------------------------
/uni-ec-canvas/wx-canvas.js:
--------------------------------------------------------------------------------
1 | export default class WxCanvas {
2 | constructor(ctx, canvasId, isNew, canvasNode) {
3 | this.ctx = ctx;
4 | this.canvasId = canvasId;
5 | this.chart = null;
6 | this.isNew = isNew
7 | if (isNew) {
8 | this.canvasNode = canvasNode;
9 | } else {
10 | this._initStyle(ctx);
11 | }
12 |
13 | // this._initCanvas(zrender, ctx);
14 |
15 | this._initEvent();
16 | }
17 |
18 | getContext(contextType) {
19 | if (contextType === '2d') {
20 | return this.ctx;
21 | }
22 | }
23 |
24 | // canvasToTempFilePath(opt) {
25 | // if (!opt.canvasId) {
26 | // opt.canvasId = this.canvasId;
27 | // }
28 | // return wx.canvasToTempFilePath(opt, this);
29 | // }
30 |
31 | setChart(chart) {
32 | this.chart = chart;
33 | }
34 |
35 | attachEvent() {
36 | // noop
37 | }
38 |
39 | detachEvent() {
40 | // noop
41 | }
42 |
43 | _initCanvas(zrender, ctx) {
44 | zrender.util.getContext = function () {
45 | return ctx;
46 | };
47 |
48 | zrender.util.$override('measureText', function (text, font) {
49 | ctx.font = font || '12px sans-serif';
50 | return ctx.measureText(text);
51 | });
52 | }
53 |
54 | _initStyle(ctx) {
55 | var styles = ['fillStyle', 'strokeStyle', 'globalAlpha',
56 | 'textAlign', 'textBaseAlign', 'shadow', 'lineWidth',
57 | 'lineCap', 'lineJoin', 'lineDash', 'miterLimit', 'fontSize'
58 | ];
59 |
60 | styles.forEach(style => {
61 | Object.defineProperty(ctx, style, {
62 | set: value => {
63 | if (style !== 'fillStyle' && style !== 'strokeStyle' ||
64 | value !== 'none' && value !== null
65 | ) {
66 | ctx['set' + style.charAt(0).toUpperCase() + style.slice(1)](value);
67 | }
68 | }
69 | });
70 | });
71 |
72 | ctx.createRadialGradient = () => {
73 | return ctx.createCircularGradient(arguments);
74 | };
75 | }
76 |
77 | _initEvent() {
78 | this.event = {};
79 | const eventNames = [{
80 | wxName: 'touchStart',
81 | ecName: 'mousedown'
82 | }, {
83 | wxName: 'touchMove',
84 | ecName: 'mousemove'
85 | }, {
86 | wxName: 'touchEnd',
87 | ecName: 'mouseup'
88 | }, {
89 | wxName: 'touchEnd',
90 | ecName: 'click'
91 | }];
92 |
93 | eventNames.forEach(name => {
94 | this.event[name.wxName] = e => {
95 | const touch = e.touches[0];
96 | this.chart.getZr().handler.dispatch(name.ecName, {
97 | zrX: name.wxName === 'tap' ? touch.clientX : touch.x,
98 | zrY: name.wxName === 'tap' ? touch.clientY : touch.y
99 | });
100 | };
101 | });
102 | }
103 |
104 | set width(w) {
105 | if (this.canvasNode) this.canvasNode.width = w
106 | }
107 | set height(h) {
108 | if (this.canvasNode) this.canvasNode.height = h
109 | }
110 |
111 | get width() {
112 | if (this.canvasNode)
113 | return this.canvasNode.width
114 | return 0
115 | }
116 | get height() {
117 | if (this.canvasNode)
118 | return this.canvasNode.height
119 | return 0
120 | }
121 | }
122 |
--------------------------------------------------------------------------------
/examples/multi-charts/multi-charts.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
16 |
17 |
18 |
19 |
218 |
219 |
226 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## 简介
2 | 本项目是 ECharts 的微信小程序版本,以及使用的示例。
3 |
4 | 该项目对[ecomfe/echarts-for-weixin](https://github.com/ecomfe/echarts-for-weixin)做了少量改动来兼容uni-app
5 |
6 | 需要通过uni-app编译后使用
7 |
8 | 如果你需要使用原生小程序开发方式,请移步[ecomfe/echarts-for-weixin](https://github.com/ecomfe/echarts-for-weixin)
9 |
10 | 开发者可以通过熟悉的 ECharts 配置方式,快速开发图表,满足各种可视化需求。
11 |
12 | ## 文件目录结构
13 |
14 | 为了兼容小程序 Canvas,我们提供了一个小程序的组件,用这种方式可以方便地使用 ECharts。
15 |
16 | 其中,`uni-ec-canvas` 是我们提供的组件,其他文件是如何使用该组件的示例。
17 |
18 | lazy-load为懒加载示例
19 |
20 | multi-charts为一个页面中多个表格的示例
21 |
22 | 其余示例请移步[官方示例](https://www.echartsjs.com/examples/zh/index.html)
23 |
24 | 然后将option替换即可
25 |
26 | `uni-ec-canvas` 目录下有一个 `echarts.js`,默认是包含所有功能的echarts。如有可以,建议从[官网自定义构建](http://echarts.baidu.com/builder.html)来替换这个文件以减小文件大小。
27 |
28 | ## 使用
29 | 复制uni-ec-canvas至你公用的组件文件夹
30 | 在页面中引入
31 |
32 | ```html
33 |
34 |
35 |
42 |
43 |
44 | ```
45 | ```js
46 |
63 | ```
64 | ```css
65 | // 这里一定要注意 设置该组件宽高 以及display:block来确保canvas初始化的时候是有宽高的
66 |
73 | ```
74 |
75 | ## FAQ
76 | ### uni-app 编译卡死
77 | 如果你配置了eslint检查,请屏蔽对echart.js的检查,否则会卡死
78 |
79 | ### 如何改变数据
80 | 改变ec.option中的值图表即可动态变化 注意新增属性请使用$set
81 |
82 | ### 如何获取图表实例?
83 |
84 | 在页面中使用 this.$refs['uni-ec-canvas'].$curChart即可获取chart实例
85 |
86 | ### 如何延迟加载图表?
87 |
88 | 参见 `examples/lazyLoad` 的例子,可以在获取数据后再初始化数据。
89 |
90 | ### 如何在一个页面中加载多个图表?
91 |
92 | 参见 `examples/multiCharts` 的例子。
93 |
94 | ### 文件太大怎么办?
95 |
96 | 本项目默认提供的 ECharts 文件是最新版本的包含所有组件文件,为了便于开发,提供的是未压缩的版本。远程调试或预览可以下载 [echarts.min.js](https://github.com/apache/incubator-echarts/blob/master/dist/echarts.min.js) 压缩版本。
97 |
98 | 发布时,如果对文件大小要求更高,可以在 [ECharts 在线定制](http://echarts.baidu.com/builder.html)网页下载仅包含必要组件的包,并且选择压缩。
99 |
100 | 下载的文件放在 `uni-ec-canvas/echarts.js`,**注意一定需要重命名为 `echarts.js`**。
101 |
102 | ## 微信版本要求
103 | 支持微信版本 >= 6.6.3,对应基础库版本 >= 1.9.91。尽可能使用更高版本的基础库版本。
104 | ### Canvas 2d 版本要求
105 | 最新版的 ECharts 微信小程序支持微信 Canvas 2d,当用户的基础库版本 >= 2.9.0 且没有设置 force-use-old-canvas="true" 的情况下,使用新的 Canvas 2d(默认)。
106 |
107 | 使用新的 Canvas 2d 可以提升渲染性能,解决非同层渲染问题,强烈建议开启
108 |
109 | 如果仍需使用旧版 Canvas,使用方法如下:
110 | ```
111 |
112 | ```
113 |
114 |
115 | 调试的时候,需要在微信开发者工具中,将“详情”下的“调试基础库”设为 1.9.91 及以上版本。
116 |
117 | 发布前,需要在 [https://mp.weixin.qq.com](https://mp.weixin.qq.com) 的“设置”页面,将“基础库最低版本设置”设为 1.9.91。当用户微信版本过低的时候,会提示用户更新。
118 |
119 | ## 暂不支持的功能
120 |
121 | ECharts 中的绝大部分功能都支持小程序版本,因此这里仅说明不支持的功能,以及存在的问题。
122 |
123 | 以下功能尚不支持,如果有相关需求请在echarts-for-weixin的 [issue](https://github.com/ecomfe/echarts-for-weixin/issues) 中反馈,对于反馈人数多的需求将优先支持:
124 |
125 | - 图片
126 | - 多个 zlevel 分层
127 |
128 | 此外,目前还有一些 bug 尚未修复,部分需要小程序团队配合上线支持,但不影响基本的使用。已知的 bug 包括:
129 |
130 | - 安卓平台:transform 的问题(会影响关系图边两端的标记位置、旭日图文字位置等)
131 | - iOS 平台:半透明略有变深的问题
132 | - iOS 平台:渐变色出现在定义区域之外的地方
133 |
134 | ## issue
135 |
136 | 如本项目有问题,欢迎在[issue](https://github.com/yah0130/echarts-wx-uniapp/issues) 中向我们反馈,谢谢!
137 |
138 | ## 常见问题及解决方案
139 | 以图形分类
140 |
141 | ### 所有图
142 | 1. 图表会覆盖弹窗,tab等页面组件上面
143 | 原因: 微信小程序中 canvas为原生组件,拥有最高优先级。
144 | 解决方案: 弹窗等需要覆盖图表的组件使用cover-view,cover-image来实现 详情请查看[小程序原生组件限制](https://developers.weixin.qq.com/miniprogram/dev/component/native-component.html#%E5%8E%9F%E7%94%9F%E7%BB%84%E4%BB%B6%E7%9A%84%E4%BD%BF%E7%94%A8%E9%99%90%E5%88%B6)
145 |
146 | 2. tooltip在手机上超出的部分不会显示
147 | 原因: echart自身问题
148 | 解决方案:需要通过判断点击的位置来动态设置tooltip的position
149 |
150 | 3. 格式化需要传入function无效
151 | 原因: 被序列化掉了
152 | 解决方案:需要手动setOption,例子如下:
153 |
154 | ```html
155 |
156 |
157 |
158 |
159 |
160 |
161 |
258 |
259 |
266 | ```
267 |
268 |
269 | ### 饼状图
270 | 1. 饼装图在安卓机下颜色中间会有颜色填充 如下图所示
271 | 
272 | 原因: echart自身bug,一直没有修复。当饼状图最后一个数据为0时,会已最后一个数据的颜色填充中间。
273 | 解决方案:
274 | 1.最后一个数据如果为0,强制设置为0.00001
275 | 2.添加一个假数据,颜色设置为中间的颜色,但是这个数据不显示。数据如下(中间填充白色)
276 | ``` json
277 | {
278 | value: 0,
279 | name: '',
280 | itemStyle: { color: '#ffffff' },
281 | label: { show: false },
282 | emphasis: { label: { show: false } }
283 | }
284 | ```
285 |
286 | 2. 饼状图禁用点击高亮(**hoverAnimation:false**)后标签和标签线虽然不显示了,但是高亮颜色还是会变化
287 | 如下图所示:图1未点击,图2点击过后
288 | 
289 | 
290 |
291 | 解决方案:
292 | 1.通过设置ec.stopTouchEvent来禁用点击事件,来放置用户点击
293 | 2.通过设置高亮颜色和不高亮颜色一致来使得看起来没有变化
--------------------------------------------------------------------------------
/uni-ec-canvas/uni-ec-canvas.vue:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
10 |
308 |
309 |
316 |
--------------------------------------------------------------------------------