AppTableEllipsis.vue 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. <template>
  2. <a-typography-text
  3. :key="instanceKey"
  4. class="app-table-ellipsis"
  5. :ellipsis="ellipsisConfig"
  6. >
  7. {{ displayText }}
  8. </a-typography-text>
  9. </template>
  10. <script setup>
  11. import { computed, useSlots } from 'vue'
  12. const props = defineProps({
  13. /** 单元格展示文本,优先于默认插槽 */
  14. content: { type: [String, Number], default: '' },
  15. /** 行/列唯一标识,避免表格复用单元格时省略组件状态残留 */
  16. rowKey: { type: [String, Number], default: '' },
  17. rows: { type: Number, default: 3 }
  18. })
  19. const slots = useSlots()
  20. const displayText = computed(() => {
  21. if (props.content !== '' && props.content !== null && props.content !== undefined) {
  22. return String(props.content)
  23. }
  24. const slot = slots.default?.()
  25. if (!slot || slot.length === 0) return '-'
  26. const text = slot
  27. .map((node) => {
  28. if (typeof node.children === 'string') return node.children
  29. if (Array.isArray(node.children)) {
  30. return node.children.filter((item) => typeof item === 'string').join('')
  31. }
  32. return ''
  33. })
  34. .join('')
  35. .trim()
  36. return text || '-'
  37. })
  38. const instanceKey = computed(() => `${props.rowKey}::${displayText.value}`)
  39. const ellipsisConfig = computed(() => ({
  40. rows: props.rows,
  41. showTooltip: true,
  42. css: true
  43. }))
  44. </script>
  45. <style scoped lang="less">
  46. .app-table-ellipsis {
  47. display: block;
  48. margin: 0;
  49. max-width: 100%;
  50. word-break: break-word;
  51. overflow-wrap: anywhere;
  52. }
  53. </style>