├── .gitignore
├── docs
├── pie-clicked.jpeg
├── pie-not-click.jpeg
└── pie-center-filled.jpeg
├── examples
├── formatter
│ └── formatter.vue
├── lazy-load
│ └── lazy-load.vue
└── multi-charts
│ └── multi-charts.vue
├── uni-ec-canvas
├── wx-canvas.js
└── uni-ec-canvas.vue
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
--------------------------------------------------------------------------------
/docs/pie-clicked.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Zhuyi731/echarts-for-wx-uniapp/HEAD/docs/pie-clicked.jpeg
--------------------------------------------------------------------------------
/docs/pie-not-click.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Zhuyi731/echarts-for-wx-uniapp/HEAD/docs/pie-not-click.jpeg
--------------------------------------------------------------------------------
/docs/pie-center-filled.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Zhuyi731/echarts-for-wx-uniapp/HEAD/docs/pie-center-filled.jpeg
--------------------------------------------------------------------------------
/examples/formatter/formatter.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
11 |
12 |
13 |
14 |
15 |
87 |
94 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## deprecated
2 | 本项目仅支持vue2且已经停止维护, 建议使用其他echart插件进行开发
3 |
4 | [uniapp echart插件](https://ext.dcloud.net.cn/plugin?id=4899)
5 |
6 | ## 简介
7 | 本项目是 ECharts 的微信小程序版本,以及使用的示例。
8 |
9 | 该项目对[ecomfe/echarts-for-weixin](https://github.com/ecomfe/echarts-for-weixin)做了少量改动来兼容uni-app
10 |
11 | 需要通过uni-app编译后使用
12 |
13 | 如果你需要使用原生小程序开发方式,请移步[ecomfe/echarts-for-weixin](https://github.com/ecomfe/echarts-for-weixin)
14 |
15 | 开发者可以通过熟悉的 ECharts 配置方式,快速开发图表,满足各种可视化需求。
16 |
17 | ## 文件目录结构
18 |
19 | 为了兼容小程序 Canvas,我们提供了一个小程序的组件,用这种方式可以方便地使用 ECharts。
20 |
21 | 其中,`uni-ec-canvas` 是我们提供的组件,其他文件是如何使用该组件的示例。
22 |
23 | lazy-load为懒加载示例
24 |
25 | multi-charts为一个页面中多个表格的示例
26 |
27 | 其余示例请移步[官方示例](https://www.echartsjs.com/examples/zh/index.html)
28 |
29 | 然后将option替换即可
30 |
31 | `uni-ec-canvas` 目录下有一个 `echarts.js`,默认是包含所有功能的echarts。如有可以,建议从[官网自定义构建](http://echarts.baidu.com/builder.html)来替换这个文件以减小文件大小。
32 |
33 | ## 使用
34 | 复制uni-ec-canvas至你公用的组件文件夹
35 | 在页面中引入
36 |
37 | ```html
38 |
39 |
40 |
48 |
49 |
50 | ```
51 | ```js
52 |
75 | ```
76 | ```css
77 | // 这里一定要注意 设置该组件宽高 以及display:block来确保canvas初始化的时候是有宽高的
78 |
85 | ```
86 |
87 | ## FAQ
88 | ### uni-app 编译卡死
89 | 如果你配置了eslint检查,请屏蔽对echart.js的检查,否则会卡死
90 |
91 | ### 如何改变数据
92 | 改变ec.option中的值图表即可动态变化 注意新增属性请使用$set
93 |
94 | ### 如何获取图表实例?
95 |
96 | 在页面中使用 this.$refs['uni-ec-canvas'].$curChart即可获取chart实例
97 | 注意:
98 | 1. 使用 this.$refs['uni-ec-canvas'].$curChart获取需要等组件初始化完毕后才能获取到chart实例
99 |
100 | 也可以通过监听组件的inited事件来获取实例
101 |
102 | ```html
103 |
104 | ```
105 |
106 | ```js
107 | export default {
108 | methods: {
109 | inited(curChart){
110 | console.log('这时候图表初始化完成了')
111 | }
112 | }
113 | }
114 |
115 | ### 如何延迟加载图表?
116 |
117 | 参见 `examples/lazyLoad` 的例子,可以在获取数据后再初始化数据。
118 |
119 | ### 如何在一个页面中加载多个图表?
120 |
121 | 参见 `examples/multiCharts` 的例子。
122 |
123 | ### 文件太大怎么办?
124 |
125 | 本项目默认提供的 ECharts 文件是最新版本的包含所有组件文件,为了便于开发,提供的是未压缩的版本。远程调试或预览可以下载 [echarts.min.js](https://github.com/apache/incubator-echarts/blob/master/dist/echarts.min.js) 压缩版本。
126 |
127 | 发布时,如果对文件大小要求更高,可以在 [ECharts 在线定制](http://echarts.baidu.com/builder.html)网页下载仅包含必要组件的包,并且选择压缩。
128 |
129 | 下载的文件放在 `uni-ec-canvas/echarts.js`,**注意一定需要重命名为 `echarts.js`**。
130 |
131 | ## 微信版本要求
132 | 支持微信版本 >= 6.6.3,对应基础库版本 >= 1.9.91。尽可能使用更高版本的基础库版本。
133 | ### Canvas 2d 版本要求
134 | 最新版的 ECharts 微信小程序支持微信 Canvas 2d,当用户的基础库版本 >= 2.9.0 且没有设置 force-use-old-canvas="true" 的情况下,使用新的 Canvas 2d(默认)。
135 |
136 | 使用新的 Canvas 2d 可以提升渲染性能,解决非同层渲染问题,强烈建议开启
137 |
138 | 如果仍需使用旧版 Canvas,使用方法如下:
139 | ```
140 |
141 | ```
142 |
143 |
144 | 调试的时候,需要在微信开发者工具中,将“详情”下的“调试基础库”设为 1.9.91 及以上版本。
145 |
146 | 发布前,需要在 [https://mp.weixin.qq.com](https://mp.weixin.qq.com) 的“设置”页面,将“基础库最低版本设置”设为 1.9.91。当用户微信版本过低的时候,会提示用户更新。
147 |
148 | ## 暂不支持的功能
149 |
150 | ECharts 中的绝大部分功能都支持小程序版本,因此这里仅说明不支持的功能,以及存在的问题。
151 |
152 | 以下功能尚不支持,如果有相关需求请在echarts-for-weixin的 [issue](https://github.com/ecomfe/echarts-for-weixin/issues) 中反馈,对于反馈人数多的需求将优先支持:
153 |
154 | - 图片
155 | - 多个 zlevel 分层
156 |
157 | 此外,目前还有一些 bug 尚未修复,部分需要小程序团队配合上线支持,但不影响基本的使用。已知的 bug 包括:
158 |
159 | - 安卓平台:transform 的问题(会影响关系图边两端的标记位置、旭日图文字位置等)
160 | - iOS 平台:半透明略有变深的问题
161 | - iOS 平台:渐变色出现在定义区域之外的地方
162 |
163 | ## issue
164 |
165 | 如本项目有问题,欢迎在[issue](https://github.com/Zhuyi731/echarts-for-wx-uniapp/issues) 中向我们反馈,谢谢!
166 |
167 | ## 常见问题及解决方案
168 | 以图形分类
169 |
170 | ### 所有图
171 | 1. 图表会覆盖弹窗,tab等页面组件上面
172 | 原因: 微信小程序中 canvas为原生组件,拥有最高优先级。
173 | 解决方案: 弹窗等需要覆盖图表的组件使用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)
174 |
175 | 2. tooltip在手机上超出的部分不会显示
176 | 原因: echart自身问题
177 | 解决方案:需要通过判断点击的位置来动态设置tooltip的position
178 |
179 |
180 | ### 饼状图
181 | 1. 饼装图在安卓机下颜色中间会有颜色填充 如下图所示
182 | 
183 | 原因: echart自身bug,一直没有修复。当饼状图最后一个数据为0时,会已最后一个数据的颜色填充中间。
184 | 解决方案:
185 | 1.最后一个数据如果为0,强制设置为0.00001
186 | 2.添加一个假数据,颜色设置为中间的颜色,但是这个数据不显示。数据如下(中间填充白色)
187 | ``` json
188 | {
189 | value: 0,
190 | name: '',
191 | itemStyle: { color: '#ffffff' },
192 | label: { show: false },
193 | emphasis: { label: { show: false } }
194 | }
195 | ```
196 |
197 | 2. 饼状图禁用点击高亮(**hoverAnimation:false**)后标签和标签线虽然不显示了,但是高亮颜色还是会变化
198 | 如下图所示:图1未点击,图2点击过后
199 | 
200 | 
201 |
202 | 解决方案:
203 | 1.通过设置ec.stopTouchEvent来禁用点击事件,来放置用户点击
204 | 2.通过设置高亮颜色和不高亮颜色一致来使得看起来没有变化
205 |
--------------------------------------------------------------------------------
/examples/multi-charts/multi-charts.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
16 |
17 |
18 |
19 |
218 |
219 |
226 |
--------------------------------------------------------------------------------
/uni-ec-canvas/uni-ec-canvas.vue:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
10 |
310 |
311 |
318 |
--------------------------------------------------------------------------------