Tabs(頁面導航)

2024-01-25 13:20 更新

當頁面信息較多時,為了讓用戶能夠聚焦于當前顯示的內容,需要對頁面內容進行分類,提高頁面空間利用率。Tabs組件可以在一個頁面內快速實現視圖內容的切換,一方面提升查找信息的效率,另一方面精簡用戶單次獲取到的信息量。

基本布局

Tabs組件的頁面組成包含兩個部分,分別是TabContent和TabBar。TabContent是內容頁,TabBar是導航頁簽欄,頁面結構如下圖所示,根據不同的導航類型,布局會有區(qū)別,可以分為底部導航、頂部導航、側邊導航,其導航欄分別位于底部、頂部和側邊。
圖1 Tabs組件布局示意圖
說明
  • TabContent組件不支持設置通用寬度屬性,其寬度默認撐滿Tabs父組件。
  • TabContent組件不支持設置通用高度屬性,其高度由Tabs父組件高度與TabBar組件高度決定。

Tabs使用花括號包裹TabContent,如圖2,其中TabContent顯示相應的內容頁。

圖2 Tabs與TabContent使用

每一個TabContent對應的內容需要有一個頁簽,可以通過TabContent的tabBar屬性進行配置。在如下TabContent組件上設置屬性tabBar,可以設置其對應頁簽中的內容,tabBar作為內容的頁簽。

  1. TabContent() {
  2. Text('首頁的內容').fontSize(30)
  3. }
  4. .tabBar('首頁')

設置多個內容時,需在Tabs內按照順序放置。

  1. Tabs() {
  2. TabContent() {
  3. Text('首頁的內容').fontSize(30)
  4. }
  5. .tabBar('首頁')
  6. TabContent() {
  7. Text('推薦的內容').fontSize(30)
  8. }
  9. .tabBar('推薦')
  10. TabContent() {
  11. Text('發(fā)現的內容').fontSize(30)
  12. }
  13. .tabBar('發(fā)現')
  14. TabContent() {
  15. Text('我的內容').fontSize(30)
  16. }
  17. .tabBar("我的")
  18. }

底部導航

底部導航是應用中最常見的一種導航方式。底部導航位于應用一級頁面的底部,用戶打開應用,能夠分清整個應用的功能分類,以及頁簽對應的內容,并且其位于底部更加方便用戶單手操作。底部導航一般作為應用的主導航形式存在,其作用是將用戶關心的內容按照功能進行分類,迎合用戶使用習慣,方便在不同模塊間的內容切換。

圖3 底部導航欄

導航欄位置使用Tabs的參數barPosition進行設置,默認情況下,導航欄位于頂部,參數默認值為Start。設置為底部導航需要在Tabs傳遞參數,設置barPosition為End。

  1. Tabs({ barPosition: BarPosition.End }) {
  2. // TabContent的內容:首頁、發(fā)現、推薦、我的
  3. ...
  4. }

頂部導航

當內容分類較多,用戶對不同內容的瀏覽概率相差不大,需要經??焖偾袚Q時,一般采用頂部導航模式進行設計,作為對底部導航內容的進一步劃分,常見一些資訊類應用對內容的分類為關注、視頻、數碼,或者手機的主題應用中對主題進行進一步劃分為圖片、視頻、字體等。

圖4 頂部導航欄

Tabs組件默認的barPosition參數為Start,即頂部導航模式。

  1. Tabs({ barPosition: BarPosition.Start }) {
  2. // TabContent的內容:關注、視頻、游戲、數碼、科技、體育、影視
  3. ...
  4. }

側邊導航

側邊導航是手機應用較為少見的一種導航模式,更多適用于平板橫屏界面,用于對應用進行導航操作,由于用戶的視覺習慣是從左到右,側邊導航欄默認為左側側邊欄。

圖5 側邊導航欄

