本文针对Vue项目中Swiper开启loop:true循环模式时,ECharts图表无法渲染及点击事件失效的问题进行分析。通过修改DOM初始化逻辑及利用swiper的click-slide事件,分别解决了图表ID冲突导致的渲染失败和事件绑定缺失导致的交互失效,提供了具体的代码实现方案。
项目背景
开发场景要求:在Swiper组件的每一个轮播项中展示独立的ECharts图表,并且必须开启Swiper的loop:true属性以实现无限循环播放效果。
当前使用的技术栈版本如下:Swiper版本为5.3.6,Vue插件vue-awesome-swiper版本为4.0.4,ECharts库版本为5.2.1。
问题一
开启loop:true后,首先遇到的问题是ECharts无法正常渲染。经排查发现,Swiper在启用循环模式时,会在首尾复制额外的Slide以维持视觉上的循环连续性。这导致初始化时生成的DOM元素ID不再唯一,ECharts实例化时因ID冲突而失效,图表无法显示。
解决办法
// 通过class获取dom,并在循环时初始化,为了保证echarts初始化时dom已经更新渲染,加一个setTimeout函数
setTimeout(() => {
// 解决绘图复制出来的echarts没有显示的问题
const myEchart = document.getElementsByClassName('liquidfill')
let chart = null
for (const item of myEchart) {
item.setAttribute('_echarts_instance_', '')
chart = echarts.init(item)
chart.setOption(option)
}
})问题二
- 在解决图表显示问题后,发现ECharts图表内部及标签上的点击事件全部失效。虽然并非所有交互都受影响,但核心功能无法使用。经研究,原因与第一个问题类似:Swiper复制Slide后,新复制的节点并未绑定原有的点击事件监听器,导致用户点击时无响应。
- 解决办法
通过查阅Swiper文档,发现其提供了一个click-slide事件。该事件回调函数接收两个参数:index(当前Slide的下标,包含复制的Slide)和realIndex(真实Slide的下标)。利用realIndex可以准确定位到原始数据对应的Slide,从而执行相应的交互逻辑。
<swiper ref="mySwiper" class="my-swipe" :options="swiperOptions" @click-slide="goToPage"></swiper>`
goToPage(index, realIndex) {
// index 当前slide下标包含复制的slide
// realIndex 真实的下表 根据这个下标执行对应方法即可。
}到此这篇关于同时使用swiper和echarts遇到的问题及解决方法的文章就介绍到这了,更多相关使用swiper和echarts遇到问题内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!