React完成一个图片轮播组件

欲实现的图片轮播组件的功能:
1.图片组件分为中图和小图两个部分;中图和小图图片宽度可定制化;
2.中图部分:

  • 点击向左或者向右箭头能切换图片(非循环轮播),同时小图对应的图片高亮显示;
  • 由于是非循环轮播,所以第一张中图和最后一张中图向左向右箭头分别不可见;
  • 中图右下角展示图片进度(例:10/19)

3.小图部分:

  • 点击小图部分的向左向右箭头可切换小图的分页;
  • 同样,小图第一页和最后一页,向左和向右箭头不可见;
  • 点击小图,大图能切换到对应的图片;
slide.jpg

使用React实现上述功能,首先,划分组件:

<SlideMS>
 <SlideM/>
 <SlideS/>
<SlideMS/>

组件SlideM代表中图组件,其始终维护一个state: currentMIndex,即当前的中图图片的index值。
组件SlideS代表小图组件,要维护两个state: currentSIndex,currentSPage, 即当前的小图图片的index值和小图当前的页数;

外层组件SlideMS 接受几个参数作为props:

<SlideMS 
    mediumImageArr={mediumImageArr}
    eachMediumImgWidth = {616}
    smallImageArr={smallImageArr} 
    eachSmallImgWidth = {82}
/>, document.getElementById('js-img-slide'));

SlideM、SlideS再从SlideMS中获取参数进行内部渲染。

<SlideM 
    mediumImageArr={mediumImageArr}
    currentMIndex={currentMIndex}
    eachMediumImgWidth = {eachMediumImgWidth}
    callback={(index)=>{self.setSmallIndex(index)}}
 />
<SlideS
      smallImageArr={smallImageArr}
      currentSIndex={currentSIndex}
      eachSmallImgWidth={eachSmallImgWidth}
      eachMediumImgWidth = {eachMediumImgWidth}
      callback={(index)=>{self.setMediumIndex(index)}}
/>

当点击中图的切换按钮时,计算图片偏移量,然后将新的currentMIndex传递给父组件,父组件setState通知两个子组件currentMIndex发生了改变;

小图组件中涉及的计算比较多,可以将这些抽成方法,例如:根据给定的中图宽度计算一页有几张小图、计算小图总页数、根据给定的index值判断小图处于当前哪一页等。

当点击小图组件的左右箭头时,计算图片的偏移量(首先计算一张中图里有几张小图),然后setState修改小图currentSPage的值。父组件setState通知两个子组件currentMIndex发生了改变;

中图、小图组件分别在componentWillReceiveProps 里接收到了新的值的改变后,重新setState,更新组件内部的state,就实现了两者之间的通信。

以上是实现的一个思路。在实际应用中,场景会复杂一些,例如,第一张图片可能存在播放视频的需求,还有当点击中图图片时,能切换到大图模式,大图模式下能正常轮播,并且在关闭大图模式时,中图和小图自动定位到刚才最后一张浏览的图片。这时会涉及稍微复杂一些的运算,需要在此基础上做一下兼容。

非常尴尬的一点:图片轮播时的动画效果,依旧使用了jquery的animate. 😂 不过这里是为了兼容IE8,如果无需兼容低版本浏览器,可以使用CSS3来完成这里的动画啦~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,225评论 4 61
  • 水光潋滟晴方好 山色空濛雨亦奇 欲把西湖比西子 淡妆浓抹总相宜 中国人对于山水 总是有些道不明的情节 陶渊明说 采...
    丶足迹阅读 1,280评论 0 0
  • 有一句话叫做:听过那么多道理,却仍然过不好这一生。我便是那个读了很多书,却依然养不好孩子的人。我雄心勃勃地想从书里...
    闲人景致阅读 1,638评论 0 1
  • 不得不承认,这是一个共享的时代,共享资源,共享网络,共享知识……2016年底,共享单车在国内火爆起来,于是,共享经...
    互吾阅读 5,842评论 0 0
  • 风中, 月下, 伸出手, 柳梢在指尖摩挲, 它是懂我 么?
    是非心阅读 1,215评论 0 0