跳到主要内容
版本:v8

从 ion-slides 迁移到 Swiper.js

正在寻找 ion-slides

ion-slides 已在 v6.0.0 中弃用,并在 v7.0.0 中移除。我们建议直接使用 Swiper.js 库。迁移过程如下所述。

如果您需要现代触摸滑块组件,我们推荐 Swiper.js。本指南将介绍如何在您的 Ionic 框架应用中为 Vue 设置 Swiper。它还将涵盖您从 ion-slides 迁移到官方 Swiper Vue 集成可能需要的任何迁移信息。

备注

Swiper 的 Vue 组件计划在未来的 Swiper 版本中移除,Swiper Element 将作为替代。但是,本指南展示了如何迁移到 Vue 组件,因为它在撰写本文时提供了最稳定的体验。

使用 Swiper 的 Vue 组件不是将 Swiper.js 与 Ionic 框架一起使用的必要条件。

开始使用

首先,更新到最新版本的 Ionic:

npm install @ionic/vue@latest @ionic/vue-router@latest

我们建议升级到 Vue CLI 5 以获得与 Swiper 更好的兼容性:

vue upgrade --next

完成后,在项目中安装 Swiper 依赖:

npm install swiper@latest

滑动样式

接下来,我们需要导入基础的 Swiper 样式。我们还将导入 Ionic 提供的样式,这些样式允许我们使用与 ion-slides 相同的 CSS 变量来自定义 Swiper 样式。

我们建议在使用 Swiper 的组件中导入样式。这样可以确保样式仅在需要时加载:

<script setup lang="ts">
import 'swiper/css';
import '@ionic/vue/css/ionic-swiper.css';
</script>
备注

导入 @ionic/vue/css/ionic-swiper.css 不是将 Swiper.js 与 Ionic 一起使用的必要条件。此文件用于与 ion-slides 组件向后兼容,如果您不想使用样式表中提供的 CSS 变量,可以安全地省略它。

更新选择器

以前,我们可以针对 ion-slidesion-slide 来应用任何自定义样式。这些样式块的内容保持不变,但我们需要更新选择器。以下是从 ion-slides 迁移到 Swiper Vue 时的选择器更改列表:

ion-slides 选择器Swiper 选择器
ion-slides.swiper
ion-slide.swiper-slide

预处理器(可选)

对于使用 SCSS 或 Less 样式的开发者,Swiper 也提供了这些文件的导入方式。

对于 Less 样式,将 Swiper 导入路径中的 css 替换为 less

import 'swiper/less';
import '@ionic/vue/css/ionic-swiper.css';

对于 SCSS 样式,将 Swiper 导入路径中的 css 替换为 scss

import 'swiper/scss';
import '@ionic/vue/css/ionic-swiper.css';

使用组件

Swiper 导出两个组件:SwiperSwiperSlideSwiper 组件相当于 IonSlidesSwiperSlide 相当于 IonSlide

这些组件从 swiper/vue 导入并提供给您的 Vue 组件:

<template>
<ion-page>
<ion-content>
<swiper>
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
</swiper>
</ion-content>
</ion-page>
</template>

<script setup lang="ts">
import { Swiper, SwiperSlide } from 'swiper/vue';
import { IonContent, IonPage } from '@ionic/vue';

import 'swiper/css';
import '@ionic/vue/css/ionic-swiper.css';
</script>

使用模块

默认情况下,用于 Vue 的 Swiper 不会导入任何额外的模块。要使用导航(Navigation)或分页器(Pagination)等模块,您需要先导入它们。

ion-slides 自动包含了分页器(Pagination)、滚动条(Scrollbar)、自动播放(Autoplay)、键盘(Keyboard)和缩放(Zoom)模块。本指南将向您展示如何安装这些模块。

首先,我们需要从 swiper 包中导入模块及其对应的 CSS 文件:

