탭
탭 (Tabs)
출처: 문서
본문
서로 관련이 있지만 타입이 다른 데이터 컬렉션을 나누는 컴포넌트예요.
기본 사용법 (Basic Usage)
기본적이고 간결한 탭이에요.
Tabs는 선택형 카드 기능을 제공해요. 기본적으로 첫 번째 탭이 활성 상태로 선택되고, value 속성을 설정해서 어떤 탭이든 활성화할 수 있어요.
카드 스타일 (Card Style)
카드 모양으로 스타일링된 탭이에요.
type을 card로 설정하면 카드 스타일 탭을 얻을 수 있어요.
테두리 카드 (Border Card)
테두리 카드 탭이에요.
type을 border-card로 설정하세요.
탭 위치 (Tab Position)
tab-position 속성으로 탭의 위치를 설정할 수 있어요.
네 가지 방향 중에서 선택할 수 있어요: tabPosition="left|right|top|bottom"
커스텀 탭 (Custom Tab)
named slot을 사용해서 탭 라벨 콘텐츠를 커스터마이즈할 수 있어요.
탭 추가 & 닫기 (Add & Close Tab)
카드 타입 Tabs만 addable & closable을 지원해요.
커스텀 추가 버튼 아이콘 (Customized Add Button Icon)
새 탭의 커스텀 트리거 버튼 (Customized Trigger Button of New Tab)
{{ item.content }}
import { ref } from 'vue'
import type { TabPaneName } from 'element-plus'
let tabIndex = 2
const editableTabsValue = ref('2')
const editableTabs = ref([
{
title: 'Tab 1',
name: '1',
content: 'Tab 1 content',
},
{
title: 'Tab 2',
name: '2',
content: 'Tab 2 content',
},
])
const addTab = (targetName: string) => {
const newTabName = `${++tabIndex}`
editableTabs.value.push({
title: 'New Tab',
name: newTabName,
content: 'New Tab content',
})
editableTabsValue.value = newTabName
}
const removeTab = (targetName: TabPaneName) => {
const tabs = editableTabs.value
let activeName = editableTabsValue.value
if (activeName === targetName) {
tabs.forEach((tab, index) => {
if (tab.name === targetName) {
const nextTab = tabs[index + 1] || tabs[index - 1]
if (nextTab) {
activeName = nextTab.name
}
}
})
}
editableTabsValue.value = activeName
editableTabs.value = tabs.filter((tab) => tab.name !== targetName)
}
.demo-tabs > .el-tabs__content {
padding: 32px;
color: #6b778c;
font-size: 32px;
font-weight: 600;
}
기본값 (Default Value)
Tabs API
Tabs 속성 (Attributes)
| Name | Description | Type | Default |
|---|---|---|---|
| model-value / v-model | 바인딩 값. 선택된 탭의 이름이며 기본값은 첫 번째 탭의 이름이에요 | string / number | — |
| default-value 2.11.9 | 처음 렌더링될 때 활성화되어야 하는 탭의 값 (초기 전환을 피하기 위한 것) | string / number | — |
| type | Tab의 타입 | enum | '' |
| closable | Tab의 닫기 가능 여부 | boolean | false |
| addable | Tab의 추가 가능 여부 | boolean | false |
| editable | Tab의 추가 및 닫기 가능 여부 | boolean | false |
| tab-position | 탭의 위치 | enum | top |
| stretch | 탭의 너비가 컨테이너에 자동으로 맞는지 여부 | boolean | false |
| before-leave | 탭을 전환하기 전의 훅 함수. false가 반환되거나 Promise가 반환된 뒤 reject되면 전환이 방지돼요 | Function | () => true |
| tabindex 2.11.7 | 탭의 tabindex | string / number | 0 |
Tabs 이벤트 (Events)
| Name | Description | Parameters |
|---|---|---|
| tab-click | 탭이 클릭될 때 트리거돼요 | Function |
| tab-change | activeName이 변경될 때 트리거돼요 | Function |
| tab-remove | tab-remove 버튼이 클릭될 때 트리거돼요 | Function |
| tab-add | tab-add 버튼이 클릭될 때 트리거돼요 | Function |
| edit | tab-add 버튼 또는 tab-remove가 클릭될 때 트리거돼요 | Function |
Tabs 슬롯 (Slots)
| Name | Description | Subtags |
|---|---|---|
| default | 기본 콘텐츠 커스텀 | Tab-pane |
| add-icon 2.5.4 | 추가 버튼 아이콘 커스텀 | — |
| addIcon 2.4.0 deprecated | 추가 버튼 아이콘 커스텀 | — |
Tabs Exposes
| Name | Description | Type |
|---|---|---|
| currentName | 현재 활성화된 패널 이름 | object |
| tabNavRef 2.9.10 | tab-nav 컴포넌트 인스턴스 | object |
Tab-nav API
Tab-nav Exposes
| Name | Description | Type |
|---|---|---|
| scrollToActiveTab | 활성 탭으로 스크롤 | Function |
| removeFocus | 포커스 상태 제거 | Function |
| tabListRef 2.9.10 | el_tabs__nav html 요소 | object |
| tabBarRef 2.9.10 | el_tabs__nav bar 인스턴스 | object |
Tab-bar API
Tab-bar Exposes
| Name | Description | Type |
|---|---|---|
| ref 2.9.10 | 탭 루트 html 요소 | object |
| update 2.9.10 | 탭 바 스타일을 수동으로 업데이트하는 메서드. 업데이트된 스타일을 반환해요 | Function |
Tab-pane API
Tab-pane 속성 (Attributes)
| Name | Description | Type | Default |
|---|---|---|---|
| label | 탭의 제목 | string | '' |
| disabled | Tab 비활성화 여부 | boolean | false |
| name | Tabs의 name에 해당하는 식별자. tab-pane의 별칭을 나타내며, 기본값은 tab-pane의 순번이에요. 예를 들어 첫 번째 tab-pane은 '0'이에요 | string / number | — |
| closable | Tab의 닫기 가능 여부 | boolean | false |
| lazy | Tab의 지연 렌더링 여부 | boolean | false |
Tab-pane 슬롯 (Slots)
| Name | Description |
|---|---|
| default | Tab-pane의 콘텐츠 |
| label | Tab-pane의 라벨 |
FAQ
정렬 가능/드래그 가능한 탭을 어떻게 사용하나요?
직접 구현하는 데 필요한 정보를 제공하고 있어요. 네이티브 방식(demo)을 사용하거나, SortableJs(demo)를 사용하면 돼요.