狗屎一樣的React(第四節(jié),首頁banner圖輪播)

這一節(jié),我們來看一個banner圖輪播,banner圖輪播是一個比較常用的需求,而且?guī)缀趺總€網(wǎng)站,每個app都會有一個banner圖輪播的效果,也不知道是誰創(chuàng)造出來的。

1、banner圖一般都是從文件服務(wù)器獲取的,也就是需要發(fā)請求獲取數(shù)據(jù),需要發(fā)ajax請求,這里我們需要使用jquery,當然,你也可以寫個原生的HTTPRequest那個原生寫法。

繼續(xù)打開小黑窗,輸入npm install jquery --save-dev,

等下載成功后,看一眼“node_modules”文件夾下,是不是已經(jīng)有“jquery”這個文件夾了,如果有了那么我們就可以在項目中使用jquery的相應(yīng)功能了,如果還沒有說明沒有下載成功

2、我加上我寫的樣式,仍然是寫到demo.css中了

.banner{position:relative;}

ul{list-style:none;height:150px;overflow:hidden;width:100%;padding:0;margin:0;}

ul li{width:100%;height:150px;opacity:0;z-index:0;display:block;position:absolute;}

.li_show{

display:block;

animation:litoshow 2s 1;

animation-fill-mode: forwards;

-webkit-animation:litoshow 2s 1;

-webkit-animation-fill-mode: forwards;

}

@keyframes litoshow{

0% {display:none;}

100% {display:block;opacity:1;z-index:1;}

}

@-webkit-keyframes litoshow{

0% {display:none;}

100% {display:block;opacity:1;z-index:1;}

}

ul li img{width:100%;height:150px;}

.ban_btn{position:absolute;top:60px;width:100%;}

.ban_btn>div{width:35px;height:35px;background:#0863BC;border-radius:5px;text-align:center;line-height:35px;font-size:20px;color:#FFF;z-index:2;}

.ban_btn>div:nth-child(1){position:relative;}

.ban_btn>div:nth-child(2){float:right;position:relative;top:-36px;}

這里面我們著重看li_show這個類,先記下來,后面會用到,這里可以看出是給一個css類添加了css3 animation動畫即可

3、index.js中

引入我們第一步下載的jquery

代碼:import $ from 'jquery';

4、首頁組件包裝,繼續(xù)修改index.js:

var SiteIndex = React.createClass({

render: function(){

return (

);

}

});

AppTop我們認識,是上一節(jié)說過的頂部欄,現(xiàn)在多添加了一個BannaerSwipe組件

5、index.js中添加BannaerSwipe組件實現(xiàn):

var BnanerSwipe = React.createClass({

getInitialState: function() {

return {

"bd": [],

"length": 0,

"index": 0

};

},

componentDidMount: function () {

$.post('http://www.xxx.com/prd/api/bannerPage', {},

function (data) {

this.setState({

bd: data["data"]["homeCarouselList"],

length: data["data"]["homeCarouselList"].length

});

}.bind(this));

},

prevImg: function(){

var index = this.state.index, l = this.state.length;

index--;

index = (index==-1) ? (l - 1) : index;

this.setState({"index":index}, () => this.state.index = index);

},

nextImg: function(){

var index = this.state.index, l = this.state.length;

index++;

index = (index==4) ? 0 : index;

this.setState({"index":index}, () => this.state.index = index);

},

render: function(){

var bannerImg = this.state.bd, index = this.state.index;

if(bannerImg.length == 0){

return false;

}

return (

《div className="banner"》《/div》

《ul》

{bannerImg.map(function(v, k){

return (

《li key={k} className={index==k ? "li_show" : ""}》

《img src={v.imageUrl}/》

《/li》

);

})}

《div className="ban_btn"》

《div onClick={this.prevImg}》←《/div》

《div onClick={this.nextImg}》→《/div》

《/div》

《/div》

);

}

});

注意:因為這里不讓輸入html標簽,所以我把標簽都改成《》了,小伙伴們用的時候改成html標簽即可

    getInitialState這個方法是初始化定義組件中需要的一些配置變量,db是用來預(yù)備存放banner圖數(shù)據(jù)的,length用來預(yù)備存放banner圖的個數(shù),index是用來標記當前banner圖顯示索引;

    componentDidMount這個方法是準備數(shù)據(jù)的,里面我們放了一個jquery的ajax用來請求數(shù)據(jù),然后使用this.setState方法更改初始化的預(yù)存變量來為我們后續(xù)使用;

    prevImgnextImg這兩個事件后面可以找到調(diào)用事件的地方,就是onClick,這個沒有問題唄,但this.setState這個方法中,我們除了給組件的satate賦值,還添加了第二個函數(shù) () => ,這個因為this.setState方法有異步性,第一次賦值不能及時掛到組件的state上,需要添加個回調(diào)函數(shù),這樣我們set的屬性值就可以及時被我們使用啦;

    render這個方法中,bannerImg是我們請求到的圖片數(shù)據(jù),通過map來遍歷顯示,看到map你能想到for循環(huán)就可以了,然后你去看一下es6的map方法的使用,react的map遍歷,你可以看見,我們給li加了key屬性,這個是必須要的,也沒什么實際意義,就是為了區(qū)分每條數(shù)據(jù),然后根據(jù)當前索引值來判斷給哪一個li添加li_show樣式,然后我們在第1條中說過li_show這個樣式,其實就是一個小的css3顯示效果,通過這樣一個過程達到banner圖循環(huán)顯示的效果。

    其實我們這個插件并非輪播,但現(xiàn)在互聯(lián)網(wǎng)上這種隱藏淡入的方式也挺流行的,所以我就順手做了一個淡入淡出的banner圖展示,你如果看明白了這個,輪播的效果幾乎也挺好實現(xiàn)的。

    6、banner圖效果如圖:

    因為請求的banner圖可能會有盜圖嫌疑,所以我涂鴉了,你能看清這是個banner圖就可以了,然后有左右兩個控制按鈕。

    7、banner圖效果實現(xiàn)出來了,從這個簡單的例子其實我們就可以看出React組件的大概生命周期了,下一節(jié)我們通過這個例子說一下生命周期的問題,喜歡的小伙伴請關(guān)注下一節(jié):狗屎一樣的React(第五節(jié),React組件的生命周期)

    最后編輯于
    ?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
    【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
    平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

    相關(guān)閱讀更多精彩內(nèi)容

    • 1.JQuery 基礎(chǔ) 改變web開發(fā)人員創(chuàng)造搞交互性界面的方式。設(shè)計者無需花費時間糾纏JS復(fù)雜的高級特性。 1....
      LaBaby_閱讀 1,272評論 0 1
    • 1.JQuery 基礎(chǔ) 改變web開發(fā)人員創(chuàng)造搞交互性界面的方式。設(shè)計者無需花費時間糾纏JS復(fù)雜的高級特性。 1....
      LaBaby_閱讀 1,501評論 0 2
    • GUIDS 第一章 為什么使用React? React 一個提供了用戶接口的JavaScript庫。 誕生于Fac...
      jplyue閱讀 3,704評論 1 11
    • “你未看此花時,此花與汝同歸于寂;你來看此花時,則此花顏色一時明白起來,便知此花不在你的心外?!薄赌克汀?/div>
      小卐卍閱讀 201評論 0 0
    • 今天真的是沒時間寫。。。抱歉抱歉。。。明天可以多寫一點。。。
      專職愛人alan閱讀 188評論 0 0

    友情鏈接更多精彩內(nèi)容