<template>
<ion-page>
<ion-content>
<swiper>
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
</swiper>
</ion-content>
</ion-page>
</template>
<script setup lang="ts">
import { Autoplay, Keyboard, Pagination, Scrollbar, Zoom } from 'swiper/modules';
import { Swiper, SwiperSlide } from 'swiper/vue';
import { IonContent, IonPage } from '@ionic/vue';

import 'swiper/css';
import 'swiper/css/autoplay';
import 'swiper/css/keyboard';
import 'swiper/css/pagination';
import 'swiper/css/scrollbar';
import 'swiper/css/zoom';
import '@ionic/vue/css/ionic-swiper.css';
</script>

然后,我们需要通过 swiper 组件上的 modules 属性将这些模块提供给 Swiper:

<template>
<ion-page>
<ion-content>
<swiper :modules="modules">
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
</swiper>
</ion-content>
</ion-page>
</template>
<script>
import { Autoplay, Keyboard, Pagination, Scrollbar, Zoom } from 'swiper/modules';
import { Swiper, SwiperSlide } from 'swiper/vue';
import { IonContent, IonPage } from '@ionic/vue';

import 'swiper/css';
import 'swiper/css/autoplay';
import 'swiper/css/keyboard';
import 'swiper/css/pagination';
import 'swiper/css/scrollbar';
import 'swiper/css/zoom';
import '@ionic/vue/css/ionic-swiper.css';

const modules = [Autoplay, Keyboard, Pagination, Scrollbar, Zoom];
</script>

最后,我们可以通过使用相应的属性来启用这些功能:

<template>
<ion-page>
<ion-content>
<swiper :modules="modules" :autoplay="true" :keyboard="true" :pagination="true" :scrollbar="true" :zoom="true">
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
</swiper>
</ion-content>
</ion-page>
</template>
<script>
import { Autoplay, Keyboard, Pagination, Scrollbar, Zoom } from 'swiper/modules';
import { Swiper, SwiperSlide } from 'swiper/vue';
import { IonContent, IonPage } from '@ionic/vue';

import 'swiper/css';
import 'swiper/css/autoplay';
import 'swiper/css/keyboard';
import 'swiper/css/pagination';
import 'swiper/css/scrollbar';
import 'swiper/css/zoom';
import '@ionic/vue/css/ionic-swiper.css';

const modules = [Autoplay, Keyboard, Pagination, Scrollbar, Zoom];
</script>
备注

完整模块列表请参阅 https://swiperjs.com/vue#usage

IonicSlides 模块

使用 ion-slides 时,Ionic 自动自定义了数十个 Swiper 属性。这带来了在移动设备上滑动时流畅的体验。我们建议使用 IonicSlides 模块来确保直接使用 Swiper 时也设置了这些属性。但是,使用此模块不是在 Ionic 中使用 Swiper.js 的必要条件。

建议查阅由 IonicSlides 设置的属性,并确定您想要自定义哪些属性。

我们可以通过从 @ionic/vue 导入 IonicSlides 模块并将其作为 modules 数组中的最后一项来安装它:

<template>
<ion-page>
<ion-content>
<swiper :modules="modules" :autoplay="true" :keyboard="true" :pagination="true" :scrollbar="true" :zoom="true">
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
</swiper>
</ion-content>
</ion-page>
</template>
<script setup lang="ts">
import { Autoplay, Keyboard, Pagination, Scrollbar, Zoom } from 'swiper/modules';
import { Swiper, SwiperSlide } from 'swiper/vue';
import { IonContent, IonPage, IonicSlides } from '@ionic/vue';

import 'swiper/css';
import 'swiper/css/autoplay';
import 'swiper/css/keyboard';
import 'swiper/css/pagination';
import 'swiper/css/scrollbar';
import 'swiper/css/zoom';
import '@ionic/vue/css/ionic-swiper.css';

