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...
    肇東周閱讀 12,257評論 4 61
  • 水光瀲滟晴方好 山色空濛雨亦奇 欲把西湖比西子 淡妝濃抹總相宜 中國人對于山水 總是有些道不明的情節 陶淵明說 采...
    丶足跡閱讀 190評論 0 0
  • 有一句話叫做:聽過那么多道理,卻仍然過不好這一生。我便是那個讀了很多書,卻依然養不好孩子的人。我雄心勃勃地想從書里...
    閑人景致閱讀 234評論 0 1
  • 不得不承認,這是一個共享的時代,共享資源,共享網絡,共享知識……2016年底,共享單車在國內火爆起來,于是,共享經...
    互吾閱讀 1,844評論 0 0
  • 風中, 月下, 伸出手, 柳梢在指尖摩挲, 它是懂我 么?
    是非心閱讀 181評論 0 0