在 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