diff --git a/examples/sites/demos/apis/select.js b/examples/sites/demos/apis/select.js index 719095a888..c48209760a 100644 --- a/examples/sites/demos/apis/select.js +++ b/examples/sites/demos/apis/select.js @@ -544,6 +544,20 @@ export default { pcDemo: 'tag-type', mfDemo: 'tag-type' }, + { + name: 'max-tag-width', + type: 'string', + defaultValue: '', + desc: { + 'zh-CN': '多选时,设置最大标签宽度', + 'en-US': 'When multiple selections are made, set the maximum label width.' + }, + mode: ['pc', 'mobile-first'], + pcDemo: '', + meta: { + stable: '3.22.0' + } + }, { name: 'text-field', type: 'string', diff --git a/examples/sites/demos/apis/tag.js b/examples/sites/demos/apis/tag.js index f88a5df7ba..e975ec0090 100644 --- a/examples/sites/demos/apis/tag.js +++ b/examples/sites/demos/apis/tag.js @@ -54,6 +54,20 @@ export default { mode: ['mobile-first'], mfDemo: '' }, + { + name: 'max-width', + type: 'string', + defaultValue: '', + desc: { + 'zh-CN': '设置最大宽度', + 'en-US': 'set max width' + }, + mode: ['pc', 'mobile-first'], + pcDemo: 'max-width', + meta: { + stable: '3.22.0' + } + }, { name: 'disabled', type: 'boolean', diff --git a/examples/sites/demos/pc/app/tag/max-width-composition-api.vue b/examples/sites/demos/pc/app/tag/max-width-composition-api.vue new file mode 100644 index 0000000000..577a86e602 --- /dev/null +++ b/examples/sites/demos/pc/app/tag/max-width-composition-api.vue @@ -0,0 +1,16 @@ + + + + + diff --git a/examples/sites/demos/pc/app/tag/max-width.spec.ts b/examples/sites/demos/pc/app/tag/max-width.spec.ts new file mode 100644 index 0000000000..ffaff39f99 --- /dev/null +++ b/examples/sites/demos/pc/app/tag/max-width.spec.ts @@ -0,0 +1,10 @@ +import { test, expect } from '@playwright/test' + +test('测试最大宽度', async ({ page }) => { + page.on('pageerror', (exception) => expect(exception).not.toBeNull()) + await page.goto('tag#max-width') + + const normal = page.getByText('文本超长超长的标签') + + await expect(normal).toHaveCSS('max-width', '80px') +}) diff --git a/examples/sites/demos/pc/app/tag/max-width.vue b/examples/sites/demos/pc/app/tag/max-width.vue new file mode 100644 index 0000000000..e4cc16197f --- /dev/null +++ b/examples/sites/demos/pc/app/tag/max-width.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/examples/sites/demos/pc/app/tag/webdoc/tag.js b/examples/sites/demos/pc/app/tag/webdoc/tag.js index 69190b3858..54be68cc6b 100644 --- a/examples/sites/demos/pc/app/tag/webdoc/tag.js +++ b/examples/sites/demos/pc/app/tag/webdoc/tag.js @@ -76,6 +76,18 @@ export default { }, codeFiles: ['size.vue'] }, + { + demoId: 'max-width', + name: { + 'zh-CN': '最大宽度', + 'en-US': 'Max width' + }, + desc: { + 'zh-CN': '通过 maxWidth 设置最大宽度 。', + 'en-US': 'Set the maxWidth through maxWidth.' + }, + codeFiles: ['max-width.vue'] + }, { demoId: 'disabled', name: { diff --git a/packages/theme-saas/src/tag/index.less b/packages/theme-saas/src/tag/index.less index a3042c71b8..29ec126555 100644 --- a/packages/theme-saas/src/tag/index.less +++ b/packages/theme-saas/src/tag/index.less @@ -15,6 +15,10 @@ @apply whitespace-nowrap; @apply inline-flex; @apply items-center; + + @apply overflow-hidden; + @apply text-ellipsis; + .tag-variant( theme('colors.color.info.primary.DEFAULT'), theme('colors.transparent'), diff --git a/packages/theme/src/tag/index.less b/packages/theme/src/tag/index.less index 9862637001..8bfeccba03 100644 --- a/packages/theme/src/tag/index.less +++ b/packages/theme/src/tag/index.less @@ -24,7 +24,7 @@ height: fit-content; // 避免 flex时,高度拉伸 line-height: var(--tv-Tag-line-height); border: 1px solid; - max-width: 200px; // 新增约束,避免太长的标签 + max-width: 200px; // 默认约束,避免太长的标签,用户还可以再通过属性,覆盖到style上. white-space: nowrap; text-overflow: ellipsis; overflow: hidden; diff --git a/packages/vue/src/select/src/index.ts b/packages/vue/src/select/src/index.ts index e614bc7497..d0a306d123 100644 --- a/packages/vue/src/select/src/index.ts +++ b/packages/vue/src/select/src/index.ts @@ -362,6 +362,11 @@ export default defineComponent({ showAllTextTag: { type: Boolean, default: false + }, + // 配置多选时,Tag的最大宽度 + maxTagWidth: { + type: [String, Number], + default: null } }, setup(props, context) { diff --git a/packages/vue/src/select/src/mobile-first.vue b/packages/vue/src/select/src/mobile-first.vue index 28555cd953..92b102901b 100644 --- a/packages/vue/src/select/src/mobile-first.vue +++ b/packages/vue/src/select/src/mobile-first.vue @@ -27,8 +27,8 @@ multiple && !state.selectDisabled && state.selected.length ? state.selected.map((item) => (item.state ? item.state.currentLabel : item.currentLabel)).join('; ') : !multiple && state.selectDisabled - ? state.selectedLabel - : '' + ? state.selectedLabel + : '' " > + {{ state.selectedVal.length - 1 }} @@ -139,6 +141,7 @@ key="tags-collapse" :closable="false" :size="state.collapseTagSize" + :maxWidth="maxTagWidth" >+ {{ state.collapseTagsLength }} + {{ state.selected.length - 1 }} @@ -135,6 +137,7 @@ :closable="true" :size="state.collapseTagSize" @close="toggleCheckAll(false)" + :maxWidth="maxTagWidth" > {{ allText || t('ui.base.all') }} @@ -150,6 +153,7 @@ :closable="false" :size="state.collapseTagSize" @click="onClickCollapseTag($event)" + :maxWidth="maxTagWidth" > @@ -168,6 +172,7 @@ :type="state.getTagType" @close="deleteTag($event, item)" disable-transitions + :maxWidth="maxTagWidth" > + {value ? {value} : slots.default && slots.default()} {closable && (