index.jsx 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import { defineComponent, onMounted, ref, watch, nextTick } from 'vue'
  2. import { ElPopover } from 'element-plus'
  3. import './index.less'
  4. export default defineComponent({
  5. name: 'CipOverflowTooltip',
  6. props: {
  7. placement: {
  8. type: String,
  9. default: 'top',
  10. validate: (value) => {
  11. return ['top', 'top-start', 'top-end', 'bottom', 'bottom-start', 'bottom-end', 'left', 'left-start', 'left-end', 'right', 'right-start', 'right-end'].includes(value)
  12. }
  13. },
  14. trigger: {
  15. type: String,
  16. default: 'hover',
  17. validate: (value) => {
  18. return ['click', 'focus', 'hover', 'manual'].includes(value)
  19. }
  20. },
  21. rowKey: {}
  22. },
  23. setup (props, { slots }) {
  24. const wrapperRef = ref()
  25. const isOverflow = ref(false)
  26. const computeOverflow = () => {
  27. const el = wrapperRef.value
  28. el.style.whiteSpace = 'nowrap'
  29. const parentElement = el.parentElement
  30. parentElement.style.overflow = 'hidden'
  31. // isOverflow.value =
  32. return el.scrollWidth > parentElement.offsetWidth
  33. }
  34. onMounted(() => {
  35. watch(() => props.rowKey, () => {
  36. isOverflow.value = false
  37. nextTick(() => {
  38. isOverflow.value = computeOverflow()
  39. })
  40. }, { immediate: true, deep: true })
  41. })
  42. return () => {
  43. return <div ref={wrapperRef}>
  44. {!isOverflow.value && slots.default?.()}
  45. {isOverflow.value &&
  46. <ElPopover trigger={props.trigger} placement={props.placement}>
  47. {{
  48. reference: () => <div class={'text-ellipsis'}>{slots.default?.()}</div>,
  49. default: () => slots.default?.()
  50. }}
  51. </ElPopover>
  52. }
  53. </div>
  54. }
  55. }
  56. })