doc.md 9.5 KB
Newer Older
O
oasis-cloud 已提交
1
# Tabs 选项卡切换
2 3 4 5 6 7 8 9 10 11 12 13 14 15

### 介绍

常用于平级区域大块内容的的收纳和展现,支持内嵌标签形式和渲染循环数据形式

### 安装

```ts
import { Tabs, TabPane } from '@nutui/nutui-react';
```

## 代码演示

### 基础用法
O
oasis-cloud 已提交
16

17
:::demo
O
oasis-cloud 已提交
18

19
```tsx
O
oasis-cloud 已提交
20 21
import React, { useState } from "react";
import { Tabs, TabPane } from '@nutui/nutui-react';
22 23

const App = () => {
O
oasis-cloud 已提交
24 25 26 27 28 29
  const [tab1value, setTab1value] = useState('0');
  return (
    <>
      <Tabs value={tab1value} onChange={({ paneKey }) => {
        setTab1value(paneKey)
      }}>
30 31 32 33 34 35
        <TabPane title="Tab 1"> Tab 1 </TabPane>
        <TabPane title="Tab 2"> Tab 2 </TabPane>
        <TabPane title="Tab 3"> Tab 3 </TabPane>
      </Tabs>
    </>
  );
O
oasis-cloud 已提交
36
};
37 38
export default App;
```
O
oasis-cloud 已提交
39

40 41 42
:::

### 基础用法-微笑曲线
O
oasis-cloud 已提交
43

44
:::demo
O
oasis-cloud 已提交
45

46
```tsx
O
oasis-cloud 已提交
47 48
import React, { useState } from "react";
import { Tabs, TabPane } from '@nutui/nutui-react';
49 50

const App = () => {
O
oasis-cloud 已提交
51 52 53 54 55 56 57 58 59 60
  const [tab1value, setTab1value] = useState('0');
  return (
    <>
      <Tabs value={tab1value} onChange={({ paneKey }) => {
        setTab1value(paneKey)
      }} type="smile">
        <TabPane title="Tab 1"> Tab 1 </TabPane>
        <TabPane title="Tab 2"> Tab 2 </TabPane>
        <TabPane title="Tab 3"> Tab 3 </TabPane>
      </Tabs>
61 62
    </>
  );
O
oasis-cloud 已提交
63
};
64 65
export default App;
```
O
oasis-cloud 已提交
66

67 68 69 70 71
:::

### 通过 pane-key 匹配

:::demo
O
oasis-cloud 已提交
72

73
```tsx
O
oasis-cloud 已提交
74 75
import React, { useState } from "react";
import { Tabs, TabPane } from '@nutui/nutui-react';
76 77

const App = () => {
O
oasis-cloud 已提交
78 79 80 81 82 83 84 85 86
  const [tab2value, setTab2value] = useState('0');
  return (
    <>
      <Tabs value={tab2value} onChange={({ paneKey }) => {
        setTab2value(paneKey)
      }}>
        <TabPane title="Tab 1" pane-key="0"> Tab 1 </TabPane>
        <TabPane title="Tab 2" pane-key="1" disabled> Tab 2 </TabPane>
        <TabPane title="Tab 3" pane-key="2"> Tab 3 </TabPane>
87 88 89
      </Tabs>
    </>
  );
O
oasis-cloud 已提交
90
};
91 92
export default App;
```
O
oasis-cloud 已提交
93

94 95
:::

96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
### Tabpane 自动高度

:::demo

```tsx
import React, { useState } from "react";
import { Tabs, TabPane } from '@nutui/nutui-react';

const App = () => {
  const [tab2value, setTab2value] = useState('0');
  return (
    <>
      <Tabs value={tab2value} autoHeight onChange={({ paneKey }) => {
        setTab2value(paneKey)
      }}>
        <TabPane title="Tab 1" pane-key="0">
            <p>Tab 1</p>
            <p>Tab 1</p>
            <p>Tab 1</p>
            <p>Tab 1</p>
        </TabPane>
        <TabPane title="Tab 2" pane-key="1"> Tab 2 </TabPane>
        <TabPane title="Tab 3" pane-key="2"> Tab 3 </TabPane>
      </Tabs>
    </>
  );
};
export default App;
```

:::

128 129 130
### 数据异步渲染 3s

:::demo
O
oasis-cloud 已提交
131

