优雅的使用 element-ui 中的 table 组件

经常使用 element-ui 的小伙伴应该对 el-table 组件非常熟悉,通常它长下面这个样子:



复制代码

上面代码非常正确,但总觉的少了点什么?

没错,模版中 el-table-column 几乎一致,重复写了

使用 v-for 来优化模版中的 el-table-column

下面是采用 v-for 的版本,将每一列作为一个配置项传入:



复制代码

这样做的好处在于,如果想再增加一列,完全可以不用动 template,只需要简单的在 this.colConfigs 这个数组中增加一个配置项 { prop: 'xxx', label: 'xxx' } 即可

虽然这样加个配置非常简单,扩展性也比之前直接写模版好,但是如果我有一列是要渲染几个按钮,上面的方式就不起作用了

换句话说,我们即想要简单的属性可以直接加个配置项渲染出来,又希望复杂的渲染能在模版中写出来,要怎么实现呢?

巧用 slot,为 el-table 封装一层

我们先来看一下封装的组件 my-table

// my-table.vue


复制代码

这个封装实际上就是把前面的 colConfigs 作为一个 prop 传入,但是跟上面例子有一点不同的是,配置项中多了一个 slot 属性,通过这个属性,我们就可以像文章最开始那样在模版中写了,用法如下:



复制代码

现在我们想要增加一个列,只要加个配置项,或者加个 slot ,完美~

等等,假设我的 table 中有几列渲染比较复杂,那几列又都比较相似,像下面这种:

复制代码

又重复写模版了...

使用 :is="component"

我们可以为配置项再增加一个属性 component, 用户可以指定 component 属性来特殊处理某列,实现如下:

// my-table.vue


复制代码

然后上面的例子就可以改写成:


复制代码

总结

table 作为数据展示组件,在日常开发中经常被用到,通过这篇文章,可以看到结合 vueslot/component 特性,做一层封装,可以大大简化 table 的使用,大部分时候只需写一个配置属性就可以了。

最后给一个小 demo

你可能感兴趣的:(javascript,ui)