feat(components): [cascader] lazyLoad support reject (#22283)

* feat(components): [cascader] `lazyLoad` support reject

* feat: update

* fix: update

* feat: remove unnecessary change

* test: add new test

* fix: update

* feat: update

* docs: update

* docs: update
This commit is contained in:
btea
2025-09-29 18:27:16 +08:00
committed by GitHub
parent 896815b986
commit 046815e33d
5 changed files with 173 additions and 20 deletions

View File

@@ -83,6 +83,7 @@ const slots = useSlots()
let store: Store
const initialLoaded = ref(true)
const initialLoadedOnce = ref(false)
const menuList = ref<CascaderMenuInstance[]>([])
const checkedValue = ref<CascaderValue>()
const menus = ref<CascaderNode[][]>([])
@@ -128,9 +129,20 @@ const lazyLoad: ElCascaderPanelContext['lazyLoad'] = (node, cb) => {
_node.childrenData = _node.childrenData || []
dataList && store?.appendNodes(dataList, parent as Node)
dataList && cb?.(dataList)
if (node.level === 0) {
initialLoadedOnce.value = true
}
}
cfg.lazyLoad(node, resolve)
const reject = () => {
node!.loading = false
node!.loaded = false
if (node!.level === 0) {
initialLoaded.value = true
}
}
cfg.lazyLoad(node, resolve, reject)
}
const expandNode: ElCascaderPanelContext['expandNode'] = (node, silent) => {
@@ -376,6 +388,11 @@ watch(
}
)
const loadLazyRootNodes = () => {
if (initialLoadedOnce.value) return
initStore()
}
onBeforeUpdate(() => (menuList.value = []))
onMounted(() => !isEmpty(props.modelValue) && syncCheckedValue())
@@ -397,5 +414,6 @@ defineExpose({
clearCheckedNodes,
calculateCheckedValue,
scrollToExpandingNode,
loadLazyRootNodes,
})
</script>

View File

@@ -14,7 +14,11 @@ export type ExpandTrigger = 'click' | 'hover'
export type isDisabled = (data: CascaderOption, node: CascaderNode) => boolean
export type isLeaf = (data: CascaderOption, node: CascaderNode) => boolean
export type Resolve = (dataList?: CascaderOption[]) => void
export type LazyLoad = (node: CascaderNode, resolve: Resolve) => void
export type LazyLoad = (
node: CascaderNode,
resolve: Resolve,
reject: () => void
) => void
export interface RenderLabelProps {
node: CascaderNode
data: CascaderOption