在 vue 中使用 swiper 的 virtual 特性
swiper 介绍
- 前端开发中,经常会碰到轮播、翻页等需求。swiper就是用来解决此类需求的。
- 功能全、覆盖场景多,可适配移动端等特点,让它成为实现此类需求的最好选择。
- 它有专门的
vue版本,vue-awesome-swiper
背景
- 项目是基于
vue全家桶开发的,有轮播需求,轮播的 slides 数量较多,slide 的 DOM 结构比较复杂。
问题
- 项目中使用的是
vue-awesome-swiper,它基于swiper做了相关封装 - 使用时并没有使用
virtual slides特性,初始化时会渲染所有slide,导致初始渲染速度较慢。在DOM结构复杂,slide 数量为 100 时,初始渲染大概需要 2~3s。 - 数据改变触发更新时,
vue-awesome-swiper会频繁触发update操作。容易页面卡死。 - 类似问题https://github.com/surmon-china/vue-awesome-swiper/issues/424
- 见源码
1 | // vue-awesome-swiper/src/slide.vue |
-
使用 swiper 的 virtual 特性
virtual官方介绍 -虚拟Slide会在Dom结构中保持尽量少的Slide,只渲染当前可见的slide和前后的slide,而隐藏其他不可见的Slide,每次切换时就渲染新的Slide。当你的Slide很多的时候,尤其是Slide中有复杂的Dom树结构时,性能会有很大的提升。- 由于使用
vue-awesome-swiper出现了一些性能问题,所以我们决定直接使用swiper版本并开启virtual特性(注意使用 4.0 版本) - 中文文档中,并没有详细介绍如何在
vue中使用virtual特性。 - 英文文档 http://idangero.us/swiper/api/#virtual中详细介绍了如何在
vue、react中使用virtual特性
1 | <template> |
- 使用后每次仅渲染当前页及前后页
- 每次渲染时,会重新触发
vue的生命周期 - 其他使用基本和不使用
virtual特性保持一致 - 若有
swiper嵌套需求,可在子组件中直接实例化一个swiper并设置nested选项为true
总结
vue-awesome-swiper有坑,会频繁调用update,导致一定性能问题- 可直接使用
swiper替换vue-awesome-swiper