index.jsx 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import { defineComponent, onMounted, ref, watch, nextTick } from 'vue'
  2. import { ElPopover } from 'element-plus'
  3. import { generateProps } from '../helper/component-util'
  4. import { componentScheme } from './component.scheme'
  5. import './index.less'
  6. export default defineComponent({
  7. name: 'CipOverflowTooltip',
  8. props: generateProps(componentScheme),
  9. setup (props, { slots }) {
  10. const wrapperRef = ref()
  11. const isOverflow = ref(false)
  12. const computeOverflow = () => {
  13. const el = wrapperRef.value
  14. el.style.whiteSpace = 'nowrap'
  15. const parentElement = el.parentElement
  16. parentElement.style.overflow = 'hidden'
  17. // isOverflow.value =
  18. return el.scrollWidth > parentElement.offsetWidth
  19. }
  20. onMounted(() => {
  21. watch(() => props.rowKey, () => {
  22. isOverflow.value = false
  23. nextTick(() => {
  24. isOverflow.value = computeOverflow()
  25. })
  26. }, { immediate: true, deep: true })
  27. })
  28. return () => {
  29. return <div ref={wrapperRef}>
  30. {!isOverflow.value && slots.default?.()}
  31. {isOverflow.value &&
  32. <ElPopover trigger={props.trigger} placement={props.placement}>
  33. {{
  34. reference: () => <div class={'text-ellipsis'}>{slots.default?.()}</div>,
  35. default: () => slots.default?.()
  36. }}
  37. </ElPopover>
  38. }
  39. </div>
  40. }
  41. }
  42. })