当前位置:   article > 正文

react轮播图swiper.js和antd走马灯的使用_antd carousel

antd carousel

本文主要记录两种方法的使用以及使用过程中遇到的问题。
本来很久之前就要写了,一直拖着,结果第二次又踩坑了上次同样的问题,一定得记录下来提醒自己!

一、Swiper

这是swiper.js官网​​​​​​​

1、引入swiper和swiper样式

  1. //index.js
  2. import Swiper from 'swiper'
  3. import 'swiper/css/swiper.css';

一定要记得引入样式,不然展示效果会有问题。不同版本引入的样式路径可能不一样,可以自己去swiper文件下看下路径。

2、在页面需要使用轮播组件的地方引入swiper容器

  1. //index.js
  2. <div className='swiper-container' id='swiper-container1'>
  3. <div className='swiper-wrapper'>
  4. <div className='swiper-slide'>
  5. 第一页轮播
  6. </div>
  7. <div className='swiper-slide'>
  8. 第二页轮播
  9. </div>
  10. </div>
  11. <div className='swiper-pagination' id='swiper-pagination1' />
  12. </div>

Swiper7使用的默认容器是'.swiper',Swiper6以下使用的是'.swiper-container'。默认的容器类名一般不要删除,Swiper的默认样式是施加在该类名上的。这里我们使用了默认的容器类名'swiper-container' 、'swiper-wrapper'、'swiper-slide'、'swiper-pagination'。
如果需要加自定义样式,可以在'swiper-container' 的div上加自己的样式名。

两个id可写可不写,因为后续需要初始化swiper实例,如果当前页面只有一个轮播,可以直接使用类名,如果有多个轮播,可以添加不同的id去区分。

3、初始化swiper实例

  1. const swiper1 = useRef(null)
  2. const initSwiper1 = (length) => {
  3. swiper1.current = new Swiper('#swiper-container1', {
  4. autoplay: {
  5. disableOnInteraction: false, //用户操作swiper之后自动切换不会停止,每次都会重新启动autoplay
  6. delay: 2000, //自动切换的时间间隔
  7. },
  8. loop: length > 1, //判断如果超过一页才循环
  9. pagination: {//分页器
  10. el: '#swiper-pagination1',
  11. type: 'fraction'
  12. },
  13. })
  14. }

如果页面中只有一个轮播,可以不写id,初始化实例的时候直接用类名

  1. const initSwiper1 = (length) => {
  2. swiper1.current = new Swiper('.swiper-container', {
  3. autoplay: {
  4. disableOnInteraction: false, //用户操作swiper之后自动切换不会停止,每次都会重新启动autoplay
  5. delay: 2000, //自动切换的时间间隔
  6. },
  7. loop: length > 1, //判断如果超过一页才循环
  8. pagination: {
  9. el: '.swiper-pagination',
  10. type: 'fraction'
  11. },
  12. })
  13. }

如果想要实现鼠标移入移出轮播容器的同时轮播暂停、播放功能,可以在轮播容器上加ref,再在初始化实例时实现这个功能

  1. //index.js
  2. const swiper1Ref = useRef(null)
  3. <div className='swiper-container' id='swiper-container1' ref={ref => swiper1Ref.current = ref}>
  4. </div>
  1. const initSwiper1 = (length) => {
  2. swiper1.current = new Swiper('#swiper-container1', {
  3. autoplay: {
  4. disableOnInteraction: false, //用户操作swiper之后自动切换不会停止,每次都会重新启动autoplay
  5. delay: 2000, //自动切换的时间间隔
  6. },
  7. loop: length > 1,
  8. pagination: {
  9. el: '#swiper-pagination1',
  10. type: 'fraction'
  11. },
  12. })
  13. if(swiper1Ref.current){
  14. swiper1Ref.current.onmouseover = () => {
  15. swiper1.current?.autoplay?.stop() //鼠标移入停止轮播
  16. };
  17. swiper1Ref.current.onmouseout = () => {
  18. swiper1.current?.autoplay?.start() //鼠标移出开始轮播
  19. }
  20. }
  21. }

另外如果数据来源有变动,需要重新初始化swiper实例时,记得先销毁实例,否则轮播时会魔性乱动。

  1. swiper1.current && swiper1.current.destroy()
  2. initSwiper1(length)

但是swiper.js有一个问题是:如果想要在轮播的页面绑定点击事件,有的页面点击事件是不生效的!之前百度过好像也有解决方法,但是好像很麻烦,就换了antd的走马灯,如果你也有点击这个需求,换走马灯比较方便。

二、antd Carousel

1、引入Carousel组件

import { Carousel } from 'antd'

一般项目都全局引入过antd的所有样式,这里就不要单独引入样式了

2、页面引入轮播容器

  1. const [auto, setAuto] = useState(true)
  2. <Carousel autoplay={auto} autoplaySpeed={1000}>
  3. <div>
  4. <h3 style={contentStyle}>1</h3>
  5. </div>
  6. <div>
  7. <h3 style={contentStyle}>2</h3>
  8. </div>
  9. <div>
  10. <h3 style={contentStyle}>3</h3>
  11. </div>
  12. <div>
  13. <h3 style={contentStyle}>4</h3>
  14. </div>
  15. </Carousel>

这样看上去antd走马灯简单很多。

antd3.x存在一个问题是当你暂停了轮播之后无法再次开始轮播,把autoplay设为true也不生效,但是这个问题在antd4.x已经解决了。

antd3.x还存在一个问题就是获取从后端接口得来的数据渲染时,会偶现渲染最后一页数据再渲染第一页数据,4.x是否还存在这个问题还没有验证。

antd走马灯自带鼠标移入移出暂停、开始轮播功能。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号