From 283fa72bc999f9dfaf3db3ad17cf7706b5702dac Mon Sep 17 00:00:00 2001 From: Zhong Date: Thu, 24 Jul 2025 20:03:41 +0800 Subject: [PATCH] feat(components): [cascader] add header and footer slot (#21486) * feat(components): [cascader] add header and footer slot * docs(components): [cascader] simplify the code * docs(components): [cascader] merge header and footer example * docs(components): [cascader] add clear case --- docs/en-US/component/cascader.md | 12 ++ .../cascader/custom-header-footer.vue | 123 ++++++++++++++++++ packages/components/cascader/src/cascader.vue | 6 + packages/theme-chalk/src/cascader.scss | 10 ++ packages/theme-chalk/src/common/var.scss | 10 ++ 5 files changed, 161 insertions(+) create mode 100644 docs/examples/cascader/custom-header-footer.vue diff --git a/docs/en-US/component/cascader.md b/docs/en-US/component/cascader.md index 3561c3f12f..bb5cc3424f 100644 --- a/docs/en-US/component/cascader.md +++ b/docs/en-US/component/cascader.md @@ -148,6 +148,16 @@ cascader/custom-tag ::: +## Custom Header & Footer of the Dropdown ^(2.10.5) + +You can customize both the header and footer of the dropdown using slots. + +:::demo Use slot to customize the content. + +cascader/custom-header-footer + +::: + ## Click to Select Node ^(2.10.5) Allows selecting nodes by clicking, with optional control visibility. @@ -214,6 +224,8 @@ cascader/check-on-click-node | prefix ^(2.9.4) | content as Input prefix | — | | suggestion-item ^(2.9.5) | custom content for suggestion item when searching | ^[object]`{ item: CascaderNode }` | | tag ^(2.10.3) | custom tags style | ^[object]`{ data: Tag[], deleteTag: (tag: Tag) => void }` | +| header ^(2.10.5) | content at the top of the dropdown | — | +| footer ^(2.10.5) | content at the bottom of the dropdown | — | ### Cascader Exposes diff --git a/docs/examples/cascader/custom-header-footer.vue b/docs/examples/cascader/custom-header-footer.vue new file mode 100644 index 0000000000..425f086fe8 --- /dev/null +++ b/docs/examples/cascader/custom-header-footer.vue @@ -0,0 +1,123 @@ + + + + + diff --git a/packages/components/cascader/src/cascader.vue b/packages/components/cascader/src/cascader.vue index 1028dda097..a3e9dbdb22 100644 --- a/packages/components/cascader/src/cascader.vue +++ b/packages/components/cascader/src/cascader.vue @@ -149,6 +149,9 @@ diff --git a/packages/theme-chalk/src/cascader.scss b/packages/theme-chalk/src/cascader.scss index 9c6008db21..4b8e5c5264 100644 --- a/packages/theme-chalk/src/cascader.scss +++ b/packages/theme-chalk/src/cascader.scss @@ -154,6 +154,16 @@ } } + @include e(header) { + padding: map.get($cascader-dropdown, 'header-padding'); + border-bottom: map.get($cascader-dropdown, 'border'); + } + + @include e(footer) { + padding: map.get($cascader-dropdown, 'footer-padding'); + border-top: map.get($cascader-dropdown, 'border'); + } + @include e(tags) { position: absolute; left: 0; diff --git a/packages/theme-chalk/src/common/var.scss b/packages/theme-chalk/src/common/var.scss index c72717b368..2adfea73cf 100644 --- a/packages/theme-chalk/src/common/var.scss +++ b/packages/theme-chalk/src/common/var.scss @@ -705,6 +705,16 @@ $cascader-search-input-margin-left: map.merge( $cascader-search-input-margin-left ); +$cascader-dropdown: () !default; +$cascader-dropdown: map.merge( + ( + 'header-padding': 10px, + 'footer-padding': 10px, + 'border': 1px solid getCssVar('border-color-light'), + ), + $cascader-dropdown +); + //statistic // css3 var in packages/theme-chalk/src/statistic.scss $statistic: () !default;