狗屎一样的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 (
<div>
<AppTop word="首页"/>
<BnanerSwipe />
</div>
);

}
});

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},
render: function(){
var bannerImg = this.state.bd,index = this.state.index;
if(bannerImg.length == 0){
return false;
}
return (
<div className="banner">
<ul>
{bannerImg.map(function(v,k){
return (
<li key={k} className={index==k ? "li_show" : ""}>
<img src={v.imageUrl} />
</li>
);
})}
</ul>
<div className="ban_btn">
<div onClick={this.prevImg}>←</div>
<div onClick={this.nextImg}>→</div>
</div>
</div>
);
}
});

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组件的生命周期)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom