From 7f1df6333de2230d87513c354aa26a559729ea89 Mon Sep 17 00:00:00 2001 From: kamesan012 <1335951429@qq.com> Date: Thu, 13 Nov 2025 10:04:49 +0800 Subject: [PATCH] feat: add optional ellipse to cascader options --- src/_internal/select-menu/src/SelectMenu.tsx | 7 +++++++ src/_internal/select-menu/src/SelectOption.tsx | 14 +++++++++++++- src/cascader/src/Cascader.tsx | 5 +++++ src/cascader/src/CascaderOption.tsx | 13 ++++++++++--- src/cascader/src/CascaderSelectMenu.tsx | 3 +++ src/cascader/src/interface.ts | 1 + 6 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/_internal/select-menu/src/SelectMenu.tsx b/src/_internal/select-menu/src/SelectMenu.tsx index 76681a4d4a6..0d9b31a2866 100644 --- a/src/_internal/select-menu/src/SelectMenu.tsx +++ b/src/_internal/select-menu/src/SelectMenu.tsx @@ -84,6 +84,10 @@ export default defineComponent({ type: Boolean, default: true }, + showEllipse: { + type: Boolean as PropType, + default: false + }, labelField: { type: String, default: 'label' @@ -423,6 +427,7 @@ export default defineComponent({ } useOnResize(selfRef, props.onResize) return { + showEllipse: props.showEllipse, mergedTheme: themeRef, mergedClsPrefix: mergedClsPrefixRef, rtlEnabled: rtlEnabledRef, @@ -543,6 +548,7 @@ export default defineComponent({ /> ) : tmNode.ignored ? null : ( } @@ -570,6 +576,7 @@ export default defineComponent({ /> ) : ( } diff --git a/src/_internal/select-menu/src/SelectOption.tsx b/src/_internal/select-menu/src/SelectOption.tsx index 48044307daf..668c752302f 100644 --- a/src/_internal/select-menu/src/SelectOption.tsx +++ b/src/_internal/select-menu/src/SelectOption.tsx @@ -5,6 +5,7 @@ import type { RenderLabelImpl, RenderOptionImpl } from './interface' import { useMemo } from 'vooks' import { defineComponent, h, inject, Transition } from 'vue' import { mergeEventHandlers, render } from '../../../_utils' +import { NEllipsis } from '../../../ellipsis' import { NBaseIcon } from '../../icon' import { CheckmarkIcon } from '../../icons' import { internalSelectionMenuInjectionKey } from './interface' @@ -39,6 +40,10 @@ export default defineComponent({ tmNode: { type: Object as PropType>, required: true + }, + showEllipse: { + type: Boolean as PropType, + default: false } }, setup(props) { @@ -88,6 +93,7 @@ export default defineComponent({ const { parent } = tmNode return parent && parent.rawNode.type === 'group' }), + showEllipse: props.showEllipse, showCheckmark: showCheckmarkRef, nodeProps: nodePropsRef, isPending: isPendingRef, @@ -165,7 +171,13 @@ export default defineComponent({ ])} onMousemove={mergeEventHandlers([handleMouseMove, attrs?.onMousemove])} > -
{children}
+
+ {this.showEllipse ? ( + {children} + ) : ( + children + )} +
) return rawNode.render diff --git a/src/cascader/src/Cascader.tsx b/src/cascader/src/Cascader.tsx index dddba70216b..917164198eb 100644 --- a/src/cascader/src/Cascader.tsx +++ b/src/cascader/src/Cascader.tsx @@ -127,6 +127,10 @@ export const cascaderProps = { type: Boolean as PropType, default: undefined }, + showEllipse: { + type: Boolean as PropType, + default: false + }, maxTagCount: [String, Number] as PropType, ellipsisTagPopoverProps: Object as PropType, menuProps: Object as PropType, @@ -925,6 +929,7 @@ export default defineComponent({ hoverKeyPathRef, mergedCheckStrategyRef, showCheckboxRef, + showEllipseRef: toRef(props, 'showEllipse'), cascadeRef: toRef(props, 'cascade'), multipleRef: toRef(props, 'multiple'), keyboardKeyRef, diff --git a/src/cascader/src/CascaderOption.tsx b/src/cascader/src/CascaderOption.tsx index 5345ffe8f27..e8d85d5fe81 100644 --- a/src/cascader/src/CascaderOption.tsx +++ b/src/cascader/src/CascaderOption.tsx @@ -6,6 +6,7 @@ import { computed, defineComponent, h, inject, Transition } from 'vue' import { NBaseIcon, NBaseLoading } from '../../_internal' import { CheckmarkIcon, ChevronRightIcon } from '../../_internal/icons' import { NCheckbox } from '../../checkbox' +import { NEllipsis } from '../../ellipsis' import { cascaderInjectionKey } from './interface' export default defineComponent({ @@ -34,6 +35,7 @@ export default defineComponent({ mergedThemeRef, labelFieldRef, showCheckboxRef, + showEllipseRef, renderPrefixRef, renderSuffixRef, updateHoverKey, @@ -167,6 +169,7 @@ export default defineComponent({ keyboardPending: keyboardPendingRef, isLoading: isLoadingRef, showCheckbox: showCheckboxRef, + showEllipse: showEllipseRef, isLeaf: isLeafRef, disabled: disabledRef, label: labelRef, @@ -286,9 +289,13 @@ export default defineComponent({ > {prefixNode} - {renderLabel - ? renderLabel(this.tmNode.rawNode, this.checked) - : this.label} + {renderLabel ? ( + renderLabel(this.tmNode.rawNode, this.checked) + ) : this.showEllipse ? ( + {this.label} + ) : ( + this.label + )} {suffixNode} diff --git a/src/cascader/src/CascaderSelectMenu.tsx b/src/cascader/src/CascaderSelectMenu.tsx index 0e04f323d34..3dacd6b9855 100644 --- a/src/cascader/src/CascaderSelectMenu.tsx +++ b/src/cascader/src/CascaderSelectMenu.tsx @@ -59,6 +59,7 @@ export default defineComponent({ }, setup(props) { const { + showEllipseRef, isMountedRef, mergedValueRef, mergedClsPrefixRef, @@ -171,6 +172,7 @@ export default defineComponent({ enter } return { + showEllipse: showEllipseRef, isMounted: isMountedRef, mergedTheme: mergedThemeRef, mergedClsPrefix: mergedClsPrefixRef, @@ -197,6 +199,7 @@ export default defineComponent({ clsPrefix={mergedClsPrefix} class={`${mergedClsPrefix}-cascader-menu`} autoPending + showEllipse={this.showEllipse} themeOverrides={ mergedTheme.peerOverrides.InternalSelectMenu } diff --git a/src/cascader/src/interface.ts b/src/cascader/src/interface.ts index 7c265408303..f96b762ce69 100644 --- a/src/cascader/src/interface.ts +++ b/src/cascader/src/interface.ts @@ -79,6 +79,7 @@ export interface CascaderInjection { optionHeightRef: Ref labelFieldRef: Ref showCheckboxRef: Ref + showEllipseRef: Ref getColumnStyleRef: Ref< ((detail: { level: number }) => string | CSSProperties) | undefined >