Vue3问题:如何实现el-table内容超出省略提示?第3条很少有人会
ztj100 2024-11-26 11:16 22 浏览 0 评论
笔者 | 大澈
大家好,我是大澈!
租的房子快到期了,最近在忙着找房子。
不想白给中介巨额中介费,又想找个环境好价格实惠的,在青岛这地真的不算容易。
所以说找房子,也是个十分需要思考分析的事情。于是我做了如下计划:抓重点、抓刚需、排除不必要的需求、冷静分析、果断入手。
论程序员的租房手段,寄所有正在租房的同道中人!
ONE
需求分析,问题描述
一、需求
一个表格,分表头、表体、表尾三部分。
当每个单元格的内容过长超出时,需要省略,用省略号代替超出的部分。
同时,当鼠标移入上去时,会在上方弹出一个小提示框,其内部可以展示完整的对应内容,当鼠标移出时,隐藏小提示框。
二、问题
1、表头如何实现省略提示效果?
2、表体如何实现省略提示效果?
3、表尾如何实现省略提示效果?
4、如何实现单行省略和多行省略?
TWO
解决问题,答案速览
实现代码如下,复制粘贴即可直接使用。
一、表头实现
表头实现的关键,在于在每一栏中插入表头插槽,并自定义内部的内容。
如果你有时间,具体代码分析、知识总结,可见第三部分。
1<!-- 模版代码 -->
2<el-table-column prop="principal">
3 <!-- 表头插槽 -->
4 <template #header>
5 <!-- 小提示框 -->
6 <el-tooltip :disabled="isShowTooltip" content="Principal Repayment" placement="top">
7 <!-- 单行省略样式、鼠标移入事件 -->
8 <div class="singe-line" @mouseover="onMouseOver($event.target)">Principal Repayment</div>
9 </el-tooltip>
10 </template>
11 <!-- 表体插槽 -->
12 <template #default="scope">{{ scope.row.principal }}</template>
13</el-table-column>
14
15// 逻辑代码
16// Tooltip是否禁用标识 默认禁用
17const isShowTooltip = ref(true)
18// 表格鼠标移入事件
19const onMouseOver = (target: any) => {
20 // 判断是否开启tooltip功能
21 if (target.scrollWidth > target.clientWidth) {
22 isShowTooltip.value = false;
23 } else {
24 isShowTooltip.value = true;
25 }
26}
27
28// 样式代码
29// 单行文本省略
30.singe-line {
31 text-overflow: ellipsis;
32 overflow: hidden;
33 word-break: break-all;
34 white-space: nowrap;
35 }
二、表体实现
表体实现的关键,在于在每一栏中添加show-overflow-tooltip属性,当内容过长被隐藏时显示tooltip小提示框。
如果你有时间,具体代码分析、知识总结,可见第三部分。
1<el-table-column fixed prop="date" label="No" width="60" show-overflow-tooltip>
2</el-table-column>
三、表尾实现
表尾实现的关键,在于通过获取表尾元素,为其追加一个tooltip小提示框子元素,并为其绑定指定列的内容和鼠标移入移出事件。
该实现方式为原生js实现,代码比较冗余。大澈并没有找到最优的答案,网上对此问题的描述也很少,如果看到这有最优解的朋友,感谢留言,已帮助更多其他朋友!
如果你有时间,具体代码分析、知识总结,可见第三部分。
1<!-- 模版代码 -->
2<el-table :data="tableData" border show-summary :summary-method="getSummaries" style="width: 100%" max-height="500">
3</el-table>
4
5
6// 逻辑代码
7// 合计数据
8let sumsValue = [] as any
9
10// 表格合计列逻辑
11const getSummaries = (param: SummaryMethodProps) => {
12 const { columns, data } = param
13
14 const sums: string[] = []
15 columns.forEach((column, index) => {
16 // 第0列
17 if (index === 0) {
18 sums[index] = t('pdCalculateLoan.Total')
19 return
20 }
21
22 // 最后一列
23 if (index === columns.length - 1) {
24 sums[index] = ''
25 return
26 }
27
28 const values = data.map((item) => Number(item[column.property]))
29 if (!values.every((value) => Number.isNaN(value))) {
30 sums[index] = values.reduce((prev: any, curr: any) => {
31 const value = Number(curr);
32 if (!isNaN(value)) {
33 // 合计计算
34 return prev + curr;
35 } else {
36 return prev;
37 }
38 }, 0);
39 } else {
40 sums[index] = ''
41 }
42 })
43
44 // 存储合计数据
45 sumsValue = sums
46
47 return sums
48}
49
50// 添加表格底部文本提示
51const handleTableFootTooltip = () => {
52 // 加延时器,防止拿不到元素
53 setTimeout(() => {
54 try {
55 // 获取表格底部元素
56 let tableCellNodeArr = document.querySelectorAll('.el-table__footer-wrapper .el-table__footer td.el-table__cell')
57
58 //创建节点元素节点
59 let tooltipOne = document.createElement('div');
60 let tooltipTwo = document.createElement('div');
61 let tooltipThree = document.createElement('div');
62
63 // 元素赋值
64 tooltipOne.innerHTML = `${sumsValue[1]}`
65 tooltipOne.className = 'tooltip'
66 tooltipTwo.innerHTML = `${sumsValue[2]}`
67 tooltipTwo.className = 'tooltip'
68 tooltipThree.innerHTML = `${sumsValue[3]}`
69 tooltipThree.className = 'tooltip'
70
71 tableCellNodeArr[1].onmouseover = () => {
72 tooltipOne.style.display = 'block'
73 }
74 tableCellNodeArr[1].onmouseout = () => {
75 tooltipOne.style.display = 'none'
76 }
77 tableCellNodeArr[2].onmouseover = () => {
78 tooltipTwo.style.display = 'block'
79 }
80 tableCellNodeArr[2].onmouseout = () => {
81 tooltipTwo.style.display = 'none'
82 }
83 tableCellNodeArr[3].onmouseover = () => {
84 tooltipThree.style.display = 'block'
85 }
86 tableCellNodeArr[3].onmouseout = () => {
87 tooltipThree.style.display = 'none'
88 }
89
90 // 追加子元素
91 tableCellNodeArr[1].append(tooltipOne)
92 tableCellNodeArr[2].append(tooltipTwo)
93 tableCellNodeArr[3].append(tooltipThree)
94 } catch (error) {
95 // 捕获错误
96 console.log(error);
97 }
98 }, 500)
99}
100
101onMounted(() => {
102 handleTableFootTooltip()
103})
104
105
106// 样式代码
107:deep .el-table__footer-wrapper {
108 overflow: visible;
109
110 // 表格底部
111 .el-table__footer {
112 td.el-table__cell {
113 position: relative;
114
115 // 单行文本超出省略
116 div {
117 text-overflow: ellipsis;
118 overflow: hidden;
119 word-break: break-all;
120 white-space: nowrap;
121 }
122
123 // 画提示框
124 .tooltip {
125 display: none;
126 width: 100%;
127 padding: 6px 0;
128 border-radius: 5px;
129 background-color: #313133;
130 text-align: center;
131 color: #fff;
132 position: absolute;
133 top: -40px;
134 left: 0;
135 overflow: visible;
136 font-size: 12px;
137 font-family: Poppins-Regular;
138
139 // 画小三角
140 &::before {
141 content: "";
142 display: block;
143 position: absolute;
144 left: 45%;
145 bottom: -16px;
146 border-width: 10px;
147 border-style: solid dashed dashed dashed;
148 border-color: #313133 transparent transparent transparent;
149 }
150 }
151 }
152 }
153 }
THREE
问题解析,知识总结
一、表头如何实现省略提示效果?
表头实现使用了Table-column的header插槽,在其内部放入Tooltip文字提示框组件,Tooltip组件的内容为需要展示的完整内容,而在Tooltip组件内部的元素,则是需要超出省略的内容。
为超出省略的内容元素添加鼠标移入事件,当目标元素的可滚动宽度,即实际宽度+隐藏宽度,大于目标元素的实际宽度时,说明内容元素已超出省略,此时Tooltip组件启用,反之Tooltip组件禁用隐藏。
Table-column的插槽说明如下:
二、表体如何实现省略提示效果?
表体实现的关键,在于在每一栏中添加show-overflow-tooltip属性,当内容过长被隐藏时显示tooltip小提示框。
show-overflow-tooltip属性加在Table上,影响的将是全部列,加在Table-column上时,影响的将是指定列,这里可以根据具体业务需求添加。
show-overflow-tooltip属性说明如下:
三、表尾如何实现省略提示效果?
表尾实现的关键,在于通过获取表尾元素,为其追加一个tooltip小提示框子元素,并为其绑定指定列的内容和鼠标移入移出事件。
在表格合计回调里,先把合计数据存到数组变量中,然后通过获取表尾元素,为其追加一个tooltip小提示框子元素,再依次将数组变量中的合计数据对应下标取出为其赋值,并通过鼠标事件和样式显示隐藏来控制其展示。
Table几个属性说明如下:
四、如何实现单行省略和多行省略?
1// 单行文本省略
2 .singe-line {
3 text-overflow: ellipsis; //文本超出显示省略号
4 overflow: hidden; //文本超出隐藏
5 white-space: nowrap; //只保留一个空白,文本不会换行
6 }
7
8 // 两行文本省略
9 .two-line {
10 display: -webkit-box; //将盒子转换为弹性盒子
11 -webkit-box-orient: vertical; //文本显示方式,默认水平
12 -webkit-line-clamp: 2; //设置显示多少行
13 text-overflow: ellipsis; //文本超出显示省略号
14 overflow: hidden; //文本超出隐藏
15 }
- END -
相关推荐
- 从IDEA开始,迈进GO语言之门(idea got)
-
前言笔者在学习GO语言编程的时候,GO语言在国内还没有像JAVA/Php/Python那样普及,绕了不少的弯路,要开始入门学习一门编程语言,最好就先从选择一个好的编程语言的开发环境开始,有了这个开发环...
- 基于SpringBoot+MyBatis的私人影院java网上购票jsp源代码Mysql
-
本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目介绍基于SpringBoot...
- 基于springboot的个人服装管理系统java网上商城jsp源代码mysql
-
本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目介绍基于springboot...
- 基于springboot的美食网站Java食品销售jsp源代码Mysql
-
本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目介绍基于springboot...
- 贸易管理进销存springboot云管货管账分析java jsp源代码mysql
-
本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目描述贸易管理进销存spring...
- SpringBoot+VUE员工信息管理系统Java人员管理jsp源代码Mysql
-
本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目介绍SpringBoot+V...
- 目前见过最牛的一个SpringBoot商城项目(附源码)还有人没用过吗
-
帮粉丝找了一个基于SpringBoot的天猫商城项目,快速部署运行,所用技术:MySQL,Druid,Log4j2,Maven,Echarts,Bootstrap...免费给大家分享出来前台演示...
- SpringBoot+Mysql实现的手机商城附带源码演示导入视频
-
今天为大家带来的是基于SpringBoot+JPA+Thymeleaf框架的手机商城管理系统,商城系统分为前台和后台、前台用的是Bootstrap框架后台用的是SpringBoot+JPA都是现在主...
- 全网首发!马士兵内部共享—1658页《Java面试突击核心讲》
-
又是一年一度的“金九银十”秋招大热门,为助力广大程序员朋友“面试造火箭”,小编今天给大家分享的便是这份马士兵内部的面试神技——1658页《Java面试突击核心讲》!...
- SpringBoot数据库操作的应用(springboot与数据库交互)
-
1.JDBC+HikariDataSource...
- SpringBoot 整合 Flink 实时同步 MySQL
-
1、需求在Flink发布SpringBoot打包的jar包能够实时同步MySQL表,做到原表进行新增、修改、删除的时候目标表都能对应同步。...
- SpringBoot + Mybatis + Shiro + mysql + redis智能平台源码分享
-
后端技术栈基于SpringBoot+Mybatis+Shiro+mysql+redis构建的智慧云智能教育平台基于数据驱动视图的理念封装element-ui,即使没有vue的使...
- Springboot+Mysql舞蹈课程在线预约系统源码附带视频运行教程
-
今天发布的是由【猿来入此】的优秀学员独立做的一个基于springboot脚手架的Springboot+Mysql舞蹈课程在线预约系统,系统项目源代码在【猿来入此】获取!https://www.yuan...
- SpringBoot+Mysql在线众筹系统源码+讲解视频+开发文档(参考论文
-
今天发布的是由【猿来入此】的优秀学员独立做的一个基于springboot脚手架的在线众筹管理系统,主要实现了普通用户在线参与众筹基本操作流程的全部功能,系统分普通用户、超级管理员等角色,除基础脚手架外...
- Docker一键部署 SpringBoot 应用的方法,贼快贼好用
-
这两天发现个Gradle插件,支持一键打包、推送Docker镜像。今天我们来讲讲这个插件,希望对大家有所帮助!GradleDockerPlugin简介...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 从IDEA开始,迈进GO语言之门(idea got)
- 基于SpringBoot+MyBatis的私人影院java网上购票jsp源代码Mysql
- 基于springboot的个人服装管理系统java网上商城jsp源代码mysql
- 基于springboot的美食网站Java食品销售jsp源代码Mysql
- 贸易管理进销存springboot云管货管账分析java jsp源代码mysql
- SpringBoot+VUE员工信息管理系统Java人员管理jsp源代码Mysql
- 目前见过最牛的一个SpringBoot商城项目(附源码)还有人没用过吗
- SpringBoot+Mysql实现的手机商城附带源码演示导入视频
- 全网首发!马士兵内部共享—1658页《Java面试突击核心讲》
- SpringBoot数据库操作的应用(springboot与数据库交互)
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- node卸载 (33)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- exceptionininitializererror (33)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)