react中使用swiper的具體方法
正文
最近的react項目需要使用輪播圖,自然而然的就想到了swiper,一直想通過npm安裝的方式來使用,但是網(wǎng)上找了很多,資料很少,于是就暫時通過在index.html里直接引用swiper的js和css文件的方式來加載,下面來說一下具體的步驟和使用方法。
首先說一下我這里使用的是swiper3x系列。接下來說具體的步驟:
在index.html中引入js和css文件
<!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" rel="external nofollow" > <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico" rel="external nofollow" > <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>
當(dāng)然,我這個是將js和css文件下載到了本地,你也可以使用cdn路徑,至此,引入基本上算是引入完成了,接下來就是如何在react組件中進行調(diào)用
在這里需要說一下,引入的js文件在組件當(dāng)中不能直接使用,需要在最開始的位置聲明一個變量,后續(xù)的使用方法和普通的html寫法就一致了,區(qū)別就在于應(yīng)該在哪個生命周期中寫,個人建議實在componentDidUpdate周期中進行寫,因為有時候數(shù)據(jù)是異步獲取的,剛剛完成時不一定數(shù)據(jù)獲取完成,數(shù)據(jù)獲取完成以后更新state,此時會觸發(fā)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 (
<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
如此便完成了一個輪播的實現(xiàn),這里我寫的demo只是將數(shù)據(jù)寫死在了組件里,一般情況應(yīng)該是通過異步來進行獲取數(shù)據(jù)。
其實,這里還有一個問題,就在于給swiper-slide添加點擊事件,一般來說是直接給swiper-slide這個div添加一個onClick事件,但是問題就出現(xiàn)在了這里,若這個輪播是可以循環(huán)輪播的話,swiper會自動生成兩個節(jié)點,一個是第一個節(jié)點,一個是最后一個節(jié)點,分別放置于最后和最開始,便于輪播聯(lián)動。然而他復(fù)制節(jié)點的時候,無法復(fù)制其onClick的點擊事件,這就造成了當(dāng)swiper初始化完成以后向左滑動第一個和向右滑動到最后一個再滑一次這兩個節(jié)點是沒有點擊事件的。于是我們就應(yīng)該使用到swiper的回調(diào)函數(shù)了,下面我們對構(gòu)建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');
//這里是判斷是否點擊的輪播底部圓點,因為方法在點擊圓點的時候也會觸發(fā),所以為了能保證點擊圓點輪播效果,應(yīng)該將其屏蔽掉
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
}
}
},
});
通過上面方法就可以實現(xiàn)了swiper的點擊事件。我上面的代碼中補充了一種條件就是當(dāng)swiper輪播節(jié)點只有一個的時候回出現(xiàn)點擊無效的情況,針對這一情況在方法里進行判斷一下,如果只有一個節(jié)點直接將節(jié)點0賦值給nowNode即可。
上面有一個判斷是否點擊的是底部圓的點判斷我在下面貼出來供大家參考
isDOMContains:function(parentEle,ele,container){
console.log(parentEle)
//判斷一個節(jié)點是否是其子節(jié)點
//parentEle: 要判斷節(jié)點的父級節(jié)點
//ele:要判斷的子節(jié)點
//container : 二者的父級節(jié)點
//如果parentEle h和ele傳的值一樣,那么兩個節(jié)點相同
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的父節(jié)點
var parEle = ele.parentNode;
while(parEle && parEle != container){
if(parEle == parentEle){
return true;
}
parEle = parEle.parentNode;
}
return false;
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 詳解React中傳入組件的props改變時更新組件的幾種實現(xiàn)方法
- VSCode配置react開發(fā)環(huán)境的步驟
- react-redux中connect的裝飾器用法@connect詳解
- ReactNative 之FlatList使用及踩坑封裝總結(jié)
- React Native實現(xiàn)簡單的登錄功能(推薦)
- ReactNative之鍵盤Keyboard的彈出與消失示例
- 使用react-router4.0實現(xiàn)重定向和404功能的方法
- react-router browserHistory刷新頁面404問題解決方法
- 詳解React Native開源時間日期選擇器組件(react-native-datetime)
- React useMemo和useCallback的使用場景
相關(guān)文章
React實現(xiàn)動態(tài)調(diào)用的彈框組件
這篇文章主要為大家詳細介紹了React實現(xiàn)動態(tài)調(diào)用的彈框組件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-08-08
react如何使用useRef模仿抖音標題里面添加標簽內(nèi)容
本文介紹了如何模仿抖音發(fā)布頁面,使用div元素作為輸入框,并利用CSS樣式和JavaScript動態(tài)操作DOM,實現(xiàn)類似于input輸入框的功能,感興趣的朋友跟隨小編一起看看吧2024-10-10
淺談React的React.FC與React.Component的使用
本文主要介紹了React的React.FC與React.Component的使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09
react ant-design Select組件下拉框map不顯示的解決
這篇文章主要介紹了react ant-design Select組件下拉框map不顯示的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03
ReactNative錯誤采集原理在Android中實現(xiàn)詳解
這篇文章主要為大家介紹了ReactNative錯誤采集原理在Android中實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02

