记录--Vue2屎山之 Table 屎山
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助
前言
Vue2 将在 2023 年年底停止维护了,但是 Vue2 的代码却不会在 2023 年消失,还会越来越多;难以想象几十万行或者几百万行的 Vue2 代码迁移到 Vue3,这是不可能办到的;
老一点的前端程序员肯定经历过把大型项目从 jQuery 迁移到 Vue/React/Angular 的经历,那是一次思想的大变革,也是生产效率的一次大革新,但是这一次就不一样了,Vue2 迁移到 Vue3 虽然优点很多,但是这不足以说服老板们花费$去让你进行重构;
既然 Vue2 还能用,那我就想把他用到极致,日常中最常用的就是 Table 组件,所以 Table 组件出现屎山的概率大大增加了,再加上 UI 框架的加持,这个屎山就被放大了!Vue2 写后台也就是这几个 UI 框架:Antd-vue、Element、iView,两款是个人开发者出品,一款是饿了么出品,来看看他们的 Table 组件
iView
iView Table 屎山
为什么先说 iView,因为 iView 早期版本里面的 Table 组件有一个很奇葩的设定那就是使用 render 函数来渲染 columns,而我们刚好用的 iView 版本就是这个时期的,后面也难以再升级,这个时候就产生大量屎山代码了:

