Appearance
Menu
Type (default)
- One
- Two
- Three
- Four
- Five
- Six
vue
<script setup lang="ts">
import { MenuContainer, MenuBox } from '@jennifersoft/vue-components-v2';
import { ref } from 'vue';
const items = [
{ label: 'One', value: 1 },
{ label: 'Two', value: 2 },
{ label: 'Three', value: 3 },
{ label: 'Four', value: 4 },
{ label: 'Five', value: 5 },
{ label: 'Six', value: 6 },
];
const selectedValue = ref(1);
</script>
<template>
<menu-box class="w-48">
<menu-container
v-model="selectedValue"
:items="items"
@select:index="(index) => console.log('select:index', index)"
/>
</menu-box>
</template>Props
| 이름 | 타입 | 필수 여부 | 기본값 | 설명 |
|---|---|---|---|---|
| items | Array<MenuItem> | Yes | - | 메뉴 항목 배열 |
| menuType | 'default' | 'checkmark' | No | 'default' | 메뉴 스타일 타입 |
| highlightOnSelect | boolean | No | - | 선택 시 항목 하이라이트 여부 |
Item 타입 정의
메뉴 items는 다음과 같은 형태를 갖습니다. 중첩 메뉴를 위해 items(동일 타입 배열)를 선택적으로 포함할 수 있습니다.
ts
type MenuItemValue = string | number | boolean;
type MenuItem = {
value: MenuItemValue;
label: string;
leadingIcon?: IconTypes;
leadingBadge?: BadgeProps;
trailingBadge?: BadgeProps;
trailingLabel?: string;
type?: 'text' | 'error-text';
disabled?: boolean;
tooltip?: TooltipProps;
items?: MenuItem[]; // 서브 메뉴 (선택)
};v-model
| 이름 | 타입 | 기본값 | 설명 |
|---|---|---|---|
| (기본) | string | number | boolean | null | null | 선택된 값(항목의 value) 바인딩 |
이벤트
| 이름 | 파라미터 | 설명 |
|---|---|---|
| select:index | index: number | 항목 클릭 시 해당 인덱스 전달 |
Type (default) with header
Header
- One
- Two
- Three
- Four
- Five
- Six
vue
<script setup lang="ts">
import { MenuContainer, MenuBox } from '@jennifersoft/vue-components-v2';
import { ref } from 'vue';
const items = [
{ label: 'One', value: 1 },
{ label: 'Two', value: 2 },
{ label: 'Three', value: 3 },
{ label: 'Four', value: 4 },
{ label: 'Five', value: 5 },
{ label: 'Six', value: 6 },
];
</script>
<template>
<menu-box class="w-48">
<menu-container :items="items2">
<template #header>
<span>Header</span>
</template>
</menu-container>
</menu-box>
</template>Type (default) with trailingLabel
- UnDo⌘+Z
- Search⌘+F
- Copy⌘+C
- Paste⌘+V
vue
<script setup lang="ts">
import { MenuContainer, MenuBox } from '@jennifersoft/vue-components-v2';
import { ref } from 'vue';
const trailingLabelItems = ref([
{ label: 'UnDo', value: 'UnDo', trailingLabel: '⌘+Z' },
{ label: 'Search', value: 'Search', trailingLabel: '⌘+F' },
{ label: 'Copy', value: 'Copy', trailingLabel: '⌘+C' },
{ label: 'Paste', value: 'Paste', trailingLabel: '⌘+V' },
]);
</script>
<template>
<menu-box class="w-48">
<menu-container :items="trailingLabelItems" />
</menu-box>
</template>Type (default) with submenu
- One
- Two
- Three
- Three-One
- Three-Two
- Three-Two-One
- Three-Two-Two
- Three-Two-Three
- Three-Three
- Three-Three-One
- Three-Three-Two
- Three-Three-Three
vue
<script setup lang="ts">
import { MenuContainer, MenuBox } from '@jennifersoft/vue-components-v2';
import { ref } from 'vue';
const hierarchyItems = ref([
{ label: 'One', value: 1 },
{ label: 'Two', value: 2 },
{
label: 'Three',
value: 3,
items: [
{ label: 'Three-One', value: 31 },
{
label: 'Three-Two',
value: 32,
items: [
{ label: 'Three-Two-One', value: 331 },
{ label: 'Three-Two-Two', value: 332 },
{ label: 'Three-Two-Three', value: 323 },
],
},
{
label: 'Three-Three',
value: 33,
items: [
{ label: 'Three-Three-One', value: 331 },
{ label: 'Three-Three-Two', value: 332 },
{ label: 'Three-Three-Three', value: 333 },
],
},
],
},
]);
</script>
<template>
<menu-box class="w-48">
<menu-container :items="hierarchyItems" />
</menu-box>
</template>Type (default) with scroll
- One
- Two
- Three
- Four
- Five
- Six
- Seven
- Eight
- Nine
- Ten
vue
<script setup lang="ts">
import { MenuContainer, MenuBox } from '@jennifersoft/vue-components-v2';
const items10 = [
{ label: 'One', value: 1 },
{ label: 'Two', value: 2 },
{ label: 'Three', value: 3 },
{ label: 'Four', value: 4 },
{ label: 'Five', value: 5 },
{ label: 'Six', value: 6 },
{ label: 'Seven', value: 7 },
{ label: 'Eight', value: 8 },
{ label: 'Nine', value: 9 },
{ label: 'Ten', value: 1 },
];
</script>
<template>
<menu-box class="w-48" style="max-height: 200px; overflow-y: auto;">
<menu-container :items="items10" />
</menu-box>
</template>Type (default) with leading-icon
- One
- Two
- Three
- Four
- Five
- Six
vue
<script setup lang="ts">
import {
MenuContainer,
MenuBox,
ICON_TYPE,
} from '@jennifersoft/vue-components-v2';
import { ref } from 'vue';
const iconItems = [
{ label: 'One', value: 1, leadingIcon: ICON_TYPE.cluster },
{ label: 'Two', value: 2, leadingIcon: ICON_TYPE.nodes },
{ label: 'Three', value: 3, leadingIcon: ICON_TYPE.storage },
{ label: 'Four', value: 4, leadingIcon: ICON_TYPE.deployment },
{ label: 'Five', value: 5, leadingIcon: ICON_TYPE.replicaset },
{ label: 'Six', value: 6, leadingIcon: ICON_TYPE.server },
];
</script>
<template>
<menu-box class="w-48">
<menu-container :items="items" />
</menu-box>
</template>Type (default) with error-text
- One
- Two
- 일일Delete
vue
<script setup lang="ts">
import {
MenuContainer,
MenuBox,
ICON_TYPE,
} from '@jennifersoft/vue-components-v2';
import { ref } from 'vue';
const errorTextItems = [
{ label: 'One', value: 1, leadingIcon: ICON_TYPE.cluster },
{ label: 'Two', value: 2, leadingIcon: ICON_TYPE.nodes },
{
label: 'Delete',
value: 3,
leadingIcon: ICON_TYPE.storage,
leadingBadge: { text: '일일' },
type: 'error-text',
},
];
</script>
<template>
<menu-box class="w-48">
<menu-container :items="errorTextItems" />
</menu-box>
</template>Type (default) with disabled
- One
- Two
- Disabled
vue
<script setup lang="ts">
import {
MenuContainer,
MenuBox,
ICON_TYPE,
} from '@jennifersoft/vue-components-v2';
import { ref } from 'vue';
const disabledItems = [
{ label: 'One', value: 1, leadingIcon: ICON_TYPE.cluster },
{ label: 'Two', value: 2, leadingIcon: ICON_TYPE.nodes },
{
label: 'Disabled',
value: 3,
leadingIcon: ICON_TYPE.storage,
disabled: true,
},
];
</script>
<template>
<menu-box class="w-48">
<menu-container :items="disabledItems" />
</menu-box>
</template>Type (default) with group, header
Documents
- New
- Search
Profile
- Settings
- Logout
vue
<script setup lang="ts">
import {
ICON_TYPE,
MenuContainer,
MenuBox,
} from '@jennifersoft/vue-components-v2';
import { ref } from 'vue';
const items1OnGroup = [
{ label: 'New', value: 'New', leadingIcon: ICON_TYPE.add },
{ label: 'Search', value: 'Search', leadingIcon: ICON_TYPE.search },
];
const items2OnGroup = [
{ label: 'Settings', value: 'Settings', leadingIcon: ICON_TYPE.settings },
{ label: 'Logout', value: 'Logout', leadingIcon: ICON_TYPE.external },
];
</script>
<template>
<menu-box class="w-48">
<menu-container :items="items1OnGroup">
<template #header>
<span>Documents</span>
</template>
</menu-container>
<menu-container :items="items2OnGroup">
<template #header>
<span>Profile</span>
</template>
</menu-container>
</menu-box>
</template>Type (default) with badge, leading-icon
Domain A
- 시간당호출건수
- 일일방문자수
- 시간당동시사용자수
Domain B
- 시간당호출건수
- 일일방문자수
- 시간당동시사용자수
vue
<script setup lang="ts">
const badgeItems = ref([
{
label: '호출건수',
value: 'hitCount',
leadingBadge: { text: '시간당' },
leadingIcon: ICON_TYPE.daemonset,
},
{
label: '방문자수',
value: 'visitCount',
leadingBadge: { text: '일일' },
leadingIcon: ICON_TYPE.user,
},
{
label: '동시사용자수',
value: 'concurrentUser',
leadingBadge: { text: '시간당' },
leadingIcon: ICON_TYPE.cluster,
},
]);
</script>
<template>
<menu-box class="w-48">
<menu-container :items="badgeItems">
<template #header>
<span>Domain A</span>
</template>
</menu-container>
<menu-container :items="badgeItems">
<template #header>
<span>Domain B</span>
</template>
</menu-container>
</menu-box>
</template>Type (default) with tooltip
- 호출건수
- 방문자수
- 동시사용자수
vue
<script setup lang="ts">
const tooltipItems = ref([
{
label: '호출건수',
value: 'hitCount',
tooltip: {
text: '호출건수 입니다',
placement: 'right',
},
},
{
label: '방문자수',
value: 'visitCount',
tooltip: {
text: '방문자수 입니다',
placement: 'right',
},
},
{
label: '동시사용자수',
value: 'concurrentUser',
tooltip: {
text: '동시사용자수 입니다',
placement: 'right',
},
},
]);
</script>
<template>
<menu-box class="w-48">
<menu-container :items="tooltipItems" />
</menu-box>
</template>Type (checkmark)
- One
- Two
- Three
- Four
- Five
- Six
vue
<script setup lang="ts">
import { MenuContainer, MenuBox } from '@jennifersoft/vue-components-v2';
import { ref } from 'vue';
const items = [
{ label: 'One', value: 1 },
{ label: 'Two', value: 2 },
{ label: 'Three', value: 3 },
{ label: 'Four', value: 4 },
{ label: 'Five', value: 5 },
{ label: 'Six', value: 6 },
];
const selectedValue = ref(1);
</script>
<template>
<menu-box class="w-48">
<menu-container
menu-type="checkmark"
v-model="selectedValue"
:items="items"
/>
</menu-box>
</template>