Использование swiper в реакции

внешний интерфейс JavaScript React.js CSS

предисловие

Добро пожаловать на мой блогOECOMИсследуйте передний конец со мной.

текст

В недавнем проекте реакции нужно использовать карусельную карту, поэтому, естественно, я подумал о swiper, и я всегда хотел использовать его через установку npm, но я нашел много в Интернете, а информации было очень мало, поэтому я временно сослался на swiper непосредственно в файлах index.html.js и css для загрузки, давайте поговорим о конкретных шагах и использовании.

Во-первых, здесь я использую серию swiper3x. Ниже приведены конкретные шаги:

Добавьте файлы js и css в index.html.

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="theme-color" content="#000000">
   
    <link rel="manifest" href="%PUBLIC_URL%/manifest.json">
    <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">
      <link rel="stylesheet" type="text/css" href='%PUBLIC_URL%/static/css/swiper.min.css'>
  
    <title>React App</title>
  </head>
  <body>
    <div id="root"></div>
    <script src='%PUBLIC_URL%/static/js/swiper.min.js'></script>
  </body>
</html>

Конечно, я загрузил файлы js и css в локальную сеть, вы также можете использовать путь cdn, пока введение в основном завершено, следующий шаг - как вызвать компонент реакции.

Тут нужно сказать, что импортированный js файл нельзя использовать напрямую в компоненте, а переменную нужно объявить в самом начале.Последующий способ использования такой же, как и при обычном способе написания html.Разница заключается в том, в чем жизненный цикл должен быть записан в., я лично рекомендую писать в цикле componentDidUpdate, потому что иногда данные собираются асинхронно, и сбор данных может быть не завершен, когда он только что завершен.После завершения сбора данных состояние обновляется, и цикл обновления будет запущен в это время.

import React,{Component} from 'react'

let Swiper = window.Swiper
class About extends Component{
	constructor(props){
		super(props);
		this.state = {
			myName : "这里是about页面",
			
		}
	}
	
componentWillUnmount() {
    if (this.swiper) { // 销毁swiper
      this.swiper.destroy()
    }
  }
componentDidUpdate(){
  if(this.swiper){
      this.swiper.slideTo(0, 0)
      this.swiper.destroy()
      this.swiper = null;
    }
	this.swiper = new Swiper(this.refs.lun, {
             loop:true,
             pagination: {
             el: '.swiper-pagination',
             clickable: true,
            },
          });
	}
render(){		
return (
   <div>
      <div className="swiper-container" ref="lun">
      <div className="swiper-wrapper">
      <div className="swiper-slide" data-id="0">Slide 1</div>
      <div className="swiper-slide" data-id="1">Slide 2</div>
      <div className="swiper-slide" data-id="2">Slide 3</div>
      <div className="swiper-slide" data-id="3">Slide 4</div>
      <div className="swiper-slide" data-id="4">Slide 5</div>
      <div className="swiper-slide" data-id="5">Slide 6</div>
      <div className="swiper-slide" data-id="6">Slide 7</div>
      <div className="swiper-slide" data-id="7">Slide 8</div>
      <div className="swiper-slide" data-id="8">Slide 9</div>
      <div className="swiper-slide" data-id="9">Slide 10</div>
    </div>
<div id="PgFather">
 <div className="swiper-pagination" id='body-left-pagination'></div>
</div>
   
  </div>
    </div>
	)
	}
}
export default About

На этом реализация карусели завершена, демо, которое я здесь написал, просто записывает данные в компонент, обычно данные должны быть получены асинхронно.

На самом деле тут другая проблема, это добавить событие клика в swiper-slide.Вообще говоря, событие onClick добавляется напрямую в div swiper-slide, но здесь возникает проблема.Если эту карусель можно зациклить При трансляции swiper автоматически генерирует два узла, один из которых является первым узлом, а другой — последним узлом, которые размещаются в конце и в начале соответственно, что удобно для карусельной связи. Однако, когда он копирует узел, он не может скопировать событие щелчка своего onClick, что приводит к тому, что при инициализации swiper сдвиньте первый влево и сдвиньте вправо к последнему, а затем снова сдвиньте, есть нет события щелчка для этих двух узлов. Итак, мы должны использовать функцию обратного вызова swiper.Давайте трансформируем метод построения swiper.

this.swiper = new Swiper(this.refs.lun, {
             loop:true,
             pagination: {
             el: '.swiper-pagination',
             clickable: true,
             onClick: function(swiper,e){

            var paginationContainer= document.getElementById('PgFather');
            var paginationFather = document.getElementById('body-left-pagination');
//这里是判断是否点击的轮播底部圆点,因为方法在点击圆点的时候也会触发,所以为了能保证点击圆点轮播效果,应该将其屏蔽掉
            if(!this.isDOMContains(paginationFather,e.target,paginationContainer)){
              var se = document.querySelectorAll(".body-left-lunbo .swiper-slide");
              var nowNode = "";
              var index = swiper.activeIndex;

              if(index==0){
                index =  se.length-3;
              }else if(index==se.length-1){
                index=0;
              }else{
                index = swiper.activeIndex-1;
              }


              if(self.state.swiperList.length===1){
                nowNode = se[0];
              }else{
                for(var i=0;i<se.length;i++){
                  if(se[i].getAttribute('data-swiper-slide-index')==index){
                    nowNode = se[i]
                  }
                }
              }
              if(nowNode){
                var id= nowNode.getAttribute("data-id");
                var itemObj = {
                  id:id
                }
                goDetail(itemObj,self.state.myName)
                return true
              }
            }else{
              return false
            }
        }
            },
          });

С помощью вышеуказанного метода можно реализовать событие щелчка swiper. Я добавил условие к приведенному выше коду, что когда есть только один узел карусели swiper, щелчок недействителен.В ответ на эту ситуацию, судите в методе.Если есть только один узел, напрямую назначьте узел 0 для nowNode, то есть Могу.

Есть суждение о том, является ли щелчок точкой нижнего круга, я опубликую его ниже для вашего ознакомления.

isDOMContains:function(parentEle,ele,container){
    console.log(parentEle)
    //判断一个节点是否是其子节点
  //parentEle: 要判断节点的父级节点
  //ele:要判断的子节点
  //container : 二者的父级节点

  //如果parentEle h和ele传的值一样,那么两个节点相同
  if(parentEle == ele){
    return true
  }
  if(!ele || !ele.nodeType || ele.nodeType != 1){
    return false;
  }
  //如果浏览器支持contains
  if(parentEle.contains){
    return parentEle.contains(ele)
  }
  //火狐支持
  if(parentEle.compareDocumentPosition){
    return !!(parentEle.compareDocumentPosition(ele)&16);
  }

  //获取ele的父节点
  var parEle = ele.parentNode;
  while(parEle && parEle != container){
    if(parEle == parentEle){
      return true;
    }
    parEle = parEle.parentNode;
  }
  return false;
}