• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Tabs
2
3通过页签进行内容视图切换的容器组件,每个页签对应一个内容视图。
4
5>  **说明:**
6>
7>  该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
8
9
10## 子组件
11
12仅可包含子组件[TabContent](ts-container-tabcontent.md)。
13
14
15## 接口
16
17Tabs(value?: {barPosition?: BarPosition, index?: number, controller?: [TabsController](#tabscontroller)})
18
19**参数:**
20
21| 参数名         | 参数类型                              | 必填   | 参数描述                                     |
22| ----------- | --------------------------------- | ---- | ---------------------------------------- |
23| barPosition | BarPosition                       | 否    | 设置Tabs的页签位置。<br/>默认值:BarPosition.Start   |
24| index       | number                            | 否    | 设置初始页签索引。<br/>默认值:0<br/>**说明:** <br/>设置为小于0的值时按默认值显示。<br/>可选值为[0, TabContent子节点数量-1]。<br/>设置不同值时,默认生效切换动效,可以设置animationDuration为0关闭动画。 |
25| controller  | [TabsController](#tabscontroller) | 否    | 设置Tabs控制器。                               |
26
27## BarPosition枚举说明
28
29| 名称    | 描述                                       |
30| ----- | ---------------------------------------- |
31| Start | vertical属性方法设置为true时,页签位于容器左侧;vertical属性方法设置为false时,页签位于容器顶部。 |
32| End   | vertical属性方法设置为true时,页签位于容器右侧;vertical属性方法设置为false时,页签位于容器底部。 |
33
34
35## 属性
36
37除支持[通用属性](ts-universal-attributes-size.md)外,还支持以下属性:
38
39| 名称                | 参数类型                                    | 描述                                       |
40| ----------------- | --------------------------------------- | ---------------------------------------- |
41| vertical          | boolean                                 | 设置为false是为横向Tabs,设置为true时为纵向Tabs。<br/>默认值:false |
42| scrollable        | boolean                                 | 设置为true时可以通过滑动页面进行页面切换,为false时不可滑动切换页面。<br/>默认值:true |
43| barMode           | BarMode                                 | TabBar布局模式,具体描述见BarMode枚举说明。<br/>默认值:BarMode.Fixed |
44| barWidth          | number&nbsp;\|&nbsp;Length<sup>8+</sup> | TabBar的宽度值。<br/>**说明:** <br/>设置为小于0或大于Tabs宽度值时,按默认值显示。 |
45| barHeight         | number&nbsp;\|&nbsp;Length<sup>8+</sup> | TabBar的高度值。<br/>**说明:** <br/>设置为小于0或大于Tabs宽度值时,按默认值显示。 |
46| animationDuration | number                                  | TabContent滑动动画时长。不设置时,点击切换页签无动画,滑动切换有动画;设置时,点击切换和滑动切换都有动画。<br/>默认值:300<br/>**说明:** <br/>设置为小于0或百分比时,按默认值显示。 |
47
48## BarMode枚举说明
49
50| 名称         | 描述                                       |
51| ---------- | ---------------------------------------- |
52| Scrollable | 每一个TabBar均使用实际布局宽度,超过总长度(横向Tabs的barWidth,纵向Tabs的barHeight)后可滑动。 |
53| Fixed      | 所有TabBar平均分配barWidth宽度(纵向时平均分配barHeight高度)。 |
54
55## 事件
56
57除支持[通用事件](ts-universal-events-click.md)外,还支持以下事件:
58
59| 名称                                       | 功能描述                                     |
60| ---------------------------------------- | ---------------------------------------- |
61| onChange(event:&nbsp;(index:&nbsp;number)&nbsp;=&gt;&nbsp;void) | Tab页签切换后触发的事件。<br>-&nbsp;index:当前显示的index索引,索引从0开始计算。<br/>触发该事件的条件:<br/>1、TabContent支持滑动时,组件触发滑动时触发。<br/>2、通过[控制器](#tabscontroller)API接口调用。<br/>3、通过[状态变量](../../quick-start/arkts-state.md)构造的属性值进行修改。<br/>4、通过页签处点击触发。 |
62
63## TabsController
64
65Tabs组件的控制器,用于控制Tabs组件进行页签切换。不支持一个TabsController控制多个Tabs组件。
66
67### 导入对象
68
69```ts
70controller: TabsController = new TabsController()
71```
72
73### changeIndex
74
75changeIndex(value: number): void
76
77控制Tabs切换到指定页签。
78
79**参数:**
80
81| 参数名   | 参数类型   | 必填   | 参数描述                                     |
82| ----- | ------ | ---- | ---------------------------------------- |
83| value | number | 是    | 页签在Tabs里的索引值,索引值从0开始。<br/>**说明:** <br/>设置小于0或大于最大数量的值时,该事件失效。 |
84
85
86## 示例
87
88```ts
89// xxx.ets
90@Entry
91@Component
92struct TabsExample {
93  @State fontColor: string = '#182431'
94  @State selectedFontColor: string = '#007DFF'
95  @State currentIndex: number = 0
96  private controller: TabsController = new TabsController()
97
98  @Builder TabBuilder(index: number, name: string) {
99    Column() {
100      Text(name)
101        .fontColor(this.currentIndex === index ? this.selectedFontColor : this.fontColor)
102        .fontSize(16)
103        .fontWeight(this.currentIndex === index ? 500 : 400)
104        .lineHeight(22)
105        .margin({ top: 17, bottom: 7 })
106      Divider()
107        .strokeWidth(2)
108        .color('#007DFF')
109        .opacity(this.currentIndex === index ? 1 : 0)
110    }.width('100%')
111  }
112
113  build() {
114    Column() {
115      Tabs({ barPosition: BarPosition.Start, controller: this.controller }) {
116        TabContent() {
117          Column().width('100%').height('100%').backgroundColor('#00CB87')
118        }.tabBar(this.TabBuilder(0, 'green'))
119
120        TabContent() {
121          Column().width('100%').height('100%').backgroundColor('#007DFF')
122        }.tabBar(this.TabBuilder(1, 'blue'))
123
124        TabContent() {
125          Column().width('100%').height('100%').backgroundColor('#FFBF00')
126        }.tabBar(this.TabBuilder(2, 'yellow'))
127
128        TabContent() {
129          Column().width('100%').height('100%').backgroundColor('#E67C92')
130        }.tabBar(this.TabBuilder(3, 'pink'))
131      }
132      .vertical(false)
133      .barMode(BarMode.Fixed)
134      .barWidth(360)
135      .barHeight(56)
136      .animationDuration(400)
137      .onChange((index: number) => {
138        this.currentIndex = index
139      })
140      .width(360)
141      .height(296)
142      .margin({ top: 52 })
143      .backgroundColor('#F1F3F5')
144    }.width('100%')
145  }
146}
147```
148
149![tabs2](figures/tabs2.gif)