问题现象
这个问题的现象说起来很简单。
小程序页面中有一篇很长的文章,内部有一个Echarts图表,手指上下滑动观看内容。
但是手指滑动区域在Echarts图表上时,页面却不能滑动了。
如下图:
追踪问题原因
因为在小程序上渲染图表用到的是echarts-for-weixin这个组件,而这个组件确实不支持一些Echarts功能。
所以最开始我怀疑是这个组件的问题,认为它把我的滑动事件给吞了。
为了确认这个问题,我直接在这个组件ec-canvas旁加了个兄弟节点view,然后用绝对定位将其覆盖在ec-canvas,这样滑动的时候就会滑动到我的view上而不是ec-canvas。
但是结果在ios下,还是不能滑动。
于是我给这个view的加了个背景色,在ios下的真机调试时发现,ec-canvas组件还是在view上面。
不论是加大view上的z-index值,还是将absolute改为fixed,反正ec-canvas组件所渲染的图表就是在view上面,而没有被view遮挡。
这个ec-canvas组件是如此出众,无论什么都遮盖不了它的风采。
而导致它如此出众的原因就是:图表是一个canvas组件,而小程序中canvas是一个原生组件。
接下来就让我们看看小程序中使用原生组件的限制。
小程序的原生组件使用限制
这里先附上链接:小程序原生组件使用限制。
让我们看看关键的地方:
也就是说canvas这类原生组件就是比view这种非原生的组件层级高。
用cover-view来解决?
为了解决原生组件层级最高的限制。小程序专门提供了 cover-view 和 cover-image 组件,可以覆盖在部分原生组件上面。这两个组件也是原生组件。
我将原来的兄弟view组件替换为了cover-view组件,然后希望达到可以滑动的效果。
虽然此时cover-view组件已经可以覆盖在canvas上了,但是依然不能滑动。
关于这个问题,我们可以认为小程序的所有组件都是放在webview中,而原生组件在webview中用的是占位符。
在滚动时,获取原生组件占位符的位置,再改变原生组件的位置。(如果仔细观察,会发现这些原生组件有时会产生一些奇怪的抖动,这一点可以佐证这个论点。)
所以ios下,我们手指在canvas和cover-view这类原生组件上滑动时,事件是不会传导到webview上的,页面也就不会滑动。
最终解决方案
对于这个问题,因为我这边和echarts的交互比较少,所以我的解决方案就是在echarts渲染完毕后将它替换为一张图片。
如果我更新了数据,那么就重新放出echarts,等它渲染完毕后,再次替换为一张图片。
由于公司代码不适合放出,所以我搞了个简易版的代码放在这里。
wxml文件关键代码:
<view class="echart-container"> <image wx:if="{{echartImgSrc!==''}}" src="/UploadFiles/2021-04-02/{{echartImgSrc}}">js文件关键代码:
Page({ data: { ec: { }, echartImgSrc: '' }, initChart(canvas, width, height) { const chart = echarts.init(canvas, null, { width: width, height: height }); canvas.setChart(chart); var option = { // ... }; chart.on('finished', () => { this.selectComponent('#mychart-dom-pie').canvasToTempFilePath({ success: res => { this.setData({ echartImgSrc: res.tempFilePath }) }, fail: res => console.log('转换图片失败', res) }); }) chart.setOption(option); return chart; }, echartInit(e) { this.initChart(e.detail.canvas, e.detail.width, e.detail.height); } });总结
总的来说,解决起来还算简单。
但是对于和Echarts有很多交互的场景,这个方案就未必那么好实现了。
从这个问题入手,我对微信小程序原生组件的玩法有了更多的认识。
更深入一点的认识就是,微信小程序当下对原生组件的这种处理更像是在一件普通的布衣上贴上貂皮补丁。
虽然考虑到了原生组件所带来的性能优势,但是同样也会引发大量的问题,对于这件衣服的整体表现而言这些貂皮补丁恐怕并不见得是件好事。
希望以后小程序能从根本上解决这种问题吧。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]