132
```tsx
O
oasis-cloud 已提交
133 134
import React, { useState } from "react";
import { Tabs, TabPane } from '@nutui/nutui-react';
135 136 137

const App = () => {
  const [tab3value, setTab3value] = useState('0');
O
oasis-cloud 已提交
138
  const [list3, setList3] = useState(Array.from(new Array(2).keys()));
139 140 141 142 143 144 145
  useEffect(() => {
    setTimeout(() => {
      list3.push(999);
      setTab3value('2');
      setList3(list3)
    }, 3000)
  }, [])
O
oasis-cloud 已提交
146 147 148 149 150 151 152
  return (
    <>
      <Tabs value={tab3value} onChange={({ paneKey }) => {
        setTab3value(paneKey)
      }}>
        {list3.map(item => <TabPane key={item}
          title={`Tab ${item}`}> Tab {item} </TabPane>)}
153 154 155
      </Tabs>
    </>
  );
O
oasis-cloud 已提交
156
};
157 158
export default App;
```
O
oasis-cloud 已提交
159

160 161 162 163 164
:::

### 数量多,滚动操作

:::demo
O
oasis-cloud 已提交
165

166
```tsx
O
oasis-cloud 已提交
167 168
import React, { useState } from "react";
import { Tabs, TabPane } from '@nutui/nutui-react';
169 170 171 172

const App = () => {
  const [tab4value, setTab4value] = useState('0');
  const list4 = Array.from(new Array(10).keys());
O
oasis-cloud 已提交
173 174 175 176 177 178 179
  return (
    <>
      <Tabs value={tab4value} onChange={({ paneKey }) => {
        setTab4value(paneKey)
      }} titleScroll titleGutter="10">
        {list4.map(item => <TabPane key={item}
          title={`Tab ${item}`}> Tab {item} </TabPane>)}
180 181 182
      </Tabs>
    </>
  );
O
oasis-cloud 已提交
183
};
184 185
export default App;
```
O
oasis-cloud 已提交
186

187 188 189 190 191
:::

### 左右布局

:::demo
O
oasis-cloud 已提交
192

193
```tsx
O
oasis-cloud 已提交
194 195
import React, { useState } from "react";
import { Tabs, TabPane } from '@nutui/nutui-react';
196 197 198 199

const App = () => {
  const [tab5value, setTab5value] = useState('0');
  const list5 = Array.from(new Array(2).keys());
O
oasis-cloud 已提交
200 201 202 203 204 205 206
  return (
    <>
      <Tabs value={tab5value} onChange={({ paneKey }) => {
        setTab5value(paneKey)
      }} titleScroll direction="vertical">
        {list5.map(item => <TabPane key={item}
          title={`Tab ${  item}`}> Tab {item} </TabPane>)}
207 208 209
      </Tabs>
    </>
  );
O
oasis-cloud 已提交
210
};
211 212
export default App;
```
O
oasis-cloud 已提交
213

214 215 216 217 218
:::

### 左右布局-微笑曲线

:::demo
O
oasis-cloud 已提交
219

220
```tsx
O
oasis-cloud 已提交
221 222
import React, { useState } from "react";
import { Tabs, TabPane } from '@nutui/nutui-react';
223 224 225 226

const App = () => {
  const [tab6value, setTab6value] = useState('0');
  const list5 = Array.from(new Array(2).keys());
O
oasis-cloud 已提交
227 228 229 230 231 232 233
  return (
    <>
      <Tabs value={tab6value} onChange={({ paneKey }) => {
        setTab6value(paneKey)
      }} type="smile" titleScroll direction="vertical">
        {list5.map(item => <TabPane key={item}
          title={`Tab ${item}`}> Tab {item} </TabPane>)}
234 235 236
      </Tabs>
    </>
  );
O
oasis-cloud 已提交
237
};
238 239
export default App;
```
O
oasis-cloud 已提交
240

241 242 243
:::

### 标签栏字体尺寸 large normal small
O
oasis-cloud 已提交
244

245
:::demo
O
oasis-cloud 已提交
246

247
```tsx
O
oasis-cloud 已提交
248 249
import React, { useState } from "react";
import { Tabs, TabPane } from '@nutui/nutui-react';
250 251

const App = () => {
O
oasis-cloud 已提交
252 253 254 255 256 257
  const [tab1value, setTab1value] = useState('0');
  return (
    <>
      <Tabs value={tab1value} onChange={({ paneKey }) => {
        setTab1value(paneKey)
      }} size="large">
258 259 260 261
        <TabPane title="Tab 1"> Tab 1 </TabPane>
        <TabPane title="Tab 2"> Tab 2 </TabPane>
        <TabPane title="Tab 3"> Tab 3 </TabPane>
      </Tabs>
O
oasis-cloud 已提交
262 263 264
      <Tabs value={tab1value} onChange={({ paneKey }) => {
        setTab1value(paneKey)
      }} size="normal">
265 266 267 268
        <TabPane title="Tab 1"> Tab 1 </TabPane>
        <TabPane title="Tab 2"> Tab 2 </TabPane>
        <TabPane title="Tab 3"> Tab 3 </TabPane>
      </Tabs>
O
oasis-cloud 已提交
269 270 271
      <Tabs value={tab1value} onChange={({ paneKey }) => {
        setTab1value(paneKey)
      }} size="small">
272 273 274 275 276 277
        <TabPane title="Tab 1"> Tab 1 </TabPane>
        <TabPane title="Tab 2"> Tab 2 </TabPane>
        <TabPane title="Tab 3"> Tab 3 </TabPane>
      </Tabs>
    </>
  );
O
oasis-cloud 已提交
278
};
279 280
export default App;
```
O
oasis-cloud 已提交
281