const modules = [Autoplay, Keyboard, Pagination, Scrollbar, Zoom, IonicSlides];
</script>
备注

IonicSlides 模块必须是数组中的最后一个模块。这将使其自动自定义分页器(Pagination)、滚动条(Scrollbar)、缩放(Zoom)等模块的设置。

属性

Swiper 选项直接作为 props 提供给 <swiper> 组件,而不是通过 ion-slides 中的 options 对象。

假设在使用 ion-slides 的应用中,我们设置了 slidesPerViewloop 选项:

<template>
<ion-slides :options="{ slidesPerView: 3, loop: true }">
<ion-slide>Slide 1</ion-slide>
<ion-slide>Slide 2</ion-slide>
<ion-slide>Slide 3</ion-slide>
</ion-slides>
</template>

要迁移,我们需要将这些选项移出 options 对象,直接作为属性放在 <swiper> 组件上:

<template>
<swiper :slides-per-view="3" :loop="true">
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
</swiper>
</template>

以下是从 ion-slides 迁移到 Swiper Vue 时属性更改的完整列表:

名称说明
options直接将每个选项作为属性设置在 <swiper> 组件上。
mode要基于模式应用不同的样式,可以在 CSS 中使用 .ios .swiper.md .swiper 来定位幻灯片。
pager改用 pagination 属性。需要安装 Pagination 模块。
scrollbar您可以继续使用 scrollbar 属性,但请确保先安装 Scrollbar 模块。
备注

Swiper Vue 中所有可用的属性可以在 https://swiperjs.com/vue#swiper-props 找到。

事件

由于 Swiper 组件不是由 Ionic 框架提供的,事件名称不会有 ionSlide 前缀。

假设在使用 ion-slides 的应用中,我们使用了 ionSlideDidChange 事件:

<template>
<ion-slides @ionSlideDidChange="onSlideChange">
<ion-slide>Slide 1</ion-slide>
<ion-slide>Slide 2</ion-slide>
<ion-slide>Slide 3</ion-slide>
</ion-slides>
</template>

要迁移,我们需要将事件名称改为 slideChange

<template>
<swiper @slideChange="onSlideChange">
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
</swiper>
</template>

以下是从 ion-slides 迁移到 Swiper Vue 时事件名称更改的完整列表:

ion-slides 事件Swiper 事件
ionSlideWillChangeslideChangeTransitionStart
ionSlideDidChangeslideChangeTransitionEnd
ionSlideDoubleTapdoubleTap
ionSlideDragsliderMove
ionSlideNextStartslideNextTransitionStart
ionSlideNextEndslideNextTransitionEnd
ionSlidePrevStartslidePrevTransitionStart
ionSlidePrevEndslidePrevTransitionEnd
ionSlideReachStartreachBeginning
ionSlideReachEndreachEnd
ionSlideTaptap
ionSlideTouchStarttouchStart
ionSlideTouchEndtouchEnd
ionSlideTransitionStarttransitionStart
ionSlideTransitionEndtransitionEnd
ionSlidesDidLoadinit
备注

Swiper Vue 中所有可用的事件可以在 https://swiperjs.com/vue#swiper-events 找到。

方法

大多数方法已被移除,取而代之的是直接访问 <swiper> 的 props。此外,调用方法时不再需要先访问 $el

访问这些属性可能有些棘手,因为您需要访问 Swiper 实例本身的属性,而不是 Vue 组件的属性。要做到这一点,我们建议通过 @swiper 事件处理程序获取对 Swiper 实例的引用:

<template>
<swiper @swiper="setSwiperInstance"> ... </swiper>
</template>

<script setup lang="ts">
import { ref } from 'vue';

const slides = ref();
const setSwiperInstance = (swiper: any) => {
slides.value = swiper;
};
</script>

然后,如果您想访问 Swiper 实例上的属性,可以访问 slides.value。例如,如果您想检查 isBeginning 属性,可以这样做:slides.value.isBeginning。不过请确保先确认 slides.value 已定义!

