Cascader
Cascader (캐스케이더)
출처: 문서
본문
Cascader
옵션에 명확한 계층 구조가 있다면, Cascader를 사용해서 보고 선택할 수 있어요.
기본 사용법
자식 옵션 항목을 펼치는 방법은 두 가지가 있어요.
options 속성에 옵션 배열을 할당하면 Cascader가 렌더링돼요. props.expandTrigger 속성은 자식 옵션을 펼치는 방법을 정의해요.
import { ref } from 'vue'
const value = ref([])
const props = {
expandTrigger: 'hover' as const,
}
const handleChange = (value) => {
console.log(value)
}
const options = [
{
value: 'guide',
label: 'Guide',
children: [
{
value: 'disciplines',
label: 'Disciplines',
children: [
{ value: 'consistency', label: 'Consistency' },
{ value: 'feedback', label: 'Feedback' },
{ value: 'efficiency', label: 'Efficiency' },
{ value: 'controllability', label: 'Controllability' },
],
},
{
value: 'navigation',
label: 'Navigation',
children: [
{ value: 'side nav', label: 'Side Navigation' },
{ value: 'top nav', label: 'Top Navigation' },
],
},
],
},
{
value: 'component',
label: 'Component',
children: [
{
value: 'basic',
label: 'Basic',
children: [
{ value: 'layout', label: 'Layout' },
{ value: 'color', label: 'Color' },
{ value: 'typography', label: 'Typography' },
{ value: 'icon', label: 'Icon' },
{ value: 'button', label: 'Button' },
],
},
{
value: 'form',
label: 'Form',
children: [
{ value: 'radio', label: 'Radio' },
{ value: 'checkbox', label: 'Checkbox' },
{ value: 'input', label: 'Input' },
{ value: 'input-number', label: 'InputNumber' },
{ value: 'select', label: 'Select' },
{ value: 'cascader', label: 'Cascader' },
{ value: 'switch', label: 'Switch' },
{ value: 'slider', label: 'Slider' },
{ value: 'time-picker', label: 'TimePicker' },
{ value: 'date-picker', label: 'DatePicker' },
{ value: 'datetime-picker', label: 'DateTimePicker' },
{ value: 'upload', label: 'Upload' },
{ value: 'rate', label: 'Rate' },
{ value: 'form', label: 'Form' },
],
},
{
value: 'data',
label: 'Data',
children: [
{ value: 'table', label: 'Table' },
{ value: 'tag', label: 'Tag' },
{ value: 'progress', label: 'Progress' },
{ value: 'tree', label: 'Tree' },
{ value: 'pagination', label: 'Pagination' },
{ value: 'badge', label: 'Badge' },
],
},
{
value: 'notice',
label: 'Notice',
children: [
{ value: 'alert', label: 'Alert' },
{ value: 'loading', label: 'Loading' },
{ value: 'message', label: 'Message' },
{ value: 'message-box', label: 'MessageBox' },
{ value: 'notification', label: 'Notification' },
],
},
{
value: 'navigation',
label: 'Navigation',
children: [
{ value: 'menu', label: 'Menu' },
{ value: 'tabs', label: 'Tabs' },
{ value: 'breadcrumb', label: 'Breadcrumb' },
{ value: 'dropdown', label: 'Dropdown' },
{ value: 'steps', label: 'Steps' },
],
},
{
value: 'others',
label: 'Others',
children: [
{ value: 'dialog', label: 'Dialog' },
{ value: 'tooltip', label: 'Tooltip' },
{ value: 'popover', label: 'Popover' },
{ value: 'card', label: 'Card' },
{ value: 'carousel', label: 'Carousel' },
{ value: 'collapse', label: 'Collapse' },
],
},
],
},
{
value: 'resource',
label: 'Resource',
children: [
{ value: 'axure', label: 'Axure Components' },
{ value: 'sketch', label: 'Sketch Templates' },
{ value: 'docs', label: 'Design Documentation' },
],
},
]
비활성화된 옵션
옵션 객체에 disabled 필드를 설정해서 옵션을 비활성화해요.
이 예시에서 options 배열의 첫 항목에는 disabled: true 필드가 있어서 비활성화된 상태예요. 기본적으로 Cascader는 각 옵션 객체의 disabled 필드를 확인해요. 옵션이 비활성화되었는지 나타내는 데 다른 필드 이름을 사용한다면, props.disabled 속성에 할당할 수 있어요(자세한 내용은 아래 API 표 참고). 물론 value, label, children 필드 이름도 같은 방식으로 커스터마이즈할 수 있어요.
Clearable
el-cascader에 clearable 속성을 설정하면 선택되고 호버했을 때 클리어 아이콘이 나타나요.
커스텀 클리어 아이콘 2.11.0
clear-icon 속성을 설정해서 클리어 아이콘을 커스터마이즈할 수 있어요.
마지막 레벨만 표시
입력에 모든 레벨 대신 마지막 레벨만 표시할 수 있어요.
show-all-levels 속성은 모든 레벨을 표시할지 정의해요. false면 마지막 레벨만 표시돼요.
다중 선택
태그에 :props="props"를 추가하고 data props = { multiple: true }를 설정해서 다중 선택을 사용해요.
올바른 예:
const props = { multiple: true }
잘못된 예:
다중 선택을 사용할 때 기본적으로 모든 선택된 태그가 표시돼요. collapse-tags = true로 설정하면 선택된 태그를 접을 수 있어요. max-collapse-tags를 설정해서 최대 태그 수를 표시할 수 있고 기본값은 1이에요. collapse-tags-tooltip 속성을 사용해서 마우스를 접힌 텍스트 위에 올리면 확인할 수 있어요.
const props = { multiple: true }
const options = [
{
value: 1,
label: 'Asia',
children: [
{
value: 2,
label: 'China',
children: [
{ value: 3, label: 'Beijing' },
{ value: 4, label: 'Shanghai' },
{ value: 5, label: 'Hangzhou' },
],
},
{
value: 6,
label: 'Japan',
children: [
{ value: 7, label: 'Tokyo' },
{ value: 8, label: 'Osaka' },
{ value: 9, label: 'Kyoto' },
],
},
{
value: 10,
label: 'Korea',
children: [
{ value: 11, label: 'Seoul' },
{ value: 12, label: 'Busan' },
{ value: 13, label: 'Taegu' },
],
},
],
},
{
value: 14,
label: 'Europe',
children: [
{
value: 15,
label: 'France',
children: [
{ value: 16, label: 'Paris' },
{ value: 17, label: 'Marseille' },
{ value: 18, label: 'Lyon' },
],
},
{
value: 19,
label: 'UK',
children: [
{ value: 20, label: 'London' },
{ value: 21, label: 'Birmingham' },
{ value: 22, label: 'Manchester' },
],
},
],
},
{
value: 23,
label: 'North America',
children: [
{
value: 24,
label: 'US',
children: [
{ value: 25, label: 'New York' },
{ value: 26, label: 'Los Angeles' },
{ value: 27, label: 'Washington' },
],
},
{
value: 28,
label: 'Canada',
children: [
{ value: 29, label: 'Toronto' },
{ value: 30, label: 'Montreal' },
{ value: 31, label: 'Ottawa' },
],
},
],
},
]
모든 레벨의 옵션 선택
단일 선택에서는 리프 노드만 체크할 수 있고, 다중 선택에서는 부모 노드를 체크하면 결국 리프 노드가 체크돼요. 이 기능을 켜면 부모/자식 노드의 연결이 끊기고 어떤 레벨의 옵션이든 선택할 수 있어요.
props.checkStrictly = true로 설정하면 노드의 체크 상태가 부모/자식 노드에 영향을 미치지 않게 되고, 어떤 레벨의 옵션이든 선택할 수 있어요.
const props1 = {
checkStrictly: true,
}
const props2 = {
multiple: true,
checkStrictly: true,
}
동적 로딩
노드를 체크할 때 자식 노드를 동적으로 로드해요.
lazy = true로 설정해서 동적 로딩을 사용하고, lazyload로 데이터 소스 로드 방법을 지정해야 해요. lazyload에는 두 개의 파라미터가 있는데, 첫 번째 node는 현재 클릭한 노드이고, resolve는 로딩이 끝났음을 알리는 콜백으로 반드시 호출해야 해요. 노드 상태를 더 정확하게 표시하려면 leaf 필드(props.leaf로 수정 가능)를 추가해서 리프 노드인지 나타낼 수 있어요. 그렇지 않으면 자식 노드가 있는지로 추론돼요.
Filterable
키워드로 옵션을 검색하고 선택해요.
el-cascader에 filterable을 추가하면 필터링이 활성화돼요. Cascader는 label이나 부모의 label(show-all-levels에 따라)에 입력 키워드가 포함된 노드를 매칭해요. 물론 filter-method로 검색 로직을 커스터마이즈할 수 있는데, 함수를 받으며 첫 번째 파라미터는 노드, 두 번째는 키워드이고, 매칭 여부를 나타내는 boolean을 반환해야 해요.
커스텀 옵션 내용
cascader 노드의 내용을 커스터마이즈할 수 있어요.
스코프 슬롯으로 cascader 노드의 내용을 커스터마이즈할 수 있어요. 스코프 안에서 node와 data에 접근할 수 있는데, 각각 현재 노드의 Node 객체와 노드 데이터를 나타내요.
커스텀 제안 항목 2.9.5
suggestion-item 슬롯으로 필터 제안 항목을 커스터마이즈할 수 있어요. 스코프 안에서 item에 접근할 수 있는데, 제안 항목을 나타내요.
Cascader 패널
CascaderPanel은 Cascader의 핵심 컴포넌트로 단일 선택, 다중 선택, 동적 로딩 등 다양한 기능을 제공해요.
el-cascader처럼 options로 대체 옵션을 설정하고 props로 다른 기능을 활성화할 수 있어요. 자세한 내용은 아래 API 폼을 참고해 주세요.
커스텀 태그 2.10.3
태그를 커스터마이즈할 수 있어요.
el-cascader의 슬롯에 커스터마이즈된 태그를 넣어요. collapse-tags, collapse-tags-tooltip, max-collapse-tags는 동작하지 않아요.
import type { Tag } from 'element-plus'
const props = { multiple: true }
const getTags = (data: Tag[]) => {
return data.map((item) => item.text)
}
const getTopLevelTags = (data: Tag[]) => {
const set: Set = new Set()
for (const datum of data) {
let parent = datum.node?.parent
while (parent && parent.level !== 1) {
parent = parent.parent
}
const label = parent?.data?.label
label && set.add(label)
}
return [...set]
}
체크된 전략 표시 2.10.5
다중 선택 모드에서 선택된 값이 표시되는 방식을 제어해요.
다중 선택 모드에서 show-checked-strategy를 사용해서 선택된 값의 표시 방식을 제어할 수 있어요. 기본 전략은 child로, 선택된 모든 자식 노드를 표시해요. parent 전략은 모든 자식이 선택되었을 때만 부모 노드를 표시해요.
import { ref } from 'vue'
const value1 = ref([])
const value2 = ref([])
const props = {
multiple: true,
}
const handleChange1 = (value) => {
console.log('Child strategy:', value)
}
const handleChange2 = (value) => {
console.log('Parent strategy:', value)
}
노드 클릭으로 체크 2.10.5
multiple 또는 checkStrictly 속성만 사용해요.
checkOnClickNode를 추가하면 접두사 아이콘과 함께 노드를 클릭할 수 있어요. showPrefix로 접두사 표시 여부를 토글해요.
checkOnClickLeaf를 추가하면 리프 노드(마지막 자식)만 체크해요. 기본적으로 활성화돼 있어요.
import { computed, ref } from 'vue'
const value = ref()
const value2 = ref()
const showPrefix = ref(true)
const props1 = computed(() => ({
showPrefix: showPrefix.value,
checkStrictly: true,
checkOnClickNode: true,
}))
const props2 = computed(() => ({
showPrefix: showPrefix.value,
multiple: true,
checkOnClickNode: true,
}))
커스텀 헤더 & 푸터 2.10.5
슬롯을 사용해서 드롭다운의 헤더와 푸터를 모두 커스터마이즈할 수 있어요. 슬롯을 사용해서 내용을 커스터마이즈해요.
import { computed, ref, watch } from 'vue'
import type { CascaderOption, CheckboxValueType } from 'element-plus'
const props = { multiple: true }
const checkAll = ref(false)
const indeterminate = ref(false)
const value = ref([])
const options = ref([
{
value: 'guide',
label: 'Guide',
children: [
{
value: 'disciplines',
label: 'Disciplines',
children: [
{ value: 'consistency', label: 'Consistency' },
{ value: 'feedback', label: 'Feedback' },
{ value: 'efficiency', label: 'Efficiency' },
{ value: 'controllability', label: 'Controllability' },
],
},
],
},
])
const getAllValuePaths = computed(() => {
const result: string[][] = []
const queue: { node: CascaderOption; path: string[] }[] = options.value.map(
(node) => ({ node, path: [node.value] })
)
while (queue.length > 0) {
const { node, path } = queue.shift()!
if (node.children?.length) {
node.children.forEach((child) => {
queue.push({ node: child, path: [...path, child.value as string] })
})
} else {
result.push(path)
}
}
return result
})
watch(value, (val) => {
if (val.length === 0) {
checkAll.value = false
indeterminate.value = false
} else if (val.length === getAllValuePaths.value.length) {
checkAll.value = true
indeterminate.value = false
} else {
indeterminate.value = true
}
})
const handleCheckAll = (val: CheckboxValueType) => {
indeterminate.value = false
value.value = val ? getAllValuePaths.value : []
}
const handleClear = () => {
value.value = []
}
.cascader-custom-header-footer {
display: flex;
}
.cascader-custom-header-footer > div {
flex: 1;
text-align: center;
}
.cascader-custom-header-footer > div:not(:last-child) {
border-right: 1px solid var(--el-border-color);
}
.cascader-custom-header .el-checkbox {
display: flex;
height: unset;
}
가상 스크롤 2.14.0
대량의 데이터를 다룰 때 가상 스크롤을 활성화해서 성능을 높일 수 있어요.
virtual-scroll을 true로 설정하면 가상 스크롤이 활성화돼요. height로 메뉴 높이, item-size로 노드 높이를 커스터마이즈할 수도 있어요. 기본 높이는 204px, 기본 항목 크기는 34px이에요.
커스텀 제안 너비 2.14.0
제안 패널의 너비(필터링 시)는 기본적으로 매칭된 옵션의 최대 너비로 계산돼요. suggestion-item 슬롯으로 제안 옵션을 커스터마이즈하면 옵션에 표시되는 텍스트가 label 값과 같지 않아 계산 오류가 발생할 수 있어요. 이 경우 fit-input-width 속성으로 너비를 고정할 수 있어요. 값이 number면 너비는 특정 고정 픽셀 값이에요.
TIP
fit-input-width속성은 검색 중 제안 패널의 너비만 제어하며, 기본 cascader 패널에는 영향을 주지 않아요.
import { ref } from 'vue'
const value = ref()
const options = [
{
value: 'guide',
label: 'Guide',
children: [
{
value: 'disciplines',
label: 'Disciplines',
children: [
{ value: 'consistency', label: 'Consistency' },
{ value: 'feedback', label: 'Feedback' },
{ value: 'efficiency', label: 'Efficiency' },
{ value: 'controllability', label: 'Controllability' },
],
},
{
value: 'navigation',
label: 'Navigation',
children: [
{ value: 'side nav', label: 'Side Navigation' },
{ value: 'top nav', label: 'Top Navigation' },
],
},
],
},
]
Cascader API
Cascader Attributes
| Name | Description | Type | Default |
|---|---|---|---|
| model-value / v-model | 바인딩 값 | string / number /array | — |
| options | 옵션의 데이터, value와 label의 키는 CascaderProps로 커스터마이즈 가능 | array | — |
| props | 구성 옵션, 아래 CascaderProps 표 참고 | object | — |
| size | input의 크기 | enum | — |
| placeholder | input의 placeholder | string | — |
| disabled | Cascader 비활성화 여부 | boolean | — |
| clearable | 선택된 값을 지울 수 있는지 여부 | boolean | — |
| clear-icon 2.11.0 | 커스텀 클리어 아이콘 컴포넌트 | string / object | CircleClose |
| show-all-levels | 입력에서 선택된 값의 모든 레벨을 표시할지 여부 | boolean | true |
| collapse-tags | 다중 선택 모드에서 태그를 접을지 여부 | boolean | — |
| collapse-tags-tooltip | collapse-tags 텍스트 위에 마우스를 올리면 모든 선택된 태그를 표시할지 여부. 사용하려면 collapse-tags가 true여야 해요 | boolean | false |
| max-collapse-tags-tooltip-height 2.10.2 | collapse-tags tooltip의 최대 높이 | string / number | — |
| separator | 옵션 label 구분자 | string | ' / ' |
| filterable | 옵션 검색 가능 여부 | boolean | — |
| filter-method | 검색 로직 커스터마이즈, 첫 번째 파라미터는 노드, 두 번째는 키워드이고 매칭 여부를 나타내는 boolean을 반환해야 해요 | Function | — |
| debounce | 필터 키워드 입력 시 디바운스 지연(밀리초) | number | 300 |
| before-filter | 필터링 전 훅 함수, 필터링할 값을 파라미터로 받아요. false를 반환하거나 Promise가 반환된 뒤 거부되면 필터링이 중단돼요 | Function | — |
| popper-class | Cascader 드롭다운과 태그 tooltip의 커스텀 클래스 이름 | string | '' |
| popper-style | Cascader 드롭다운과 태그 tooltip의 커스텀 스타일 | string / object | — |
| teleported | cascader 팝업 텔레포트 여부 | boolean | true |
| effect 2.10.5 | tooltip 테마, 내장 테마: dark / light | enum / string | light |
| tag-type | 태그 타입 | enum | info |
| tag-effect 2.7.8 | 태그 효과 | enum | light |
| validate-event | 폼 검증 트리거 여부 | boolean | true |
| max-collapse-tags 2.3.10 | 표시할 최대 태그 수. 사용하려면 collapse-tags가 true여야 해요 | number | 1 |
| empty-values 2.7.0 | 컴포넌트의 빈 값, config-provider 참고 | array | — |
| value-on-clear 2.7.0 | 클리어 반환 값, config-provider 참고 | string / number / boolean / Function | — |
| persistent 2.7.8 | 드롭다운이 비활성 상태이고 persistent가 false면 드롭다운이 파괴돼요 | boolean | true |
| fallback-placements 2.8.1 | Tooltip popper.js의 가능한 위치 목록 | array | — |
| placement 2.8.1 | 드롭다운의 위치 | enum | bottom-start |
| popper-append-to-body deprecated | popper 메뉴를 body에 추가할지 여부. popper 위치가 잘못되면 이 prop을 false로 설정해볼 수 있어요 | boolean | true |
| show-checked-strategy 2.10.5 | 다중 선택 모드에서 체크된 노드의 표시 전략. 깔끔하게 하려면 parent를, 모든 항목이 중요하면 child를 사용해요 | enum | child |
| virtual-scroll 2.14.0 | 대량 데이터를 위한 가상 스크롤 활성화 여부 | boolean | false |
| fit-input-width 2.14.0 | 제안 패널의 너비를 입력과 같게 할지 여부, 값이 number면 너비가 고정돼요 | boolean / number | false |
| item-size 2.14.0 | 가상 스크롤의 노드 높이(px) | number | 34 |
| height 2.14.0 | 가상 스크롤의 메뉴 높이(px) | number | 204 |
Cascader Events
| Name | Description | Type |
|---|---|---|
| change | 바인딩 값이 변경될 때 실행돼요 | Function |
| expand-change | 확장 옵션이 변경될 때 실행돼요 | Function |
| blur | Cascader가 블러될 때 실행돼요 | Function |
| focus | Cascader가 포커스될 때 실행돼요 | Function |
| clear 2.7.7 | clearable Select에서 클리어 아이콘이 클릭될 때 실행돼요 | Function |
| visible-change | 드롭다운이 나타나거나 사라질 때 실행돼요 | Function |
| remove-tag | 다중 선택 모드에서 태그를 제거할 때 실행돼요 | Function |
Cascader Slots
| Name | Description | Type |
|---|---|---|
| default | cascader 노드의 커스텀 내용, 각각 현재 Node 객체와 노드 데이터예요 | object |
| empty | 매칭되는 옵션이 없을 때의 내용 | — |
| prefix 2.9.4 | Input 접두사 내용 | — |
| suggestion-item 2.9.5 | 검색 시 제안 항목의 커스텀 내용 | object |
| tag 2.10.3 | 커스텀 태그 스타일 | object |
| header 2.10.5 | 드롭다운 상단의 내용 | — |
| footer 2.10.5 | 드롭다운 하단의 내용 | — |
Cascader Exposes
| Name | Description | Type |
|---|---|---|
| getCheckedNodes | 현재 선택된 노드의 배열을 가져와요. (leafOnly) 리프 체크 노드만 반환할지 여부, 기본은 false | Function |
| cascaderPanelRef | cascader 패널 ref | object |
| togglePopperVisible 2.2.31 | popper의 표시 타입 토글 | Function |
| contentRef | cascader 내용 ref | object |
| presentText 2.8.4 | 선택된 내용 텍스트 | object |
| focus 2.11.8 | input 요소 포커스 | Function |
| blur 2.11.8 | input 요소 블러 | Function |
CascaderPanel API
CascaderPanel Attributes
| Name | Description | Type | Default |
|---|---|---|---|
| model-value / v-model | 바인딩 값 | string/number/array | — |
| options | 옵션의 데이터, value와 label의 키는 CascaderProps로 커스터마이즈 가능 | array | — |
| props | 구성 옵션, 아래 CascaderProps 표 참고 | object | — |
| virtual-scroll 2.14.0 | 대량 데이터를 위한 가상 스크롤 활성화 여부 | boolean | false |
| item-size 2.14.0 | 가상 스크롤의 노드 높이(px) | number | 34 |
| height 2.14.0 | 가상 스크롤의 메뉴 높이(px) | number | 204 |
CascaderPanel Events
| Name | Description | Type |
|---|---|---|
| change | 바인딩 값이 변경될 때 실행돼요 | Function |
| update:modelValue | 바인딩 값이 변경될 때 실행돼요 | Function |
| expand-change | 확장 옵션이 변경될 때 실행돼요 | Function |
| close | 패널 닫기 이벤트, 패널 접힘 판단을 위해 Cascader에 제공 | Function |
CascaderPanel Slots
| Name | Description | Type |
|---|---|---|
| default | cascader 노드의 커스텀 내용, 각각 현재 Node 객체와 노드 데이터예요 | object |
| empty 2.8.3 | 데이터가 없을 때 패널의 내용 | — |
CascaderPanel Exposes
| Name | Description | Type |
|---|---|---|
| getCheckedNodes | 현재 선택된 노드의 배열을 가져와요. (leafOnly) 리프 체크 노드만 반환할지 여부, 기본은 false | Function |
| clearCheckedNodes | 체크된 노드 지우기 | Function |
CascaderProps
| Attribute | Description | Type | Default |
|---|---|---|---|
| expandTrigger | 옵션 확장 트리거 모드 | enum | click |
| multiple | 다중 선택 활성화 여부 | boolean | false |
| checkStrictly | 노드의 체크 상태가 부모/자식 노드에 영향을 주지 않는지 여부 | boolean | false |
| emitPath | 체크된 노드가 변경될 때 노드 경로 배열을 emit할지 여부. false면 노드의 값만 emit해요 | boolean | true |
| lazy | 자식 노드를 동적 로드할지 여부, lazyload 속성과 함께 사용 | boolean | false |
| lazyLoad | 자식 노드 데이터 로드 메서드, lazy가 true일 때만 동작. reject 파라미터는 2.11.5부터 지원돼요 | Function | — |
| value | 노드 객체의 어느 키를 노드의 값으로 사용할지 지정 | string | value |
| label | 노드 객체의 어느 키를 노드의 label로 사용할지 지정 | string | label |
| children | 노드 객체의 어느 키를 노드의 children으로 사용할지 지정 | string | children |
| disabled | 노드 객체의 어느 키를 노드의 disabled로 사용할지 지정 | string | disabled |
| leaf | 노드 객체의 어느 키를 노드의 leaf 필드로 사용할지 지정 | string | leaf |
| hoverThreshold | 옵션 확장의 hover 임계값 | number | 500 |
| checkOnClickNode 2.10.5 | 노드를 클릭할 때 노드를 체크/해제할지 여부 | boolean | false |
| checkOnClickLeaf 2.10.5 | 리프 노드(마지막 자식)를 클릭할 때 체크/해제할지 여부 | boolean | true |
| showPrefix 2.10.5 | 라디오 또는 체크박스 접두사 표시 여부 | boolean | true |
타입 선언
type CascaderNodeValue = string | number
type CascaderNodePathValue = CascaderNodeValue[]
type CascaderValue =
| CascaderNodeValue
| CascaderNodePathValue
| (CascaderNodeValue | CascaderNodePathValue)[]
type Resolve = (data: any) => void
type ExpandTrigger = 'click' | 'hover'
type LazyLoad = (node: Node, resolve: Resolve, reject: () => void) => void
type isDisabled = (data: CascaderOption, node: Node) => boolean
type isLeaf = (data: CascaderOption, node: Node) => boolean
interface CascaderOption extends Record {
label?: string
value?: CascaderNodeValue
children?: CascaderOption[]
disabled?: boolean
leaf?: boolean
}
interface CascaderProps {
expandTrigger?: ExpandTrigger
multiple?: boolean
checkStrictly?: boolean
emitPath?: boolean
lazy?: boolean
lazyLoad?: LazyLoad
value?: string
label?: string
children?: string
disabled?: string | isDisabled
leaf?: string | isLeaf
hoverThreshold?: number
}
class Node {
readonly uid: number
readonly level: number
readonly value: CascaderNodeValue
readonly label: string
readonly pathNodes: Node[]
readonly pathValues: CascaderNodePathValue
readonly pathLabels: string[]
childrenData: ChildrenData
children: Node[]
text: string
loaded: boolean
/**
* Is it checked
*
* @default false
*/
checked: boolean
/**
* Used to indicate the intermediate state of unchecked and fully checked child nodes
*
* @default false
*/
indeterminate: boolean
/**
* Loading Status
*
* @default false
*/
loading: boolean
// getter
isDisabled: boolean
isLeaf: boolean
valueByOption: CascaderNodeValue | CascaderNodePathValue
// method
appendChild(childData: CascaderOption): Node
calcText(allLevels: boolean, separator: string): string
broadcast(): void
emit(): void
onParentCheck(checked: boolean): void
onChildCheck(): void
setCheckState(checked: boolean): void
doCheck(checked: boolean): void
}
Node as CascaderNode