el-table每行下面实现进度条的效果封装全过程完整版

大家好啊

接着上期我们来看一下

在el-table里边

怎么来实现这种进度条的效果

首先呢我准备了一个原始的el-table

现在还没有这个样式

所以呢我们先把上一期的这个样式

拿过来

拿过来之后

只不过我们现在这是写死的40%

然后margin-top是49像素

大看现在就有这效果了

然后剩下就两件事

一个是把这个宽度改成动态的

一个是把margin-top改成动态的

我们先来简单的这个宽度

我们上期也说了宽度要改成一个变量

所以我先把它注掉

换成下边这个

这个变量要在哪去设置呢

上期也说了在tr里

所以呢我们要借助

el-table的这个row-style

我们在这个el-table上

写一个

row-style

然后呢

我们在下边写一个这rowStyle方法

在Method里row-style

这里边呢我们需要

接收一个row

然后呢我们需要在这里边

直接返回一个

process

值是什么呢

我们现在每一个对象都有这个属性

大家看:是0-

所以呢

我们需要把这个属性乘以一个

row-process乘以100,百分号

我们再来看一下效果

大家看 现在这个宽度就可以是动态的了

下边两个是0所以他没有

然后呢

第二件事就是我们需要把这个

margin-top也改成

动态的

那这个怎么处理呢

这个row-height上期我们说了是监听表格的

尺寸变化来实现的

那在el-table里我们可以这样

我们先看一下它这里边的源码哈

下边它有一个

这个方法resizeListener

就是说他这已经做好了

这个listener监听了

所以呢我们

大家看他在下边会调this.doLayout

所以啊

我们的思路就是重写一下这个doLayout

我们可以封装一个组件

来继承这个el-table

我在这个components里边

新建一个el-table6.vue

然后呢

我们在这里边写这个组件

template不要了

首先呢我们把这个table导进来import

table

from

然后呢我们继承自(extends Table)

我们先什么也不写

再把这个组件放过来

然后呢我们在下边导一下

import

Table6 from

components/el-table6 然后呢

注册一下这个组件component

我们也可以在全局注册啊

我就直接在这写了

把这改成Table6,好我们再刷新一下

大家看 跟刚才没有区别对吧

好那我们就来复写这个方法

methods

然后呢我们把这个方法名复制过来

doLayout

这里边我们要调用一下原来的逻辑

就是正常来说我们需要调用父类的吗

因为我们是继承的

但是在这地方呢没办法直接访问父类

所以我们可以变一种方法

我们直接取到这个

Table.methods.doLayout

然后call this

把this传进去

这样的话呢

就能调原来的那个table的doLayout

然后我们在这下边再去做自己的事

我们需要先找到这个table的

标签this.$el

然后呢像上期一样

table.querySelectorAll,把所有的tr找到

然后呢

我们需要设置高度

稍微改一下

点儿

.style.setProperty

这里边儿我们设置一个--row-height

tr.offsetHeight

好我们再来试一下

还不行,大家看 --row-height还是0为什么呢

因为他没有改变尺寸

看看我把它拖动一下

哎这样就行了

那怎么办呢

我们可以在这个

vue的

updated的这个钩子里面

执行一下这些

所以呢我们需要把它提取成一个方法

比如 syncEachRowHeight

好这样调一下

然后呢我们在这this点调一下

然后再updated里边也调一下

好再来看一下

大家看 上来就可以了

现在这个高度他也有了

到此呢这个进度条已经出来了

那怎么来控制它的隐藏与显示呢

这个也简单

我们呀现在用的是TR的伪类(伪样式)

我们把它改成一个其他的

我们自己写的样式

比如说row-process

这样的话呢

就只有

这个类样式的tr才会有这个效果

那我们怎么给

不同的tr动态加这个样式呢

关于这个我们可以利用

el-table的这个row-class-name来实现

我们在上面

在这row-class-name等于

然后呢我们下边再写一个rowClassName

我们在这儿

rowClassName

然后呢我们把这个改成

动态的

show-process我们改成

row-process 然后呢

是不是showProcess

我们每一个对象都有这个

属性我们再来试一下

隐藏显示

隐藏显示这个显示现在是

所以它没有隐藏

到此呢一个基本的效果就出来了

但是有意思的还在后边

我就想啊

怎么能把它封装的再优雅一点

也就是

这两个方法能不能把它再封装进去

后来我就看源码里边

他传进来的这两个方法其实都是

继续往里传

传递到了另一个组件里叫table-body里边

所以呢

其实啊这两个东西我们是可以覆盖的

好我直接把它拿过来先

好然后呢

这块我们先写死

比如说40%

然后这个就写上出

好样式也是样式也可以拿过去

这个穿透就不用了

我们来看一下他会有什么问题

刷新一下

注意看他会报个警告

虽然效果可以了

为什么呢

原因是啊

这两个方法

原本在el-table里就有这两个属性

所以呢当我们再用这两个名字

去写方法的时候呢

el-table就会报警告认为它重名了

那怎么处理呢

我们呀可以在这直接把它删掉delete

table就是在继承之前把它删掉

pros.rowStyle

然后呢rowClassName

只是啊注意!如果你这么删的话

你这个组件就不能放到main.js

全局引用

如果放到main.js全局引用

然后还这样删的话

就会影响其他的table

所以啊如果想把这个组件

放到全局引用的话呢

可以这样写

我们先const一个TableClone,克隆一个

我们用浅克隆就行

Object.assign

把这table克隆出来

克隆扩展出来能不能直接

删这个props的属性啊

也不能因为它是浅克隆

所以我们还需要把这个

props也克隆一下

= Object.assign

这个就不要了

好这样的话呢我们

如果你把这个放到全局也没问题

然后呢我们去继承这个tableClone的

下边调doLayout的时候呢

也调这个克隆

那就行了

然后呢我们再回到

刷新一下

大看这回就不报错了

然后剩下的就简单了

我们就想办法把它取到一个动态的值

我们在这需要拿到肉的这个属性值

row.什么呢

这个process但这个process啊

我们先写死过来

乘以100好看一下

哎大家看 这样就行了

那这个process怎么能传递进来呢

我们一样

这个就简单了

我们在这准备一个props就行了

props

我们在这写一个propName4ProcessValue

String类型的就行了

然后判断这个值有没有啊

我们就假设他有了

直接在这取就行了

this.

然后呢在外边传递一下

这两个就不用传了

我们直接传一个

然后把这个属性值拿过来

好我们先看一下效果

大家看就可以了

那剩下的呢我就不一个一个演示了哈

给大家看一下我最终封装好的

用的时候呢就是这个el-table

首先呢我们保证

这个data至少要有一个process属性

能代表着百分比的从0到1之间的数

然后呢

showPprocess看你需求可以有可以没有

没有这个属性呢它就自动显示这个了

然后我们在el-table上

把这个属性名

用这种方式指定好就可以了

我们来看一下

就是这个页面

然后呢这个动画的效果

就跟组件的封装没关系了

这个就完全是我们自己通过

setTimeout来

设置这个process的值来实现的

真实情况下肯定要跟业务绑定的

进行到百分之多少了

那这个组件啊

还是我放在之前的这个demo里边了

最后更新于