Appearance
Tabs
탭(Tabs) 컴포넌트는 사용자가 키보드나 마우스를 사용하여 여러 개의 콘텐츠 패널 중 하나를 선택하고 전환할 수 있도록 하는 요소입니다. 각 탭은 특정 패널을 대표하며, 클릭 또는 선택 시 해당 패널의 내용이 표시됩니다.
기본 사용법
vue
<template>
<tabs
:active-tab="activeTab"
:tabs="tabs"
@select:tab="handleSelectTab"
@focus:tab="handleFocusTab"
/>
<div>{{ activeTab }}</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { Tabs } from '@jennifersoft/vue-components-v2';
const tabs = [
{ tabKey: 'tab1', label: 'Tab 1', tooltip: { text: '툴팁 내용' } },
{
tabKey: 'tab2',
label: 'Tab 2 Tab 2 Tab 2',
tooltip: { text: '툴팁 내용' },
},
{
tabKey: 'tab3',
label: 'Tab 3',
icon: ICON_TYPE.pod,
tooltip: { text: '툴팁 내용' },
},
{
tabKey: 'tab4',
label: 'Tab 4',
badgeContent: 10,
tooltip: { text: '툴팁 내용' },
},
{
tabKey: 'tab5',
label: 'Tab 5',
badgeContent: 10,
icon: ICON_TYPE.pod,
tooltip: { text: '툴팁 내용' },
},
{
tabKey: 'tab6',
label: 'Tab 6',
disabled: true,
badgeContent: 10,
icon: ICON_TYPE.pod,
},
];
const activeTab = ref('tab1');
const handleSelectTab = (key) => {
activeTab.value = key;
};
const handleFocusTab = (key) => {
console.log('Tab focused:', key);
};
</script>Props
Tabs 컴포넌트
| Prop 이름 | 타입 | 필수 여부 | 기본값 | 설명 |
|---|---|---|---|---|
| activeTab | string | number | symbol | Yes | - | 현재 선택된 탭의 키 |
| tabs | TabItem[] | Yes | - | 탭 아이템 배열 |
| tabIdentifier | string | No | 'tabs' | 탭의 고유 키를 생성할 때 사용되는 접두사 식별자 |
tabIdentifier 는 tabs props가 변경되었지만 tab key가 그대로 유지되는 경우 indicator가 제대로 작동하지 않거나 Tab 컴포넌트 자체가 제대로 업데이트 되지 않는 현상을 방지하기 위한 추가 식별자입니다. Tabs 컴포넌트에서는 기본값이 'tabs' 입니다.
TabItem 인터페이스
| 속성 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
| tabKey | string | number | symbol | Yes | 탭을 식별하는 고유 키 |
| label | string | Yes | 탭에 표시될 텍스트 |
| disabled | boolean | No | 탭 비활성화 여부 |
| tooltip | TooltipProps | No | 탭에 표시될 툴팁 |
| icon | IconTypes | No | 탭에 표시될 아이콘 |
| badgeContent | number | No | 배지에 표시될 숫자 |
| contextKey | any | No | 탭의 컨텍스트 키 |
Example
tab1
Events
| 이벤트 이름 | 파라미터 | 설명 |
|---|---|---|
| select:tab | tabKey: string | number | symbol | 탭이 선택되었을 때 발생 |
| focus:tab | tabKey: string | number | symbol | 탭이 포커스되었을 때 발생 |
접근성
- 키보드 탐색이 지원됩니다
- 비활성화된 탭은
disabled속성이 적용됩니다
Tab Contraction
Tabs는 고수준 편의 래퍼(Tabs 컴포넌트) 외에도, 더 유연한 조합형 API를 제공합니다. 이 계약을 TabContraction이라고 하며, 아래 세 부분으로 구성됩니다.
- [TabList]
- [Tab]
- [contextKey]
TabList
- 개요
Tab항목을 감싸는 리스트 컨테이너입니다.- 키보드 내비게이션, 인디케이터(Primary) 등을 관리합니다.
Props
| Prop 이름 | 타입 | 필수 여부 | 기본값 | 설명 |
|---|---|---|---|---|
| selectedKey | string | number | symbol | Yes | - | 현재 선택된 탭의 키 |
| contextKey | string | InjectionKey<TabContraction['context']> | No | 'tabContext' | 탭 그룹 컨텍스트 키 |
| type | 'primary' | 'secondary' | No | 'primary' | 탭 리스트 스타일 |
Events
| 이벤트 이름 | 파라미터 | 설명 |
|---|---|---|
| select:tab | tabKey: string | number | symbol | 탭이 선택되었을 때 발생 |
| focus:tab | tabKey: string | number | symbol | 탭이 포커스되었을 때 |
Tab
Props
| Prop 이름 | 타입 | 필수 여부 | 기본값 | 설명 |
|---|---|---|---|---|
| contextKey | string | InjectionKey<TabContraction['context']> | No | - | 탭 컨텍스트 키 |
| tabKey | string | number | symbol | Yes | - | 탭 고유 키 |
| label | string | Yes | - | 탭 라벨 |
| disabled | boolean | No | false | 비활성화 여부 |
| tooltip | TooltipProps | No | - | 툴팁 |
| icon | IconTypes | No | - | 아이콘 |
| badgeContent | number | No | - | 배지 숫자 |
contextKey
- 동일 화면에 서로 다른 탭 그룹이 공존할 때 상호 간섭을 막기 위해 사용합니다.
const contextKey = Symbol('tabContext')형태로 정의 후TabList와 각Tab에 동일하게 전달하세요.
Context API
| 이름 | 타입 | 설명 |
|---|---|---|
| selectedKey | Ref<string | number | symbol> | 현재 선택된 탭 키 |
| focusedKey | Ref<string | number | symbol | null> | 현재 포커스된 탭 키 |
| tabElemMap | Map<string | number | symbol, HTMLElement> | 탭 키와 엘리먼트 매핑 |
| tabOrder | (string | number | symbol)[] | 탭 렌더링 및 탐색 순서 |
| selectTab | (key: string | number | symbol) => void | 지정 키를 선택 |
| focusTab | (key: string | number | symbol) => void | 지정 키로 포커스 이동 |
| register | (key: string | number | symbol, el: HTMLElement) => void | 탭 요소 등록 |
Tabs 래퍼와의 관계
Tabs컴포넌트는 위의TabList+Tab을 조합하여 사용하기 쉬운 고수준 래퍼입니다.tabIdentifier는tabs배열이 갱신될 때 인디케이터/렌더링 동기화를 돕는 보조 식별자입니다.
예시: 조합형 사용(Primary)
vue
<template>
<tab-list
:selected-key="active"
:context-key="contextKey"
@select:tab="onSelect"
@focus:tab="onFocus"
>
<tab :context-key="contextKey" tab-key="tab1" label="Tab 1" />
<tab :context-key="contextKey" tab-key="tab2" label="Tab 2" />
<tab :context-key="contextKey" tab-key="tab3" label="Tab 3" />
</tab-list>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { TabList, Tab } from '@jennifersoft/vue-components-v2';
const contextKey = Symbol('tabContext');
const active = ref('tab1');
const onSelect = (key: string | number | symbol) => {
active.value = key as any;
};
const onFocus = (key: string | number | symbol) => {
console.log('focus', key);
};
</script>