집 >위챗 애플릿 >미니 프로그램 개발 >WeChat 미니 프로그램에서 전자 차트 사용하기
사람들이 집에 앉아 있는데 냄비가 하늘에서 내려옵니다.
보름 전에 집에서 프로젝트를 작성하고 있었는데, 테스트할 시간도 되기 전에 리더님이 갑자기 전화하셔서 다른 프로젝트를 바로 지원해 달라고 문의하셨는데, 바로 그 프로젝트였습니다. 반년 동안 미완성이었습니다. 원하지 않더라도 계속해야했습니다. 루쉰이 말했듯이 인생은 강간과도 같아서 저항할 수 없으니 즐겨라.
이 프로젝트는 PC 측, 사용자 측 애플릿, 판매자 측 애플릿으로 나누어집니다. 여기서는 주로 통계 차트를 사용해야 하는 특정 모듈에 대해 이야기합니다. 당시에는 두 가지 플러그가 있다고 생각했습니다. - 좋았던 기능:
예전 프로젝트에서 echarts
를 많이 사용하다보니 결국 echarts를 선택하게 되었습니다. 프로젝트의 차트 플러그인echarts
比较多,所以最终选择了echarts作为项目中的图表插件
echarts的引入
我是按照echarts
官网教程来引入的,很简单,不多说。传送门
echarts中使用多个图表
wxml代码如下:
<!--图表1--><view class="echarts-container" hidden="{{!isShoweyes || !echartsData.totalRecentRansactions.allTotalMoney}}"> <ec-canvas id="mychart-dom-turnover" canvas-id="mychart-turnover" ec="{{ turnoverEc }}"></ec-canvas></view><!--图表2--><view class="echarts-container" hidden="{{!isShoweyes || !echartsData.shopNewCustomerRespVo.allNewCustomer}}"> <ec-canvas id="mychart-dom-customer" canvas-id="mychart-customer" ec="{{ customerEc }}"></ec-canvas></view><!--图表3--><view class="echarts-container" hidden="{{!isShoweyes || !echartsData.customerOrderAverageRespVo.customerAverage}}"> <ec-canvas id="mychart-dom-price" canvas-id="mychart-price" ec="{{ priceEc }}"></ec-canvas></view>
js代码如下
<!--通过lazyLoad设置图表懒加载-->data: { isShoweyes: true, turnoverEc: { lazyLoad: true, }, customerEc: { lazyLoad: true, }, priceEc: { lazyLoad: true, }, echartsData: {} }, <!--页面加载时创建对应的canvas面板-->onLoad: function (options) { this.echartsComponnet1 = this.selectComponent('#mychart-dom-turnover'); this.echartsComponnet2 = this.selectComponent('#mychart-dom-customer'); this.echartsComponnet3 = this.selectComponent('#mychart-dom-price'); }, <!--获取到数据后,初始化报表--> getData: function () { // .... 获取数据 <!--此用循环初始化几个图表--> for (let i = 1; i < 4; i++) { if (!Chart[i]) { this.initEcharts(i); //初始化图表 } else { this.setOption(i); //更新数据 } } }, <!--//初始化图表--> initEcharts: function (i) { this['echartsComponnet' + i].init((canvas, width, height) => { // 初始化图表 Chart[i - 1] = echarts.init(canvas, null, { width: width, height: height }); this.setOption(i); // 注意这里一定要返回 chart 实例,否则会影响事件处理等 return Chart[i - 1]; }); }, setOption: function (i) { Chart[i - 1].clear(); // 清除 Chart[i - 1].setOption(this['getOption' + i]()); //获取新数据 }, <!--设置报表需要的配置项--> getOption1() { let { echartsData } = this.data; return { color: ['#0179FF'], tooltip: { trigger: 'axis', axisPointer: { // 坐标轴指示器,坐标轴触发有效 type: 'shadow', // 默认为直线,可选为:'line' | 'shadow' shadowStyle: { opacity: 0.8 } }, formatter: this.formatterTooltip, position: this.setTooltipPositionfunction }, grid: { left: 20, right: 20, bottom: 15, top: 40, containLabel: true }, xAxis: [{ type: 'category', axisLine: { lineStyle: { color: '#999', } }, axisLabel: { color: '#666', }, data: echartsData.totalRecentRansactions.dates, } ], yAxis: [{ type: 'value', axisTick: { show: false }, axisLine: { show: false, lineStyle: { color: '#999', } }, axisLabel: { color: '#666', fontSize: 13 } }], series: [{ name: '订单总额', type: 'line', label: { normal: { show: true,// 是否在折线点上显示数值 position: 'inside' } }, data: echartsData.totalRecentRansactions.allTotalMoney }] }; } 遇到的坑 1.Tooltip支持不好 虽然官网上echarts暂时不支持Tooltip,但是经过试验,还是Tooltip还是有效果的,但是,x轴对应的坐标值并不会显示在Tooltip中,需要使用Tooltip的formatter函数,自己处理需要展示的数据,代码如下: // 格式化Tooltip formatterTooltip(param) { return "日期:" + param[0].name + "\n" + param[0].seriesName + ": " + param[0].data }, 2.当点击靠近屏幕右侧或者底部的item项时,Tooltip会溢出边界,解决办法: 给Tooltip的position函数返回一个根据点击位置计算的坐标点,(也可以给一个固定的位置,但是体验不好) // 更改Tooltip的位置,处理边界超出的情况 setTooltipPositionfunction(point, params, dom, rect, size) { //其中point为当前鼠标的位置,size中有两个属性:viewSize和contentSize,分别为外层div和tooltip提示框的大小 // 更改提示框的显示位置 let x = point[0];// let y = point[1]; // size: 包括 dom 的尺寸和 echarts 容器的当前尺寸,例如:{contentSize: [width, height], viewSize: [width, height]} let boxWidth = size.contentSize[0]; // let boxHeight = size.contentSize[1]; // size里面此处获取不到dom的高度,值为NAN,所以下面指定了一个固定值 let boxHeight = 50; let posX = 0;//x坐标位置 let posY = 0;//y坐标位置 if (x < boxWidth) {//左边放不开 posX = 5; } else {//左边放的下 posX = x - boxWidth; } if (y < boxHeight) {//上边放不开 posY = 5; } else {//上边放得下 posY = y - boxHeight; } return [posX, posY]; },
上面需要注意的是,获取dom
的高度,官方上说的是可以从position
回调函数的size
参数中获取到dom
的高度,但是我打印出来却是NAN
。
打印出来结果:
后来发现参数params
中outerWidth
的值和参数size
中contentSize
的宽度值相同,所以果断取参数params
中的outerHeight
作为dom
的高度,最后运行的效果确实没有问题。
3.左右滑动柱状图时,柱状图画板会变空白,点一下空白又会出现柱状图,而且这个问题只有在柱状图上出现!
刚开始以为是自己代码的问题,后来自己检查了几遍,确实没什么问题,然后扫码体验了官方的小程序demo,发现也有这个问题,顿时只想对它口吐芬芳。既然是官方代码自身的问题,于是去看了下源码,如下:
<canvas class="ec-canvas" canvas-id="{{ canvasId }}" bindinit="init" bindtouchstart="{{ ec.disableTouch ? '' : 'touchStart' }}" bindtouchmove="{{ ec.disableTouch ? '' : 'touchMove' }}" bindtouchend="{{ ec.disableTouch ? '' : 'touchEnd' }}"></canvas>
官方代码给画布绑定一个bindtouchmove
事件
touchMove(e) { if (this.chart && e.touches.length > 0) { var touch = e.touches[0]; var handler = this.chart.getZr().handler; handler.dispatch('mousemove', { zrX: touch.x, zrY: touch.y }); handler.processGesture(wrapTouch(e), 'change'); } },
这里面又去调用了echarts.js
中的方法,最后想了一个粗暴的解决办法:
删掉源码中的bindtouchmove事件
完美解决,哈哈或或红红火火恍恍惚惚~~~
<img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/image/417/204/228/1591249707644801.jpg" class="lazy" title="1591249707644801.jpg" alt="WeChat 미니 프로그램에서 전자 차트 사용하기">
echarts 소개
echarts
공식 홈페이지 튜토리얼을 따라 소개했습니다. 아주 간단해서 별로 할 말이 없습니다. 포털🎜🎜🎜echarts에서 여러 차트 사용🎜 🎜🎜 wxml 코드는 다음과 같습니다. 🎜rrreee🎜js 코드는 다음과 같습니다🎜rrreee🎜위에서 주목해야 할 것은
dom
의 높이를 얻으려면 콜백 함수를 사용할 수 있다는 것입니다.position
에서 호출됩니다.dom
의 높이는size
매개변수에서 가져오는데, 인쇄해 보니NAN입니다. 코드>. 🎜🎜<img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/image/208/596/719/1591249510744545.jpg" class="lazy" title="1591249510744545.jpg" alt="WeChat 미니 프로그램에서 전자 차트 사용하기"> 🎜 🎜결과 인쇄: 🎜🎜<img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/image/387/366/705/1591249554690992.jpg" class="lazy" title="1591249554690992.jpg" alt="529723908-adc36b63826e1e9a 아이렉스 .jpg">🎜🎜나중에 <code>params
매개변수에서outerWidth
값을 찾았고size 매개변수에서 <code>contentSize
너비 값을 찾았습니다. 동일하므로params
매개변수의outerHeight
를dom
의 높이로 결정하면 최종 실행 효과는 실제로 괜찮아요. 🎜🎜🎜
3. 히스토그램을 왼쪽이나 오른쪽으로 밀면 히스토그램 드로잉 보드가 공백이 됩니다. 빈칸을 클릭하세요. 히스토그램이 다시 나타날 것입니다. 이 문제는 히스토그램에서만 발생합니다! 🎜🎜처음에는 제가 만든 코드에 문제가 있는 줄 알았는데, 몇번을 확인해 보니 정말 문제가 없었습니다. 그러다가 공식 미니 프로그램 데모를 체험해 보았는데 이 문제도 존재한다는 것을 알게 되었습니다. 나는 그것에 대해 토하고 싶었습니다. 공식 코드 자체의 문제였기 때문에 소스코드를 살펴보니 다음과 같습니다. 🎜rrreee🎜공식 코드는
bindtouchmove
이벤트를 캔버스에 바인딩합니다🎜rrreee🎜여기서 다시 ,echarts가 호출됩니다. js
, 마침내 조잡한 해결책이 생각났습니다. 🎜🎜소스 코드에서 바인딩터치무브 이벤트를 삭제하세요
🎜🎜완벽한 해결책입니다. 하하 아니면 번영하고 무아지경에 빠진 상태~~
🎜
<img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/image/624/891/673/1591249801162251.jpg" class="lazy" title="1591249707644801.jpg" alt="WeChat 미니 프로그램에서 전자 차트 사용하기">
🎜🎜🎜위 내용은 제가 작은 프로그램에서 echart를 사용할 때 겪게 되는 함정들입니다. 나중에 사람들이 함정을 피하는 데 도움이 되기를 바랍니다. 🎜🎜
최종 효과 사진
데모 소스 코드
추천 튜토리얼: "JS Tutorial"
위 내용은 WeChat 미니 프로그램에서 전자 차트 사용하기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!