10行代码,实现 el-table 表格行的展开与收缩

在el-table中有一种可以让数据收缩的展示方式,这样可以方便进行大量的数据归类,但是官方文档语焉不详,既没有示例函数,也没有样例,让人无从下手。

找了很多网上的文章,总不是我要的效果,于是摸索了一会,终于找到了我想要的效果,直接上效果

页面打开前:

点击文字后,不是点击前面官方的箭头,而是箭头后面的文字,再次点击后关闭

这个效果让我比较满意,但实现方法并不是很完美,但是很简单,我记录一下

1、在el-table绑定变量expand-row-keys

这个变量是一个列表,里面保存的是展开的 id值 如expand-row-keys = ['1','2','3'] 这样的值,定义方法是

const expandRows = ref<string[]>([]);

2、在需要点击的文字上设定点击效果,定义了函数@click="toggleAllRows(scope.row)",代码如下

const toggleAllRows = (row: Company_certificate) => {
  const idNow = row.id;
  if (typeof idNow === 'string') {
    const index = expandRows.value.indexOf(idNow);
    if (index > -1) {
      // 如果存在,则删除
      expandRows.value.splice(index, 1);
    } else {
      // 如果不存在,则添加
      expandRows.value.push(idNow);
    }
    console.log(expandRows.value);
    tableKey.value++;
    console.log(tableKey.value);
  }
};

实际上就是点击的时候讲当前数据的id值以字符的形式写入列表中

注:要实现折叠效果,数据要绑定key值,row-key="id"  这是收缩,展开数据的基础,数据结构我就不说了

3、这时候我神奇的发现,文字可以点击了,也可以展开下面的行了,但是再次点击却无法关闭,我觉得这是el-table的一个bug,其实本可以这么简单就实现点击的,但是官方文档却给了几个语焉不详的变量,实在不知道是为什么

4、这时我在想如果能实现展开,就证明路没问题了,但没法关闭,是因为表格没有再次渲染,想实现表格的再次渲染其实很简单,只要表格内的数据变化就行了,于是创造了一个变量const tableKey = ref(0),每次点击后都实现+1 的效果,tableKey.value++; 这样表格就刷新了,哈哈曲线救国成功,别忘了将这个变量绑定在 el-table上

上全部代码

前端html代码:

<el-table :data="tableData_company_certificate" style="width: 100%" size="small" row-key="id" :expand-row-keys="expandRows" :key="tableKey">
    <el-table-column label="证书名称" show-overflow-tooltip>
        <template #default="scope">
            <div v-if="scope.row.children" style="display: inline;">
                <el-button style="font-size:12px;font-weight:bold" type="info" link  @click="toggleAllRows(scope.row)">{{ scope.row.cert_name }}</el-button>
            </div>
只有这个和点击有关,就只放这一点吧,方便大家拆解
1、绑定 :row-key="id
2、绑定 :expand-row-keys="expandRows"
3、绑定 :key="tableKey"
4、点击效果放在文字上,因为有的组件不接受 @click,于是用了button 组件,正好这个组件有个 link 的模式,不能说很像,只能说完全一样 @click="toggleAllRows(scope.row)",这里要带行数据,添加id用

前端 TS 代码:
用的是vue的 setup语法

const tableKey = ref(0)
const expandRows = ref<string[]>([]);

const toggleAllRows = (row: Company_certificate) => {
  const idNow = row.id;
  if (typeof idNow === 'string') {
    const index = expandRows.value.indexOf(idNow);
    if (index > -1) {
      // 如果存在,则删除
      expandRows.value.splice(index, 1);
    } else {
      // 如果不存在,则添加
      expandRows.value.push(idNow);
    }
    console.log(expandRows.value);
    tableKey.value++;
    console.log(tableKey.value);
  }
};

实现了点击展开数据的效果。

重新渲染表格的延迟会比系统提供的折叠慢一些,有卡顿的感觉,但是系统提供的API又没有明确写,有搞懂的朋友可以给我留言,感谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值