在一次后台列表开发中,由于表格字段没多少,所以把备注字段也在表格展示了出来,但是因为备注字数较大,所以给 el-table-column 添加了 show-overflow-tooltip
属性。但是,由于备注真的很长,所以显示的文字提示横向占了整个窗口,天哪,这也太难看了,于是想到了使用 sass 去控制长度,就这样解决了。
但是,需求往往没有这么简单,又要求显示的字体提示要保留一定的格式,如换行。那这…没办法,只能自己写组件了。
<template>
<div class="tipContainer"
ref="tipContainer">
<el-tooltip
:disabled="!enableTip"
ref="tooltip"
class="item"
:effect="effect"
:placement="placement"
v-bind="$attrs">
<div class="table-tooltip-tip" slot="content">{{ value }}div>
<span
class="table-tooltip-content"
ref="tooltipContent"
v-if="noSlot"
:class="{'ellipsis': enableTip}">{{ value }}span>
<slot v-else>slot>
el-tooltip>
div>
template>
<script>
export default {
name: "TableTooltip",
props: {
// 始终保持提示tip
tipKeep: Boolean,
// 内容
value: String,
// 提示位置
placement: {
type: String,
default: 'top'
},
// 提示主题
effect: {
type: String,
default: 'dark'
}
},
data() {
return {
enableTip: false
}
},
computed: {
noSlot() {
// 判断有没有插槽(默认插槽除外)
return !this.$slots.default;
}
},
mounted() {
// 比较文字提示组件与父级宽度,用于判断要不要启用文字提示与显示省略号
if (this.$refs.tipContainer && this.$refs.tooltipContent) {
const tipWidth = this.$refs.tipContainer.offsetWidth;
const tipContentWidth = this.$refs.tooltipContent.offsetWidth;
this.enableTip = tipWidth < tipContentWidth;
}
}
}
script>
<style lang="scss" scoped>
.tipContainer {
overflow: hidden;
width: 100%;
}
.table-tooltip-tip {
max-width: 600px;
white-space: pre-wrap;
}
.table-tooltip-content {
white-space: nowrap;
&.ellipsis {
display: block;
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
-o-text-overflow: ellipsis;
}
}
style>
重新封装了 elementui 的 Tooltip 文字提示
组件,通过比较文字提示组件宽度与父级的宽度,来启用提示与显示省略号,然后利用 white-space: pre-wrap;
来格式化文字提示内容。