从 IonSlides 迁移至 Swiper.js
IonSlides 吗?IonSlides 在 v6.0.0 版本中已弃用,并在 v7.0.0 版本中被移除。我们建议直接使用 Swiper.js 库。详细的迁移流程如下。
如果您需要一个现代的触摸滑块组件,我们推荐使用 Swiper.js。本指南将介绍如何在 您的 Ionic Framework 应用中为 React 设置 Swiper,并涵盖从 IonSlides 迁移到官方 Swiper React 集成所需的步骤。
Swiper 的 React 组件计划在未来的 Swiper 版本中移除,取而代之的是 Swiper Element。但是,本指南展示了如何迁移到 React 组件,因为它在撰写本文时提供了最稳定的体验。需要注意的是,React 对 Web Components 的支持目前还不完善。
在 Ionic Framework 中使用 Swiper.js 并不强制要求使用 Swiper 的 React 组件。
开始迁移
首先,将 Ionic 更新到最新版本:
npm install @ionic/react@latest @ionic/react-router@latest
完成后,在项目中安装 Swiper 依赖:
npm install swiper@latest
使用 Create React App 的开发者必须使用 react-scripts v5.0.0 或更高版本,并结合最新版本的 Swiper。
样式调整
接下来,我们需要导入基础的 Swiper 样式。同时,我们也会导入 Ionic 提供的样式文件,这样我们就可以使用与 IonSlides 相同的 CSS 变量来自定义 Swiper 的样式。
我们建议在使用 Swiper 的组件中导入这些样式,这样可以确保样式仅在需要时才被加载:
import React from 'react';
import { IonContent, IonPage } from '@ionic/react';
import { Swiper, SwiperSlide } from 'swiper/react';
import 'swiper/css';
import '@ionic/react/css/ionic-swiper.css';
const Home: React.FC = () => {
return (
...
);
};
export default Home;
在 Ionic 中使用 Swiper.js 并不强制要求导入 @ionic/react/css/ionic-swiper.css。此文件主要用于与 IonSlides 组件保持向后兼容性,如果您不想使用该样式表中提供的 CSS 变量,可以安全地省略它。
更新选择器
以前,我们可以通过 ion-slides 和 ion-slide 选择器来应用自定义样式。这些样式块的内容本身保持不变,但我们需要更新选择器。下面是从 ion-slides 迁移到 Swiper React 时的选择器变化列表:
| ion-slides 选择器 | Swiper 选择器 |
|---|---|
ion-slides | .swiper |
ion-slide | .swiper-slide |
使用预处理器(可选)
对于使用 SCSS 或 Less 样式的开发者,Swiper 也提供了相应的导入文件。
对于 Less 样式,将 Swiper 导入路径中的 css 替换为 less:
import React from 'react';
import { IonContent, IonPage } from '@ionic/react';
import { Swiper, SwiperSlide } from 'swiper/react';
import 'swiper/less';
import '@ionic/react/css/ionic-swiper.css';
const Home: React.FC = () => {
return (
...
);
};
export default Home;
对于 SCSS 样式,将 Swiper 导入路径中的 css 替换为 scss:
import React from 'react';
import { IonContent, IonPage } from '@ionic/react';
import { Swiper, SwiperSlide } from 'swiper/react';
import 'swiper/scss';
import '@ionic/react/css/ionic-swiper.css';
const Home: React.FC = () => {
return (
...
);
};
export default Home;
使用组件
Swiper 导出两个组件:Swiper 和 SwiperSlide。Swiper 组件相当于之前的 IonSlides,而 SwiperSlide 则相当于 IonSlide。
这些组件需要从 swiper/react 导入:
import React from 'react';
import { IonContent, IonPage } from '@ionic/react';
import { Swiper, SwiperSlide } from 'swiper/react';
import 'swiper/css';
import '@ionic/react/css/ionic-swiper.css';
const Home: React.FC = () => {
return (
<IonPage>
<IonContent>
<Swiper>
<SwiperSlide>幻灯片 1</SwiperSlide>
<SwiperSlide>幻灯片 2</SwiperSlide>
<SwiperSlide>幻灯片 3</SwiperSlide>
</Swiper>
</IonContent>
</IonPage>
);
};
export default Home;
使用模块
默认情况下,Swiper for React 不会导入任何额外的模块。要使用导航(Navigation)或分页器(Pagination)等模块,您需要先导入它们。
IonSlides 自动包含了 Pagination、Scrollbar、Autoplay、Keyboard 和 Zoom 这些模块。本部分将向您展示如何安装这些模块。
首先,我们需要从 swiper 包中导入所需的模块及其对应的 CSS 文件:
import React from 'react';
import { IonContent, IonPage } from '@ionic/react';
import { Swiper, SwiperSlide } from 'swiper/react';
import { Autoplay, Keyboard, Pagination, Scrollbar, Zoom } from 'swiper/modules';
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/react/css/ionic-swiper.css';
const Home: React.FC = () => {
return (
<IonPage>
<IonContent>
<Swiper>
<SwiperSlide>幻灯片 1</SwiperSlide>
<SwiperSlide>幻灯片 2</SwiperSlide>
<SwiperSlide>幻灯片 3</SwiperSlide>
</Swiper>
</IonContent>
</IonPage>
);
};
export default Home;
接着,我们需要通过在 Swiper 组件上使用 modules 属性来将这些模块提供给 Swiper:
import React from 'react';
import { IonContent, IonPage } from '@ionic/react';
import { Swiper, SwiperSlide } from 'swiper/react';
import { Autoplay, Keyboard, Pagination, Scrollbar, Zoom } from 'swiper/modules';
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/react/css/ionic-swiper.css';
const Home: React.FC = () => {
return (
<IonPage>
<IonContent>
<Swiper modules={[Autoplay, Keyboard, Pagination, Scrollbar, Zoom]}>
<SwiperSlide>幻灯片 1</SwiperSlide>
<SwiperSlide>幻灯片 2</SwiperSlide>
<SwiperSlide>幻灯片 3</SwiperSlide>
</Swiper>
</IonContent>
</IonPage>
);
};
export default Home;
最后,我们可以通过使用相应的属性来启用这些功能:
import React from 'react';
import { IonContent, IonPage } from '@ionic/react';
import { Swiper, SwiperSlide } from 'swiper/react';
import { Autoplay, Keyboard, Pagination, Scrollbar, Zoom } from 'swiper/modules';
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/react/css/ionic-swiper.css';
const Home: React.FC = () => {
return (
<IonPage>
<IonContent>
<Swiper
modules={[Autoplay, Keyboard, Pagination, Scrollbar, Zoom]}
autoplay={true}
keyboard={true}
pagination={true}
scrollbar={true}
zoom={true}
>
<SwiperSlide>幻灯片 1</SwiperSlide>
<SwiperSlide>幻灯片 2</SwiperSlide>
<SwiperSlide>幻灯片 3</SwiperSlide>
</Swiper>
</IonContent>
</IonPage>
);
};
export default Home;
完整的模块列表请参考 https://swiperjs.com/react#usage。
IonicSlides 模块
在 IonSlides 中,Ionic 自动定制了数十个 Swiper 属性,从而在移动设备上滑动时提供了流畅的体验。我们建议使用 IonicSlides 模块,以确保直接使用 Swiper 时也能应用这些属性。但是,在 Ionic 中使用 Swiper.js 并不强制要求使用此模块。
建议您查看 IonicSlides 设置的属性列表,并决定哪些是您想自定义的。
我们可以通过从 @ionic/react 导入 IonicSlides 模块,并将其作为 modules 数组中的最后一项传入来安装它:
import React from 'react';
import { IonContent, IonPage, IonicSlides } from '@ionic/react';
import { Swiper, SwiperSlide } from 'swiper/react';
import { Autoplay, Keyboard, Pagination, Scrollbar, Zoom } from 'swiper/modules';
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/react/css/ionic-swiper.css';
const Home: React.FC = () => {
return (
<IonPage>
<IonContent>
<Swiper
modules={[Autoplay, Keyboard, Pagination, Scrollbar, Zoom, IonicSlides]}
autoplay={true}
keyboard={true}
pagination={true}
scrollbar={true}
zoom={true}
>
<SwiperSlide>幻灯片 1</SwiperSlide>
<SwiperSlide>幻灯片 2</SwiperSlide>
<SwiperSlide>幻灯片 3</SwiperSlide>
</Swiper>
</IonContent>
</IonPage>
);
};
export default Home;