因爲ant Tabs組件結構較複雜,共分三部分敘述,本文爲目錄中第三部分(高亮)antd
目錄this
1、組件結構spa
antd代碼結構3d
rc-ant代碼結構blog
一、組件樹狀結構生命週期
二、Context使用說明事件
三、rc-tabs中只在example、test中使用的組件說明思維導圖
2、Tabs關鍵組件功能實現test
一、Tabs(antd)容器
二、RcTabs
三、Sentinel哨兵
四、InkTabBarNode
3、Tabs的滾動效果
ScrollableTabBarNode
ScrollableTabBarNode內容太多,使用多個思惟導圖分別展現,內容較多總結的比較粗糙,部分細節還有疑問
首先,總體結構圖,將ScrollableTabBarNode的方法進行歸類(我的見解)
而後,根據方法內容從基礎到複雜的層次來看,首先看【state方法】和【計算寬度位置的基礎方法】
再次,是主要【功能方法】,tab標籤的滾動效果邏輯大多在這部分
最後,看【事件回調】和【生命週期方法】
在給出總體結構圖以前,先給出tab中組件結構示意圖,其中由nav包裹多個tab,使用左側或頂部偏移控制滾動位置。
滾動狀態下,上一頁、下一頁按鈕在navWrap外的左右或上下兩側
(1)總體結構
(2)state方法
this.state中next與prev兩個值,布爾型,記錄是否顯示上一頁/下一頁按鈕。
setNext、setPrev即爲爲next、prev賦值的方法
(3)計算寬度位置基礎方法
計算寬度和位置時,橫向tab(top、bottom)計算寬度和左側偏移,縱向tab(left、right)計算高度和頂部偏移
下圖中的方法中帶【WH】後綴的爲計算寬度(橫向)、高度(縱向)的方法;
帶有【LT】後綴的爲計算左側(橫向)、右側(縱向)偏移量的方法;
方法中根據當前tab是橫向、縱向自動返回對應的寬度和位置偏移
(4)功能方法
setOffset方法:計算nav的滾動偏移,並賦值,須要時同時設置next和prev是否顯示
setNextPrev方法:計算上一頁、下一頁按鈕是否顯示
上一頁按鈕顯示條件:offset < 0顯示,offset >= 0時不顯示。也就是說nav向左移動的時候能夠往前翻,【上一頁】按鈕顯示,其餘狀況不行,實際上offset最大隻能等於0,不會大於0
下一頁按鈕顯示條件相對複雜:
nav寬度小於外部容器時,只有一頁,不須要顯示,即下圖中 containerWH - navNodeWH >= 0的狀況
nav的寬度大於外部容器,且差值大於offset(注意,offset取值小於等於0)時,說明後面有內容,須要顯示下一頁,即下圖中containerWH - navNodeWH < offset的狀況
nav的寬度大於外部容器,且差值等於offset時,說明所有多的tab全在左側,沒有下一頁美容,不須要顯示,及下圖中containerWH - navNodeWH < 0 && containerWH - navNodeWH = offset
上述三種狀況後,剩下的是nav寬度大於外部容器,且差值小於offset,實際上這種狀況不存在,由於最後一個tab最多隻會貼着外部容器的最右側,不會再向左移動,因此不存在containerWH - navNodeWH < 0 && containerWH - navNodeWH > offset的狀況
(5)事件回調
(6)生命週期方法