實現側邊導航欄需要設置Tabs的屬性vertical為true。在底部導航和頂部導航實現中,其默認值為false,表明內容頁和導航欄垂直方向排列。

  1. Tabs({ barPosition: BarPosition.Start }) {
  2. // TabContent的內容:首頁、發(fā)現、推薦、我的
  3. ...
  4. }
  5. .vertical(true)
  6. .barWidth(100)
  7. .barHeight(200)
說明
  • vertical為false時,tabbar寬度會默認撐滿屏幕的寬度,需要設置barWidth為合適值。
  • vertical為true時,tabbar的高度會默認實際內容高度,需要設置barHeight為合適值。

限制導航欄的滑動切換

默認情況下,導航欄都支持滑動切換,在一些內容信息量需要進行多級分類的頁面,如支持底部導航+頂部導航組合的情況下,底部導航欄的滑動效果與頂部導航出現沖突,此時需要限制底部導航的滑動,避免引起不好的用戶體驗。
圖6 限制底部導航欄滑動

控制滑動切換的屬性為scrollable,默認值為true,表示可以滑動,若要限制滑動切換頁簽則需要設置為false。

  1. Tabs({ barPosition: BarPosition.End }) {
  2. TabContent(){
  3. Column(){
  4. Tabs(){
  5. // 頂部導航欄內容
  6. ...
  7. }
  8. }
  9. .backgroundColor('#ff08a8f1')
  10. .width('100%')
  11. }
  12. .tabBar('首頁')
  13. // 其他TabContent內容:發(fā)現、推薦、我的
  14. ...
  15. }
  16. .scrollable(false)

固定導航欄

當內容分類較為固定且不具有拓展性時,例如底部導航內容分類一般固定,分類數量一般在3-5個,此時使用固定導航欄。固定導航欄不可滾動,無法被拖拽滾動,內容均分tabBar的寬度。

圖7 固定導航欄

Tabs的屬性barMode是控制導航欄是否可以滾動,默認值為Fixed。

  1. Tabs({ barPosition: BarPosition.End }) {
  2. // TabContent的內容:首頁、發(fā)現、推薦、我的
  3. ...
  4. }
  5. .barMode(BarMode.Fixed)

滾動導航欄

滾動導航欄可以用于頂部導航欄或者側邊導航欄的設置,內容分類較多,屏幕寬度無法容納所有分類頁簽的情況下,需要使用可滾動的導航欄,支持用戶點擊和滑動來加載隱藏的頁簽內容。

圖8 可滾動導航欄

滾動導航欄需要設置Tabs組件的barMode屬性,默認情況下其值為Fixed,表示為固定導航欄,設置為Scrollable即可設置為可滾動導航欄。

  1. Tabs({ barPosition: BarPosition.Start }) {
  2. // TabContent的內容:關注、視頻、游戲、數碼、科技、體育、影視、人文、藝術、自然、軍事
  3. ...
  4. }
  5. .barMode(BarMode.Scrollable)

自定義導航欄

對于底部導航欄,一般作為應用主頁面功能區(qū)分,為了更好的用戶體驗,會組合文字以及對應語義圖標表示頁簽內容,這種情況下,需要自定義導航頁簽的樣式。

圖9 自定義導航欄圖

系統(tǒng)默認情況下采用了下劃線標志當前活躍的頁簽,而自定義導航欄需要自行實現相應的樣式,用于區(qū)分當前活躍頁簽和未活躍頁簽。

設置自定義導航欄需要使用tabBar的參數,以其支持的CustomBuilder的方式傳入自定義的函數組件樣式。例如這里聲明TabBuilder的自定義函數組件,傳入參數包括頁簽文字title,對應位置index,以及選中狀態(tài)和未選中狀態(tài)的圖片資源。通過當前活躍的currentIndex和頁簽對應的targetIndex匹配與否,決定UI顯示的樣式。

  1. @Builder TabBuilder(title: string, targetIndex: number, selectedImg: Resource, normalImg: Resource) {
  2. Column() {
  3. Image(this.currentIndex === targetIndex ? selectedImg : normalImg)
  4. .size({ width: 25, height: 25 })
  5. Text(title)
  6. .fontColor(this.currentIndex === targetIndex ? '#1698CE' : '#6B6B6B')
  7. }
  8. .width('100%')
  9. .height(50)
  10. .justifyContent(FlexAlign.Center)
  11. }

