el-table中控制单列内容多行超出省略及tooltip

业务场景

  1. el-table列中某列要求两行超出才超出省略并悬浮展示
  2. 对悬浮展示的内容要求到达一定字数时截断并添加...

实现方法

  • 如果只需要实现两行才省略无需自定义tooltip,直接覆盖原有认样式
javascript 复制代码
.el-table .cell.el-tooltip {
	display: -webkit-box;
	-webkit-box-orient: vertical;
	line-clamp: 2;
	-webkit-line-clamp: 2;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: normal !important;
}
  • 但既需要对表格中的内容进行控制,又需要对悬浮层的内容控制只能在插槽中利用自定义tooltip实现。

如以下:在表格列实现两行超出显示省略号,并在悬浮时展示2000字符截断Tooltip,主要依赖计算动态控制Tooltip的显隐

状态与方法初始化

在Vue组件的<script setup>中定义响应式状态和核心方法:

  • tooltipStates存储每行Tooltip的禁用状态
  • descriptionRefs保存每行DOM元素的引用
  • truncateText函数限制Tooltip内容在2000字符内
  • setDescriptionRef函数管理DOM引用
  • checkTextOverflow函数通过DOM测量判断文本溢出

表格列配置

在ElTable列的render函数中定制单元格内容:

  • 禁用默认Tooltip(showOverflowTooltip: false
  • 使用ElTooltip包裹内容,动态绑定disabled属性
  • 应用多行截断CSS样式(-webkit-line-clamp: 2
  • 绑定ref回调和鼠标移入事件

CSS样式实现

内联应用多行文本截断样式:

css 复制代码
display: -webkit-box;
-webkit-line-clamp: 2;//以两行为例
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;

完整代码示例

html 复制代码
<script setup>
import { reactive } from 'vue';
import { ElTooltip } from 'element-plus';

const tooltipStates = reactive({});
const descriptionRefs = reactive({});

const truncateText = (text, limit) => {
    if (!text) return '';
    const str = String(text);
    return str.length <= limit ? str : str.substring(0, limit) + '...';
};

const setDescriptionRef = (el, id) => {
    el ? descriptionRefs[id] = el : delete descriptionRefs[id];
};

const checkTextOverflow = (id) => {
    const element = descriptionRefs[id];
    if (!element) return;
    tooltipStates[id] = element.scrollHeight > element.clientHeight;
};

const tableColumns = [{
    label: '内容',
    showOverflowTooltip: false,
    render: (scope) => {
        const rowId = scope.row.id;
        const originalText = scope.row.content || '';
        const content = truncateText(originalText, 2000);
        
        return (
            <ElTooltip
                placement="top"
                disabled={!tooltipStates[rowId]}
                content={content}
            >
             <div
                ref={(el) => setDescriptionRef(el, rowId)}
                onMouseenter={() => checkTextOverflow(rowId)}
                style={{
                  whiteSpace: 'normal',
                  wordBreak: 'break-all',
                  display: '-webkit-box',
                  WebkitLineClamp: 2,
                  WebkitBoxOrient: 'vertical',
                  overflow: 'hidden',
                  textOverflow: 'ellipsis',
                  width: '100%'
                }}>
            </ElTooltip>
        );
    }
}];
</script>

注意事项

  • 确保每行数据有唯一标识(如id),用于状态管理
  • 大量数据时需注意内存泄漏问题,及时清理无用引用
相关推荐
Cobyte12 分钟前
4.响应式系统基础:从发布订阅模式的角度理解 Vue3 的数据响应式原理
前端·javascript·vue.js
晓得迷路了14 分钟前
栗子前端技术周刊第 124 期 - ESLint v10.2.0、React Native 0.85、Node.js 25.9.0...
前端·javascript·eslint
星空椰22 分钟前
JavaScript基础:运算符和流程控制
开发语言·javascript·ecmascript
禅思院35 分钟前
使用 VueUse 构建一个支持暂停/重置的 CountUp 组件
前端·vue.js·架构
窝子面1 小时前
NestJs+MongoDB+Deepseek+Langchain实现ai聊天助手
javascript·数据库·人工智能·mongodb
吴声子夜歌1 小时前
ES6——Calss详解
javascript·es6·原型模式
❆VE❆1 小时前
虚拟列表原理与实战运用场景详解
前端·javascript·css·vue.js·html·虚拟列表
灵感__idea9 小时前
Hello 算法:贪心的世界
前端·javascript·算法
killerbasd12 小时前
牧苏苏传 我不装了 4/7
前端·javascript·vue.js
橘子编程13 小时前
JavaScript与TypeScript终极指南
javascript·ubuntu·typescript