以下是从 ion-slides 迁移到 Swiper Vue 时方法更改的完整列表:

ion-slides 方法说明
getActiveIndex()改用 activeIndex 属性。
getPreviousIndex()改用 previousIndex 属性。
getSwiper()使用 @swiper 获取 Swiper 实例的引用。参见上面的示例。
isBeginning()改用 isBeginning 属性。
isEnd()改用 isEnd 属性。
length()改用 slides 属性(例如 swiperRef.slides.length)。
lockSwipeToNext()改用 allowSlideNext 属性。
lockSwipeToPrev()改用 allowSlidePrev 属性。
lockSwipes()改用 allowSlideNextallowSlidePrevallowTouchMove 属性。
startAutoplay()改用 autoplay 属性。
stopAutoplay()改用 autoplay 属性。

特效

如果您正在使用 Cube 或 Fade 等特效,您可以像处理其他模块一样安装它们。在此示例中,我们将使用淡入淡出效果。首先,从 swiper 导入 EffectFade 并将其提供在 modules 数组中:

<template>
<ion-page>
<ion-content>
<swiper :modules="modules">
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
</swiper>
</ion-content>
</ion-page>
</template>
<script>
import { EffectFade } from 'swiper/modules';
import { Swiper, SwiperSlide } from 'swiper/vue';
import { IonContent, IonPage, IonicSlides } from '@ionic/vue';

import 'swiper/css';
import '@ionic/vue/css/ionic-swiper.css';

const modules = [EffectFade, IonicSlides];
</script>

接下来,我们需要导入与特效相关的样式表:

<template>
<ion-page>
<ion-content>
<swiper :modules="modules">
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
</swiper>
</ion-content>
</ion-page>
</template>
<script>
import { EffectFade } from 'swiper/modules';
import { Swiper, SwiperSlide } from 'swiper/vue';
import { IonContent, IonPage, IonicSlides } from '@ionic/vue';

import 'swiper/css';
import 'swiper/css/effect-fade';
import '@ionic/vue/css/ionic-swiper.css';

const modules = [EffectFade, IonicSlides];
</script>

之后,我们可以通过将 swiper 上的 effect 属性设置为 "fade" 来激活它:

<template>
<ion-page>
<ion-content>
<swiper :modules="modules" effect="fade">
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
</swiper>
</ion-content>
</ion-page>
</template>
<script>
import { EffectFade } from 'swiper/modules';
import { Swiper, SwiperSlide } from 'swiper/vue';
import { IonContent, IonPage, IonicSlides } from '@ionic/vue';

import 'swiper/css';
import 'swiper/css/effect-fade';
import '@ionic/vue/css/ionic-swiper.css';

const modules = [EffectFade, IonicSlides];
</script>
备注

有关 Swiper 特效的更多信息,请参阅 https://swiperjs.com/vue#effects

总结

现在您已经安装了 Swiper,可以享受一整套新的 Swiper 功能了。我们建议从 Swiper Vue 介绍开始,然后参考 Swiper API 文档

常见问题

我在哪里可以找到此迁移的示例?

您可以在 https://github.com/ionic-team/slides-migration-samples 找到包含 ion-slides 和等效 Swiper 用法的示例应用。

我在哪里可以获得有关此迁移的帮助?

如果您在迁移中遇到问题,请在 Ionic 论坛上发帖。

我在哪里提交错误报告?

在提交 issue 之前,请考虑先在 Swiper 讨论板Ionic 论坛上发帖,看看您的问题是否可以由社区解决。

如果您遇到 Swiper 库的问题,新的 bug 应提交到 Swiper 仓库:https://github.com/nolimits4web/swiper/issues

如果您遇到 IonicSlides 模块的问题,新的 bug 应提交到 Ionic 框架仓库:https://github.com/ionic-team/ionic-framework/issues