react 引入轮播插件_react中使用swiper的具体方法

本文介绍了如何在React项目中引入并使用Swiper3x系列的轮播插件,包括在`index.html`中引入JS和CSS文件,以及在React组件中调用和设置轮播功能。特别地,文章讨论了如何处理轮播滑动事件,特别是当轮播图可以循环播放时,如何解决复制节点导致的点击事件丢失问题。同时提供了一个用于判断是否点击了底部圆点的辅助函数。
摘要由CSDN通过智能技术生成

正文

最近的react项目需要使用轮播图,自然而然的就想到了swiper,一直想通过npm安装的方式来使用,但是网上找了很多,资料很少,于是就暂时通过在index.html里直接引用swiper的js和css文件的方式来加载,下面来说一下具体的步骤和使用方法。

首先说一下我这里使用的是swiper3x系列。接下来说具体的步骤:

在index.html中引入js和css文件

React App

当然,我这个是将js和css文件下载到了本地,你也可以使用cdn路径,至此,引入基本上算是引入完成了,接下来就是如何在react组件中进行调用

在这里需要说一下,引入的js文件在组件当中不能直接使用,需要在最开始的位置声明一个变量,后续的使用方法和普通的html写法就一致了,区别就在于应该在哪个生命周期中写,个人建议实在componentDidUpdate周期中进行写,因为有时候数据是异步获取的,刚刚完成时不一定数据获取完成,数据获取完成以后更新state,此时会触发update周期。

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 (

Slide 1
Slide 2
Slide 3
Slide 4
Slide 5
Slide 6
Slide 7
Slide 8
Slide 9
Slide 10

)

}

}

export default About

如此便完成了一个轮播的实现,这里我写的demo只是将数据写死在了组件里,一般情况应该是通过异步来进行获取数据。

其实,这里还有一个问题,就在于给swiper-slide添加点击事件,一般来说是直接给swiper-slide这个div添加一个onClick事件,但是问题就出现在了这里,若这个轮播是可以循环轮播的话,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

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;

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值