# Cascader 계단식 선택기
계단식 선택기입니다. 단계별로 하위 패널을 펼치고, checkStrictly로 부모-자식 연결을 해제하면 임의의 계층을 선택할 수 있으며, emitPath가 전체 경로를 반환할지 마지막 값만 반환할지를 제어합니다. 패널은 body에 마운트됩니다 (Vue2에는 Teleport가 없음).
여러 선택(
multiple) 시 값은 선택한 경로의 배열이며, 마찬가지로emitPath의 제약을 받습니다:emitPath=true이면 각 항목이 전체 경로,emitPath=false이면 각 항목이 마지막 값만 됩니다. 제어식 비우기 (외부에서v-model을 비움) 는 선택된 태그를 동기화하여 비웁니다.
계단식 선택기
<template>
<div class="demo-col" style="gap: 16px">
<div class="demo-row" style="gap: 12px; flex-wrap: wrap">
<LhCascader v-model="path" :options="options" placeholder="화과를 선택하세요" clearable separator=">" />
<LhCascader v-model="path" :options="options" size="small" disabled />
<LhCascader v-model="path" :options="options" size="large" readonly />
</div>
<p class="demo-note">전체 경로 (separator=">"): {{ path.length ? path.join(' > ') : '(선택 안 함)' }}</p>
<LhCascader
v-model="leaf"
:options="options"
:emit-path="false"
:show-all-levels="false"
check-strictly
placeholder="부모-자식 연결 없이 임의 계층 선택 가능"
/>
<p class="demo-note">마지막 값만: {{ leaf.length ? leaf.join(', ') : '(선택 안 함)' }}</p>
<LhCascader
v-model="multi"
:options="options"
multiple
collapse-tags
filterable
placeholder="여러 선택 + 태그 접기 + 검색"
/>
<p class="demo-note">여러 선택값: {{ multi.length ? multi.map((m) => m.join('/')).join(', ') : '(선택 안 함)' }}</p>
<LhCascader
v-model="custom"
:options="customOptions"
:item-config="{ value: 'id', label: 'name', children: 'sub' }"
placeholder="사용자 정의 필드 매핑 (id/name/sub)"
clearable
/>
<p class="demo-note">사용자 정의 키: {{ custom.length ? custom.join(' / ') : '(선택 안 함)' }}</p>
<p class="demo-note">cascading (기본값) 은 마우스 오버 시 하위를 펼칩니다. 계단식 데이터는 위 각 예시를 참조하세요.</p>
</div>
</template>
<script>
export default {
data: () => ({
path: ['shan', 'pomo', 'dapo'],
leaf: [],
multi: [],
custom: [],
options: [
{
value: 'shan',
label: '산수',
children: [
{
value: 'pomo',
label: '발묵 산수',
children: [
{ value: 'xiaopo', label: '소발묵' },
{ value: 'dapo', label: '대발묵' },
],
},
{ value: 'qianjiang', label: '천강 산수' },
],
},
{
value: 'hua',
label: '화조',
children: [
{ value: 'gongbi', label: '공필 화조' },
{ value: 'xieyi', label: '사의 화조' },
],
},
],
customOptions: [
{
id: 'hua',
name: '화조',
sub: [
{ id: 'gongbi', name: '공필 화조' },
{ id: 'xieyi', name: '사의 화조' },
],
},
{
id: 'shu',
name: '서예',
sub: [{ id: 'kaishu', name: '해서' }],
},
],
}),
}
</script>
# Props
| 프로퍼티 | 설명 | 타입 | 기본값 |
|---|---|---|---|
| v-model | 선택 경로. emitPath=false 시 마지막 값 (여러 선택 시 이들의 배열) | (string \| number)[] | — |
| options | 선택 가능 항목 데이터 | LhCascaderNode[] | [] |
| size | 크기 | 'small' \| 'medium' \| 'large' | 'medium' |
| disabled / readonly / clearable | 비활성화 / 읽기 전용 / 지우기 가능 | boolean | false |
| placeholder | 자리표시 텍스트 | string | 언어 팩 |
| showAllLevels | 전체 경로 표시 (기본) 또는 마지막만 | boolean | true |
| checkStrictly | 부모-자식 연결 해제, 임의 계층 선택 가능 | boolean | false |
| emitPath | 전체 경로 반환 (기본) 또는 마지막 값만 | boolean | true |
| multiple | 여러 선택 | boolean | false |
| cascading | 마우스 오버 시 하위 펼침 | boolean | true |
| separator | 경로 구분 기호 | string | ' / ' |
| collapseTags | 여러 선택 시 태그를 개수로 접기 | boolean | false |
| filterable | 검색 가능 | boolean | false |
| itemConfig | 사용자 정의 필드 매핑 (value/label/children/disabled) | LhCascaderItemConfig | — |
| teleportTarget | 팝업 레이어 마운트 대상 | string \| HTMLElement | 'body' |
| sx | sx 레이아웃 단축 프로퍼티 | — | — |
# Events
input(v-model), change (value, nodes)
# Slots
| 슬롯 | 설명 |
|---|---|
| no-match | filterable 검색 결과가 없을 때의 콘텐츠 (기본 "일치하는 데이터 없음") |
# 접근성
트리거는 role="combobox" + aria-expanded, 각 패널은 role="listbox", 옵션은 role="option"이며,
펼쳐진 계층이 바뀌면 aria-activedescendant를 동기화하고, 방향키 / Enter / ESC 키보드 탐색을 지원합니다.
Copyright © 2024-2026 FengMo WenXue