在TabContent對應tabBar屬性中傳入自定義函數組件,并傳遞相應的參數。

  1. TabContent() {
  2. Column(){
  3. Text('我的內容')
  4. }
  5. .width('100%')
  6. .height('100%')
  7. .backgroundColor('#007DFF')
  8. }
  9. .tabBar(this.TabBuilder('我的', 0, $r('app.media.mine_selected'), $r('app.media.mine_normal')))

切換至指定頁簽

在不使用自定義導航欄時,系統(tǒng)默認的Tabs會實現切換邏輯。在使用了自定義導航欄后,切換頁簽的邏輯需要手動實現。即用戶點擊對應頁簽時,屏幕需要顯示相應的內容頁。

圖10 使用自定義導航欄實現切換指定頁簽

切換指定頁簽需要使用TabsController,TabsController是Tabs組件的控制器,用于控制Tabs組件進行頁簽切換。通過TabsController的changeIndex方法來實現跳轉至指定索引值對應的TabContent內容。

  1. private tabsController : TabsController = new TabsController()
  2. @State currentIndex:number = 0;
  3. @Builder TabBuilder(title: string, targetIndex: number) {
  4. Column() {
  5. Text(title)
  6. .fontColor(this.currentIndex === targetIndex ? '#1698CE' : '#6B6B6B')
  7. }
  8. ...
  9. .onClick(() => {
  10. this.currentIndex = targetIndex;
  11. this.tabsController.changeIndex(this.currentIndex);
  12. })
  13. }

使用自定義導航欄時,在tabBar屬性中傳入對應的@Builder,并傳入相應的參數。

  1. Tabs({ barPosition: BarPosition.End, controller: this.tabsController }) {
  2. TabContent(){
  3. ...
  4. }.tabBar(this.TabBuilder('首頁',0))
  5. TabContent(){
  6. ...
  7. }.tabBar(this.TabBuilder('發(fā)現',1))
  8. TabContent(){
  9. ...
  10. }.tabBar(this.TabBuilder('推薦',2))
  11. TabContent(){
  12. ...
  13. }
  14. .tabBar(this.TabBuilder('我的',3))
  15. }

滑動切換導航欄

在不使用自定義導航欄的情況下,Tabs默認會實現tabBar與TabContent的切換聯(lián)動。但在使用了自定義導航欄后,使用TabsController可以實現點擊頁簽與頁面內容的聯(lián)動,但不能實現滑動頁面時,頁面內容對應頁簽的聯(lián)動。即用戶在使用滑動屏幕切換頁面內容時,頁簽欄需要同步切換至內容對應的頁簽。

圖11 滑動切換時頁簽內容不聯(lián)動

此時需要使用Tabs提供的onChange事件方法,監(jiān)聽索引index的變化,并將其當前活躍的index值傳遞給currentIndex,實現頁簽內容的切換。

  1. Tabs({ barPosition: BarPosition.End, controller: this.tabsController }) {
  2. TabContent() {
  3. ...
  4. }.tabBar(this.TabBuilder('首頁', 0))
  5. TabContent() {
  6. ...
  7. }.tabBar(this.TabBuilder('發(fā)現', 1))
  8. TabContent() {
  9. ...
  10. }.tabBar(this.TabBuilder('推薦', 2))
  11. TabContent() {
  12. ...
  13. }
  14. .tabBar(this.TabBuilder('我的', 3))
  15. }.onChange((index) => {
  16. this.currentIndex = index
  17. })
圖12 內容與頁簽聯(lián)動
以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號