282 283 284
:::

### 自定义标签栏
O
oasis-cloud 已提交
285

286
:::demo
O
oasis-cloud 已提交
287

288
```tsx
O
oasis-cloud 已提交
289 290
import React, { useState } from "react";
import { Tabs, TabPane, Icon } from '@nutui/nutui-react';
291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309

const App = () => {
  const [tab7value, setTab7value] = useState('c1');
  const list6 = [
    {
      title: '自定义 1',
      paneKey: 'c1',
      icon: 'dongdong'
    },
    {
      title: '自定义 2',
      paneKey: 'c2',
      icon: 'JD'
    },
    {
      title: '自定义 3',
      paneKey: 'c3'
    }
  ]
O
oasis-cloud 已提交
310 311
  return (
    <>
312 313 314 315
      <Tabs value={tab7value} titleNode={() => {
        return list6.map(item => (
          <div
            onClick={() => setTab7value(item.paneKey)}
O
oasis-cloud 已提交
316
            className={`nut-tabs__titles-item ${tab7value == item.paneKey ? 'active' : ''}`}
317 318 319
            key={item.paneKey}
          >
            {item.icon && <Icon name={item.icon} />}
O
oasis-cloud 已提交
320 321
            <span className="nut-tabs__titles-item__text">{item.title}</span>
            <span className="nut-tabs__titles-item__line" />
322
          </div>
O
oasis-cloud 已提交
323 324 325
        ))
      }

326 327
      }>
        {list6.map(item => (
O
oasis-cloud 已提交
328 329 330 331
          <TabPane key={item.paneKey} paneKey={item.paneKey}>
            {item.title}
          </TabPane>
        ))}
332 333 334
      </Tabs>
    </>
  );
O
oasis-cloud 已提交
335
};
336 337 338
export default App;
```

O
oasis-cloud 已提交
339
:::
340 341 342 343 344

## API

### Tabs Props

345 346 347 348 349 350 351 352 353 354 355 356 357 358
| 参数             | 说明                                          | 类型          | 默认值     |
|----------------|-----------------------------------------------|---------------|------------|
| value          | 绑定当前选中标签的标识符                      | number,string | 0          |
| color          | 标签选中色                                    | string        | #1a1a1a    |
| background     | 标签栏背景颜色                                | string        | #f5f5f5    |
| direction      | 使用横纵方向 可选值 horizontal、vertical      | string        | horizontal |
| type           | 选中底部展示样式 可选值 line、smile           | string        | line       |
| titleScroll    | 标签栏是否可以滚动                            | boolean       | false      |
| ellipsis       | 是否省略过长的标题文字                        | boolean       | true       |
| animatedTime   | 切换动画时长,单位 ms 0 代表无动画              | number,string | 300        |
| titleGutter    | 标签间隙                                      | number,string | 0          |
| titleNode      | 自定义导航区域                                 | () => JSX.Element[] | 0          |
| size           | 标签栏字体尺寸大小 可选值 large normal small | string        | normal     |
| autoHeight`v1.2.1` | 自动高度。设置为 true 时,nut-tabs 和 nut-tabs__content 会随着当前 nut-tabpane 的高度而发生变化。 | boolean        | false     |
359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379

## Tabs Children

| 名称    | 说明           |
|---------|----------------|
| default | 自定义内容     |

### Tabpane Props

| 参数     | 说明                    | 类型    | 默认值           |
|----------|-------------------------|---------|------------------|
| title    | 标题                    | string  |                  |
| paneKey  | 标签 Key , 匹配的标识符 | string  | 默认索引0,1,2... |
| disabled | 是否禁用标签            | boolean | false            |

### Tabs Events

| 事件名 | 说明                     | 回调参数                 |
|--------|--------------------------|--------------------------|
| click  | 点击标签时触发           | {title,paneKey,disabled} |
| change | 当前激活的标签改变时触发 | {title,paneKey,disabled} |