比方说Table 每一行后面有四个操作按钮,那么就需要这样写:
render:(h,{row})=>{
return h('div',[
h('a',{
props:{
},
styles:{
},
on:{
click:()=>{
}
}
},'新增'),
h('a',{
class:'xxx'
},'修改'),
h('a',{
class:'xxx',
on:{
click:()=>{
Modal.confirm({
...
})
}
}
},'删除'),
h('a',{
class:'xxx'
},'配置'),
])
}
有没有感觉到特别丑陋,而且写起来效率也十分低下,好像回到了原始社会;原始社会里面大家钻木取火,现在一个打火机就能够搞定,而这个 Table 里面的 Column 的设定就像是钻木取火了,一个 Colmun 还好,如果所有 Column 都这样写,并且都定义在 data 里面,想象一下一个 data 都定义了几百行,这是不是最大的屎山呢?
这个屎山有办法破解吗?答案是有的,总共有两个方向,一个方向是编译优化,一个方向是利用 scopedSlots
编译优化
回忆一下 React,每一个 jsx 代码其实都等同于 createElement("div",{},"xxxx"),与上面的代码类似,那么在 Vue 里面也可以写 jsx,然后编译为 h 函数,按照这种思路上面的代码就可以优化为:
render:(h,{row})=>{
return <div>
<a>新增</a>
<a>修改</a>
<a onClick={()=> this.onDelete(row)}>删除</a>
<a>配置</a>
</div>
}
这样的话看起来就舒服很多了,但是有人会说了:在 Vue 里边写 jsx,又有 template 又有 jsx 搞得是四不像,不伦不类了,这种方式我不喜欢,还是想利用 Vue 的特性,要么我就还是情愿回到原始社会去钻木取火;那么下面一种方式就是 scopedSlots
scopedSlots 优化
先说怎么用:在 columns 数组中增加一个参数 slot,然后定义作用域插槽:
<template>
<Table :columns="columns">
<template #actions="{row,index}">
<a>新增</a>
<a>修改</a>
<a @click="onDelete(row)"}>删除</a>
<a>配置</a>
</template>
</Table>
<template>
<script>
export default{
data(){
return {
columns:[{
title:'操作',
slot:'actions',
key:'actions'
]}
}
}
</script>
再来看看Table 是如何支持这个功能的呢,大概思路就是在遍历 columns 时会判断一下 slot 是否存在,如果存在则展示作用于插槽,如果不存在则走原来的逻辑,下面贴了一些伪代码:
<td>
<!-- 如果遍历 colums 之后 slot 属性存在,那么渲染 slot,否则按照默认规则渲染 -->
<slot v-if="slotName" :name="slotName" v-bind="{row,index}"/>
<span v-else>...</span>
</td>
学会了这两种优化方式,领导再也不用担心我堆屎山了!
Element
再看看 Element 中的Table,舒服多了有没有:

不用把 Column 的配置与 内容割裂开,可以都放在 template 中书写,这样比上面的方式灵活多了,而且还极大减少了屎山代码的形成,对比下来还是 Element 的 Table 组件更为成熟好用;
antd-vue
最后一个是 antd-vue,看一下 antd-vue 中 Table 的用法,这不就和上面讲到的 scopedSlots 优化那种用法类似吗?

翻到后面,可以看到一个 template 风格 API,与 Element 这种用法类似,但是后面紧接着提示:不推荐使用,会有一定的性能损耗。,为什么会有性能损耗呢?那么 Element 这么用会有性能损耗吗?

后记
到这里 Vue2 中的 Table 屎山就结束了,再回头看看 iView 直接暴露 h 函数,虽然极大地增加了 Column 定义的灵活度,但是增加了很多无效代码就好像回到原始社会一样,也增加了不少的屎山代码;在日常开发过程中,很多需求都是赶着工期完成的或者倒排工期完成,根本没有时间去思考怎么优化,这个时候 UI 框架对于效率的影响就被放大了;好的 UI 框架不仅能够提供好的交互效果,还能从 API 层面去约束开发者,让开发者尽可能写出好的代码,另外就是让开发者尽可能少写代码;
本文转载于:
https://juejin.cn/post/7300151966964678668
如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

记录--Vue2屎山之 Table 屎山的更多相关文章
- 普天同庆,微博开通,从今以后,努力用功! 狗屎一样的顺口溜!Q狗屎!!狗屎。。。。。 测试。。测试。。。没刷过微博。屯里来的。看看啥效果
普天同庆,微博开通,从今以后,努力用功! 狗屎一样的顺口溜!Q狗屎!!狗屎..... 测试..测试...没刷过微博.屯里来的.看看啥效果
- vue2.0实现在table中实现全选和反选
其实在去年小颖已经写过一篇:Vue.js实现checkbox的全选和反选 小颖今天在跟着慕课网学习vue的过程中,顺便试试如何在table中实现全选和反选,页面的css样式是直接参考慕课网的样式写的, ...
- vue2.0之element table的使用
说明: 1.改变表头居中问题: 需要在el-table-column中添加 header-align="center" <el-table :data="t ...
- 冰雪奇缘,白色世界:四个IT人的四姑娘山双桥沟游记
去年9月初去了川西的稻城亚丁,体会了金色世界秋日童话,还写了一篇游记<从你的全世界路过-一群程序员的稻城亚丁游记>,也是得到了很多朋友和童鞋的点赞.今年11月初趁着周末的两天时间和朋友去了 ...
- CCCC 喊山
2016年天梯赛模拟&初赛题集(nwu) 编程题30小题,共计580分 580分 编程题 5-14 喊山 (30分) 喊山,是人双手围在嘴边成喇叭状,对着远方高山发出“喂—喂喂—喂喂喂…… ...
- 从Table 表中取出第 m 条到第 n 条的记录
* FROM Table id FROM Table )) --从TABLE表中取出第m到n条记录 (Exists版本) * FROM TABLE AS a WHERE Not Exists ( * ...
- mysql 删除表记录 delete和truncate table区别
MySQL中删除表记录delete from和truncate table的用法区别: mysql中有两种删除表中记录的方法: (1)delete from语句, (2)truncate table语 ...
- 嵊州D3T1 山魔 烙饼问题
嵊州D3T1 山魔 有n 座山,每座山有南北两面. 每一天,一些山的某一面(不一定相同) 会受到山魔的袭击. 但是山魔一天最多只会袭击k座山. 当每座山的每一面都被袭击过后,山魔就会离开. 那么至少要 ...
- PTA 练习 7-24 喊山 (30 分)
7-24 喊山 (30 分) 喊山,是人双手围在嘴边成喇叭状,对着远方高山发出"喂-喂喂-喂喂喂--"的呼唤.呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的& ...
- 查询当前Database下所有Datatable及所有记录数
DECLARE @TableName varchar(); CREATE TABLE #GetRecordingTempTable([id] [INT] IDENTITY(,) NOT NULL, [ ...
随机推荐
- 初次尝试GPU Driven —— 大范围植被渲染
初次尝试GPU Driven -- 大范围植被渲染 GPU Driver简单概要,即把整体逻辑放到GPU上运行,解放CPU压榨GPU,初次尝试,记录一下研究过程. 渡神纪 塞尔达 塞尔达 塞尔达 在开 ...
- Power BI 15 DAY
业务(表结构)数据分析 1.业务理解 准确 全面 2.数据收集 了解需要用到的数据有哪些 5W2H 结构化数据 SQL.通过查询获取数据库资源 多源表结构数据 企业数据库数据 文本文件数据 Excel ...
- 立创EDA使用笔记
立创EDA 在立创EDA上制作的PCB可以直接导入到嘉立创下单, 每个注册用户每个月可以下两个免费订单, 限制PCB尺寸10CMx10CM, 每单五片, 连制作到快递全部免费, 非常适合做样板. 立创 ...
- Laravel入坑指南(10)——事件Event
不知不觉,我们已经来到了第10小节.这一小节,我们一起讨论关于"事件"这个话题.众所周知,从二进制到汇编,再到高等级语言,这一路发展下来,代码都是顺序执行的,那么事件是什么?这个事 ...
- win32 - 将文件的访问权限给特定的用户
需要首先获取特定用户的SID. 这是一些步骤, 验证输入参数. 为可能足够大的SID和域名创建缓冲区. 在循环中,调用LookupAccountName以检索提供的帐户名的SID.如果SID的缓冲区或 ...
- win32 - 使用VerQueryValue获得应用程序的名称
比如: Google Chrome: 类似于任务管理器中显示名字,见下图 那么我们就需要使用VerQueryValue, 从指定的版本信息资源中检索指定的版本信息.若要检索适当的资源,在调用VerQu ...
- 【Azure 服务总线】向服务总线发送消息时,返回错误代码Error code : 50009
问题描述 使用Java SDK向服务总线(Service Bus)发送消息时,返回这个错误: org.springframework.jms.UncategorizedJmsException: Un ...
- 【Azure 微服务】Azure Service Fabric 因证书问题而使得 Node 一直处于 Down 状态
问题描述 Service Fabric 集群更新证书后,重启Node后就变为Down的状态,反复 Restart 结果反复Down 问题分析 根据Service Fabric的文档表示,修改证书时一定 ...
- 代码随想录算法训练营第七天| LeetCode 454.四数相加II 15. 三数之和 18. 四数之和
454.四数相加II 卡哥建议:本题是使用map巧妙解决的问题,好好体会一下 哈希法如何提高程序执行效率,降低时间复杂度,当然使用哈希法会提高空间复杂度,但一般来说我们都是舍空间换时间, 工业开发也是 ...
- CPNtools协议建模安全分析(一)
本文根据最近整理的CPNtools论文和CPNtools官网上的说明,以及参照了乌克兰敖德萨 ---国家电信研究院运输和通信部关于 电信系统协议仿真关于CPNtools的学生讲义.基于此和和自己的 ...
