ts-container-tabs.md 5.4 KB
Newer Older
Z
zengyawen 已提交
1 2
# Tabs

E
ester.zhou 已提交
3
The **\<Tabs>** component is a container component that allows users to switch between content views through tabs. Each tab page corresponds to a content view.
Z
zengyawen 已提交
4

E
ester.zhou 已提交
5
>  **NOTE**<br>
E
ester.zhou 已提交
6
>
E
ester.zhou 已提交
7
>  This component is supported since API version 7. Updates will be marked with a superscript to indicate their earliest API version.
Z
zengyawen 已提交
8

Z
zengyawen 已提交
9

E
esterzhou 已提交
10
## Child Components
Z
zengyawen 已提交
11

E
ester.zhou 已提交
12
Only the [\<TabContent>](ts-container-tabcontent.md) child component is supported.
Z
zengyawen 已提交
13 14 15 16


## APIs

E
ester.zhou 已提交
17
Tabs(value?: {barPosition?: BarPosition, index?: number, controller?: [TabsController](#tabscontroller)})
Z
zengyawen 已提交
18

E
ester.zhou 已提交
19
**Parameters**
Z
zengyawen 已提交
20

E
ester.zhou 已提交
21 22
| Name| Type| Mandatory| Description|
| -------- | -------- | -------- | -------- |
E
ester.zhou 已提交
23
| barPosition | BarPosition | No| Position of the **\<Tabs>** component.<br>Default value: **BarPosition.Start**|
E
ester.zhou 已提交
24 25 26 27 28 29 30 31 32
| index | number | No| Initial tab index.<br>Default value: **0**|
| controller | [TabsController](#tabscontroller) | No| Tab controller.|

## BarPosition

| Name| Description|
| -------- | -------- |
| Start | If the **vertical** attribute is set to **true**, the tab is on the left of the container. If the **vertical** attribute is set to **false**, the tab is on the top of the container.|
| End | If the **vertical** attribute is set to **true**, the tab is on the right of the container. If the **vertical** attribute is set to **false**, the tab is at the bottom of the container.|
Z
zengyawen 已提交
33 34 35


## Attributes
Z
zengyawen 已提交
36

E
ester.zhou 已提交
37
In addition to the [universal attributes](ts-universal-attributes-size.md), the following attributes are supported.
Z
zengyawen 已提交
38

E
ester.zhou 已提交
39 40 41 42 43
| Name| Type| Description|
| -------- | -------- | -------- |
| vertical          | boolean | Whether to use vertical tabs. The value **true** means to use vertical tabs, and **false** means to use horizontal tabs.<br>Default value: **false**|
| scrollable        | boolean | Whether the tabs are scrollable. The value **true** means that the tabs are scrollable, and **false** means the opposite.<br>Default value: **true**|
| barMode           | BarMode | Tab bar layout mode. For details, see **BarMode**.<br>Default value: **BarMode.Fixed**|
E
ester.zhou 已提交
44 45
| barWidth          | number \| Length<sup>8+</sup>  | Width of the tab bar.    |
| barHeight         | number \| Length<sup>8+</sup>  | Height of the tab bar.    |
E
ester.zhou 已提交
46
| animationDuration | number | Duration of the slide animation for tab switching. If this parameter is set, the tab switching animation is played when the user switches between tabs by sliding or clicking. If this parameter is not set, the tab switching animation is played only when the user switches between tabs by sliding.<br>Default value: **200**|
Z
zengyawen 已提交
47

E
ester.zhou 已提交
48
## BarMode
Z
zengyawen 已提交
49

E
ester.zhou 已提交
50 51
| Name| Description|
| -------- | -------- |
E
ester.zhou 已提交
52 53
| Scrollable | The width of each tab is determined by the actual layout. The tabs are scrollable in the following case: In horizontal layout, the total width exceeds the tab bar width; in horizontal layout, the total height exceeds the tab bar height.|
| Fixed | The width of each tab is determined by equally dividing the number of tabs by the bar width (or the bar height in vertical layout).|
Z
zengyawen 已提交
54 55 56

## Events

E
ester.zhou 已提交
57
In addition to the [universal events](ts-universal-events-click.md), the following events are supported.
E
ester.zhou 已提交
58 59

| Name| Description|
Z
zengyawen 已提交
60
| -------- | -------- |
E
ester.zhou 已提交
61
| onChange(event: (index: number) =&gt; void) | Event triggered when a tab is switched.|
Z
zengyawen 已提交
62

E
ester.zhou 已提交
63 64
## TabsController

E
ester.zhou 已提交
65
Defines a tab controller, which is used to control switching of tabs. One **TabsController** cannot control multiple **\<Tabs>** components.
E
ester.zhou 已提交
66

E
ester.zhou 已提交
67 68 69 70 71 72 73 74 75 76 77 78 79
### Objects to Import

```
controller: TabsController = new TabsController()

```

### changeIndex

changeIndex(value: number): void

Switches to the specified tab.

E
ester.zhou 已提交
80
**Parameters**
E
ester.zhou 已提交
81

E
ester.zhou 已提交
82 83 84
| Name| Type| Mandatory| Description|
| -------- | -------- | -------- | -------- |
| value | number | Yes| Index of the tab. The value starts from 0.|
Z
zengyawen 已提交
85 86


E
ester.zhou 已提交
87
## Example
Z
zengyawen 已提交
88

E
ester.zhou 已提交
89 90
```ts
// xxx.ets
Z
zengyawen 已提交
91 92 93
@Entry
@Component
struct TabsExample {
E
ester.zhou 已提交
94 95 96
  @State fontColor: string = '#182431'
  @State selectedFontColor: string = '#007DFF'
  @State currentIndex: number = 0
Z
zengyawen 已提交
97 98
  private controller: TabsController = new TabsController()

E
ester.zhou 已提交
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
  @Builder TabBuilder(index: number, name: string) {
    Column() {
      Text(name)
        .fontColor(this.currentIndex === index ? this.selectedFontColor : this.fontColor)
        .fontSize(16)
        .fontWeight(this.currentIndex === index ? 500 : 400)
        .lineHeight(22)
        .margin({ top: 17, bottom: 7 })
      Divider()
        .strokeWidth(2)
        .color('#007DFF')
        .opacity(this.currentIndex === index ? 1 : 0)
    }.width('100%')
  }

Z
zengyawen 已提交
114 115
  build() {
    Column() {
Z
zengyawen 已提交
116
      Tabs({ barPosition: BarPosition.Start, controller: this.controller }) {
Z
zengyawen 已提交
117
        TabContent() {
E
ester.zhou 已提交
118 119
          Column().width('100%').height('100%').backgroundColor('#00CB87')
        }.tabBar(this.TabBuilder(0, 'green'))
Z
zengyawen 已提交
120 121

        TabContent() {
E
ester.zhou 已提交
122 123
          Column().width('100%').height('100%').backgroundColor('#007DFF')
        }.tabBar(this.TabBuilder(1, 'blue'))
Z
zengyawen 已提交
124 125

        TabContent() {
E
ester.zhou 已提交
126 127
          Column().width('100%').height('100%').backgroundColor('#FFBF00')
        }.tabBar(this.TabBuilder(2, 'yellow'))
Z
zengyawen 已提交
128 129

        TabContent() {
E
ester.zhou 已提交
130 131
          Column().width('100%').height('100%').backgroundColor('#E67C92')
        }.tabBar(this.TabBuilder(3, 'pink'))
Z
zengyawen 已提交
132
      }
E
ester.zhou 已提交
133 134 135 136 137
      .vertical(false)
      .barMode(BarMode.Fixed)
      .barWidth(360)
      .barHeight(56)
      .animationDuration(400)
Z
zengyawen 已提交
138
      .onChange((index: number) => {
E
ester.zhou 已提交
139
        this.currentIndex = index
Z
zengyawen 已提交
140
      })
E
ester.zhou 已提交
141 142 143 144 145
      .width(360)
      .height(296)
      .margin({ top: 52 })
      .backgroundColor('#F1F3F5')
    }.width('100%')
Z
zengyawen 已提交
146 147 148 149
  }
}
```

E
ester.zhou 已提交
150
![tabs2](figures/tabs2.gif)