狗屎一样的React(第四节,首页banner图轮播)

这一节,我们来看一个banner图轮播,banner图轮播是一个比较常用的需求,而且几乎每个网站,每个app都会有一个banner图轮播的效果,也不知道是谁创造出来的。

1、banner图一般都是从文件服务器获取的,也就是需要发请求获取数据,需要发ajax请求,这里我们需要使用jquery,当然,你也可以写个原生的HTTPRequest那个原生写法。

继续打开小黑窗,输入npm install jquery --save-dev,

等下载成功后,看一眼“node_modules”文件夹下,是不是已经有“jquery”这个文件夹了,如果有了那么我们就可以在项目中使用jquery的相应功能了,如果还没有说明没有下载成功

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、首页组件包装,继续修改index.js:

var SiteIndex = React.createClass({

render: function(){

return (

);

}

});

AppTop我们认识,是上一节说过的顶部栏,现在多添加了一个BannaerSwipe组件

5、index.js中添加BannaerSwipe组件实现:

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是用来预备存放banner图数据的,length用来预备存放banner图的个数,index是用来标记当前banner图显示索引;

    componentDidMount这个方法是准备数据的,里面我们放了一个jquery的ajax用来请求数据,然后使用this.setState方法更改初始化的预存变量来为我们后续使用;

    prevImgnextImg这两个事件后面可以找到调用事件的地方,就是onClick,这个没有问题呗,但this.setState这个方法中,我们除了给组件的satate赋值,还添加了第二个函数 () => ,这个因为this.setState方法有异步性,第一次赋值不能及时挂到组件的state上,需要添加个回调函数,这样我们set的属性值就可以及时被我们使用啦;

    render这个方法中,bannerImg是我们请求到的图片数据,通过map来遍历显示,看到map你能想到for循环就可以了,然后你去看一下es6的map方法的使用,react的map遍历,你可以看见,我们给li加了key属性,这个是必须要的,也没什么实际意义,就是为了区分每条数据,然后根据当前索引值来判断给哪一个li添加li_show样式,然后我们在第1条中说过li_show这个样式,其实就是一个小的css3显示效果,通过这样一个过程达到banner图循环显示的效果。

    其实我们这个插件并非轮播,但现在互联网上这种隐藏淡入的方式也挺流行的,所以我就顺手做了一个淡入淡出的banner图展示,你如果看明白了这个,轮播的效果几乎也挺好实现的。

    6、banner图效果如图:

    因为请求的banner图可能会有盗图嫌疑,所以我涂鸦了,你能看清这是个banner图就可以了,然后有左右两个控制按钮。

    7、banner图效果实现出来了,从这个简单的例子其实我们就可以看出React组件的大概生命周期了,下一节我们通过这个例子说一下生命周期的问题,喜欢的小伙伴请关注下一节:狗屎一样的React(第五节,React组件的生命周期)

    最后编辑于
    ©著作权归作者所有,转载或内容合作请联系作者
    • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
      沈念sama阅读 205,033评论 6 478
    • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
      沈念sama阅读 87,725评论 2 381
    • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
      开封第一讲书人阅读 151,473评论 0 338
    • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
      开封第一讲书人阅读 54,846评论 1 277
    • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
      茶点故事阅读 63,848评论 5 368
    • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
      开封第一讲书人阅读 48,691评论 1 282
    • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
      沈念sama阅读 38,053评论 3 399
    • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
      开封第一讲书人阅读 36,700评论 0 258
    • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
      沈念sama阅读 42,856评论 1 300
    • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
      茶点故事阅读 35,676评论 2 323
    • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
      茶点故事阅读 37,787评论 1 333
    • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
      沈念sama阅读 33,430评论 4 321
    • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
      茶点故事阅读 39,034评论 3 307
    • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
      开封第一讲书人阅读 29,990评论 0 19
    • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
      开封第一讲书人阅读 31,218评论 1 260
    • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
      沈念sama阅读 45,174评论 2 352
    • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
      茶点故事阅读 42,526评论 2 343

    推荐阅读更多精彩内容

    • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
      LaBaby_阅读 1,162评论 0 1
    • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
      LaBaby_阅读 1,321评论 0 2
    • GUIDS 第一章 为什么使用React? React 一个提供了用户接口的JavaScript库。 诞生于Fac...
      jplyue阅读 3,515评论 1 11
    • “你未看此花时,此花与汝同归于寂;你来看此花时,则此花颜色一时明白起来,便知此花不在你的心外。”——《目送》
      小卐卍阅读 171评论 0 0
    • 今天真的是没时间写。。。抱歉抱歉。。。明天可以多写一点。。。
      专职爱人alan阅读 159评论 0 0