doc.md 9.6 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
### Tabpane 自动高度

Y
yangjinjun3 已提交
98 99
自动高度。设置为 true 时,nut-tabs 和 nut-tabs__content 会随着当前 nut-tabpane 的高度而发生变化。

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 128 129
:::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;
```

:::

130 131 132
### 数据异步渲染 3s

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

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

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

162 163 164 165 166
:::

### 数量多,滚动操作

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

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

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

189 190 191 192 193
:::

### 左右布局

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

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

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

216 217 218 219 220
:::

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

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

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

const App = () => {
  const [tab6value, setTab6value] = useState('0');
  const list5 = Array.from(new Array(2).keys());
O
oasis-cloud 已提交
229 230 231 232 233 234 235
  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>)}
236 237 238
      </Tabs>
    </>
  );
O
oasis-cloud 已提交
239
};
240 241
export default App;
```
O
oasis-cloud 已提交
242

243 244 245
:::

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

247
:::demo
O
oasis-cloud 已提交
248

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

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

284 285 286
:::

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

288
:::demo
O
oasis-cloud 已提交
289

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

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 已提交
312 313
  return (
    <>
314 315 316 317
      <Tabs value={tab7value} titleNode={() => {
        return list6.map(item => (
          <div
            onClick={() => setTab7value(item.paneKey)}
O
oasis-cloud 已提交
318
            className={`nut-tabs__titles-item ${tab7value == item.paneKey ? 'active' : ''}`}
319 320 321
            key={item.paneKey}
          >
            {item.icon && <Icon name={item.icon} />}
O
oasis-cloud 已提交
322 323
            <span className="nut-tabs__titles-item__text">{item.title}</span>
            <span className="nut-tabs__titles-item__line" />
324
          </div>
O
oasis-cloud 已提交
325 326 327
        ))
      }

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

O
oasis-cloud 已提交
341
:::
342 343 344 345 346

## API

### Tabs Props

347 348 349 350 351 352 353 354 355 356 357 358 359 360
| 参数             | 说明                                          | 类型          | 默认值     |
|----------------|-----------------------------------------------|---------------|------------|
| 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     |
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

| 事件名 | 说明                     | 回调参数                 |
|--------|--------------------------|--------------------------|
Y
yangjinjun3 已提交
380 381
| onClick  | 点击标签时触发           | {title,paneKey,disabled} |
| onChange | 当前激活的标签改变时触发 | {title,paneKey,disabled} |