React 中使用 swiper 7

5,731 阅读2分钟

「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

前言

swiper作为一个广泛的移动端网页触摸内容滑动js插件,关于在react中的使用的例子都相对比较少,版本也比较旧,官方没有太多关于react的demo,这里主要实现一个比较常见的例子swiper7 在 react 中的双向控制实现导航与swiper联动

安装

使用npm安装

npm i swiper

基本使用

官方文档地址: Swiper React Components

// 引入Swiper组件
import { Swiper, SwiperSlide } from 'swiper/react';

// 引入Swiper样式
import 'swiper/css';
export default () => {
  return (
    <Swiper
      spaceBetween={50} 
      slidesPerView={3}
      onSlideChange={() => console.log('slide change')}
      onSwiper={(swiper) => console.log(swiper)}
    >
      <SwiperSlide>Slide 1</SwiperSlide>
      <SwiperSlide>Slide 2</SwiperSlide>
      <SwiperSlide>Slide 3</SwiperSlide>
      <SwiperSlide>Slide 4</SwiperSlide>
      ...
    </Swiper>
  );
};

swiper7相较于之前的版本,组件化分离得比较细致,除了两个基础的组件是默认必须引入的,其他Controller, Navigation, Pagination, Scrollbar, Virtual, Mousewheel, Autoplay都是按需引入加载,这样页面加载可以更快!

如何做双向控制

由于swiper官方没有react的详细demo,也没有中文文档,英文文档的例子也相对简单,这边摸索了一下,做了一个导航跟swiper的双向控制滑动组件

import { Swiper, SwiperSlide } from 'swiper/react';
//其他模块引入
import { Controller, Navigation, Pagination, Scrollbar, Mousewheel, Autoplay } from 'swiper'
// 引入Swiper样式
import 'swiper/css';
import 'swiper/css/navigation';
import 'swiper/css/pagination';
import 'swiper/css/scrollbar';

class SwiperConent extends Component {
  constructor(props) {
   	super(props)
    //全部数据
    this.state = {
      // 初始化数据
      tabList: [{ title: 'tab1' }, { title: 'tab2' }, { title: 'tab3' }, { title: 'tab4' }],
      currentIndex: 0,
    }
  }
    
  changeSwiper(value) {
    console.log(value)
    this.setState({
      currentIndex: value,
    })
    //点击改变swiper
    this.swiper.slideTo(value)
  }
  onSwiper(swiper) {
    console.log(swiper)
  }
  slideChange(e) {
    console.log(e.activeIndex)
    this.setState({
      currentIndex: e.activeIndex,
    })
  }

  render() {
    const { tabList } = this.state
    return (
	   <ul className="apply-menu">
	      {tabList.map((item, index) => (
	         <li
	           key={index}
	           className={index === this.state.currentIndex ? 'menu-active' : ''}
	           onClick={() => {
	             this.changeSwiper(index)//绑定点击
	           }}
	         >
	           {item.title}
	         </li>
	       ))}
	     </ul>
	     <Swiper
                 // install Swiper modules
                 modules={[Controller, Navigation, Pagination, Scrollbar, Mousewheel, Autoplay]}
	     	 spaceBetween={0}
	         slidesPerView={1}
	         navigation
	         autoplay
	         pagination={{ clickable: true }}
	         onSwiper={(swiper) => {
	           //重点是将swiper挂载到this上
	           this.swiper = swiper 
	         }}
	         onSlideChange={(e) => {
	           this.slideChange(e)
	         }}
	    >
	      <SwiperSlide>Slide 1</SwiperSlide>
	      <SwiperSlide>Slide 2</SwiperSlide>
	      <SwiperSlide>Slide 3</SwiperSlide>
	      <SwiperSlide>Slide 4</SwiperSlide>
	    </Swiper>
     )
  }
	
}

这里代码的重点是在onSwiper的时候将swiper挂载到this,这样就可以在其他地方使用this.swiper拿到swiper的相关属性跟方法,这样就可以方便地实现很多功能啦!

原创文章,转载请注明出处~谢谢🙏