当前位置:   article > 正文

显示隐藏会根据长短变化的tooltip组件(自用留档)_el-tooltip根据内容显示隐藏

el-tooltip根据内容显示隐藏
  1. <!-- vp-tooltip.vue -->
  2. <template>
  3. <div
  4. class="vp-tooltip"
  5. @mouseenter="handleCellMouseEnter"
  6. @mouseleave="handleCellMouseLeave"
  7. >
  8. <div :class="classObj" :style="styleObj">
  9. <slot></slot>
  10. </div>
  11. <el-tooltip ref="tooltip" placement="top" :content="tooltipContent">
  12. <template v-if="$slots.content" #content>
  13. <slot name="content"></slot>
  14. </template>
  15. </el-tooltip>
  16. </div>
  17. </template>
  18. <script>
  19. import debounce from "throttle-debounce/debounce";
  20. import { getStyle, hasClass } from "element-ui/src/utils/dom";
  21. /**
  22. * 显隐可控的tooltip组件
  23. * @desc 基于element-ui抽离,组件内部自动计算文本是否超宽来决定tooltip调用与否
  24. */
  25. export default {
  26. name: "VpTooltip",
  27. componentName: "VpTooltip",
  28. props: {
  29. // 限定超宽范围
  30. width: {
  31. String,
  32. default: "180px",
  33. },
  34. // tooltip显示的内容
  35. content: String,
  36. // cell自定义样式
  37. cellStyle: {
  38. type: Object,
  39. default: () => ({}),
  40. },
  41. // 保留属性,意义不大,纯粹为了与源码结构保持一致
  42. showOverflowTooltip: {
  43. type: Boolean,
  44. default: true,
  45. },
  46. },
  47. data() {
  48. return {
  49. tooltipContent: "",
  50. };
  51. },
  52. computed: {
  53. classObj() {
  54. return {
  55. cell: true,
  56. "el-tooltip": this.showOverflowTooltip,
  57. };
  58. },
  59. styleObj() {
  60. return {
  61. ...this.cellStyle,
  62. width: this.width,
  63. };
  64. },
  65. },
  66. created() {
  67. // 防抖函数保护,避免鼠标键入后n秒内多次调用
  68. this.activateTooltip = debounce(50, (tooltip) =>
  69. tooltip.handleShowPopper()
  70. );
  71. },
  72. methods: {
  73. // 鼠标键入显示tooltip
  74. handleCellMouseEnter(event) {
  75. // 无提示内容直接返回
  76. if (!this.content && !this.$slots.content) {
  77. return;
  78. }
  79. const cell = event.target;
  80. // 判断是否text-overflow, 如果是就显示tooltip
  81. const cellChild = event.target.querySelector(".cell");
  82. if (!(hasClass(cellChild, "el-tooltip") && cellChild.childNodes.length)) {
  83. return;
  84. }
  85. // use range width instead of scrollWidth to determine whether the text is overflowing
  86. // to address a potential FireFox bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1074543#c3
  87. const range = document.createRange();
  88. range.setStart(cellChild, 0);
  89. range.setEnd(cellChild, 1);
  90. const rangeWidth = range.getBoundingClientRect().width;
  91. const padding =
  92. (parseInt(getStyle(cellChild, "paddingLeft"), 10) || 0) +
  93. (parseInt(getStyle(cellChild, "paddingRight"), 10) || 0);
  94. // 判断文本 + padding的宽度是否超过容器宽度
  95. if (
  96. (rangeWidth + padding > cellChild.offsetWidth ||
  97. cellChild.scrollWidth > cellChild.offsetWidth) &&
  98. this.$refs.tooltip
  99. ) {
  100. const tooltip = this.$refs.tooltip;
  101. // TODO 会引起整个 Table 的重新渲染,需要优化
  102. this.tooltipContent = this.content; // 这里为啥写这行类似1=1的代码呢,纯粹为了与源码结构保持一致
  103. tooltip.referenceElm = cell;
  104. tooltip.$refs.popper && (tooltip.$refs.popper.style.display = "none");
  105. tooltip.doDestroy();
  106. tooltip.setExpectedState(true);
  107. this.activateTooltip(tooltip);
  108. }
  109. },
  110. // 鼠标移出关闭tooltip
  111. handleCellMouseLeave() {
  112. const tooltip = this.$refs.tooltip;
  113. if (tooltip) {
  114. tooltip.setExpectedState(false);
  115. tooltip.handleClosePopper();
  116. }
  117. },
  118. },
  119. };
  120. </script>
  121. <style scoped>
  122. .vp-tooltip .cell {
  123. box-sizing: border-box;
  124. word-break: break-all;
  125. /* padding-left: 10px; */
  126. padding-right: 10px;
  127. overflow: hidden;
  128. text-overflow: ellipsis;
  129. white-space: nowrap;
  130. }
  131. </style>

使用的时候

import Vptip from "@/components/vptip" // 自定义Tooltip 文字提示

  1.  <Vptip :content="item.templateFieldName" :width="'100%'" style="max-width: 500px;" class="item">
  2. {{ `${item.templateFieldName}` }}
  3. </Vptip>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/91863
推荐阅读
相关标签
  

闽ICP备14008679号