一键展开或折叠树形表格

一键展开或折叠树形表格

问题场景

现有一个树形表格,需要在表头配置一个折叠展开按钮,点击可以将所有的行折叠或者展开。

目前我们用的element UI的属性表格每次点击只能展开或折叠当前行,当数据量多或者表格层级比较多的情况下,我们就需要引入一键展开或者折叠所有行的这么一个功能。

效果如下

先来看效果

一键展开树形表格

具体实现

使用el-tabledefault-expand-all属性设置默认折叠所有行

通过expand-row-keys属性设置 Table 目前的展开行,需要设置 row-key 属性才能使用,该属性为展开行的 keys 数组。

vue 复制代码
<el-table
    :data="tableData"
    style="width: 100%; margin-bottom: 20px"
    :default-expand-all="isExpandAll"
    :expand-row-keys="expandRowKeys"
    row-key="id"
    border
>
</el-table

用一个Boolean类型的字段isExpandAll来控制是否展开所有行。用expandRowKeys数组来存放展开行的 keys 数组。

js 复制代码
const data = reactive({
	isExpand: false,
    expandRowKeys: []
})

在表格中单列一列(最左列),通过自定义表头的方式,显示展开折叠图表。为展开/折叠图表绑定点击事件。

vue 复制代码
<el-table-column align="left" width="55">
    <template #header>
      <el-icon @click="expandTable" class="hover-blue" :size="20" style="top: 5px; left: -5px">
        <el-image v-show="isExpandAll" style="width: 20px"
                  :src="require('@/assets/img/expand-bottom.png')"/>
        <el-image v-show="!isExpandAll" :src="require('@/assets/img/expand-right.png')"/>
      </el-icon>

    </template>
</el-table-column>

expandTable方法,展开全部的话,遍历当前表格的所有行,将row.id添加到expandRowKeys中,如果树型表格的深度较深,可以采用递归的方法去遍历表格,添加row.idexpandRowKeys数组里。

js 复制代码
const expandTable = () => {
  data.isExpandAll = !data.isExpandAll
  // 展开所有行
  if (data.isExpandAll) {
    data.expandRowKeys = []
    data.tableData.forEach((row) => {
      if (row.hasOwnProperty("children") || row.children.length > 0) {
        data.expandRowKeys.push(row.id)

        row.children.forEach((row2) => {
          if (row2.hasOwnProperty("children") || row2.children.length > 0) {
            data.expandRowKeys.push(row2.id)
          }
        })
      }
    })

  } else {
    //  折叠所有行
    data.expandRowKeys = []
  }
}

tableData数据:

js 复制代码
tableData: [
{
  id: 1,
  date: '2016-05-02',
  name: 'wangxiaohu',
  address: 'No. 189, Grove St, Los Angeles',
  children: [
    {
      id: 11,
      date: '2016-05-01',
      name: 'wangxiaohu',
      address: 'No. 189, Grove St, Los Angeles',
    },
    {
      id: 12,
      date: '2016-05-01',
      name: 'wangxiaohu',
      address: 'No. 189, Grove St, Los Angeles',
      children: [
        {
          id: 121,
          date: '2016-05-01',
          name: 'wangxiaohu',
          address: 'No. 189, Grove St, Los Angeles',
        },
        {
          id: 122,
          date: '2016-05-01',
          name: 'wangxiaohu',
          address: 'No. 189, Grove St, Los Angeles',
        },
      ]
    },
  ],
},
{
  id: 2,
  date: '2016-05-04',
  name: 'wangxiaohu',
  address: 'No. 189, Grove St, Los Angeles',
  children: [
    {
      id: 21,
      date: '2016-05-01',
      name: 'wangxiaohu',
      address: 'No. 189, Grove St, Los Angeles',
    },
    {
      id: 22,
      date: '2016-05-01',
      name: 'wangxiaohu',
      address: 'No. 189, Grove St, Los Angeles',
      children: [
        {
          id: 221,
          date: '2016-05-01',
          name: 'wangxiaohu',
          address: 'No. 189, Grove St, Los Angeles',
        },
        {
          id: 222,
          date: '2016-05-01',
          name: 'wangxiaohu',
          address: 'No. 189, Grove St, Los Angeles',
        },
      ]
    },
  ],
},
{
  id: 3,
  date: '2016-05-01',
  name: 'wangxiaohu',
  address: 'No. 189, Grove St, Los Angeles',
  children: [
    {
      id: 31,
      date: '2016-05-01',
      name: 'wangxiaohu',
      address: 'No. 189, Grove St, Los Angeles',
    },
    {
      id: 32,
      date: '2016-05-01',
      name: 'wangxiaohu',
      address: 'No. 189, Grove St, Los Angeles',
      children: [
        {
          id: 321,
          date: '2016-05-01',
          name: 'wangxiaohu',
          address: 'No. 189, Grove St, Los Angeles',
        },
        {
          id: 322,
          date: '2016-05-01',
          name: 'wangxiaohu',
          address: 'No. 189, Grove St, Los Angeles',
        },
      ]
    },
  ],
},
{
  id: 4,
  date: '2016-05-03',
  name: 'wangxiaohu',
  address: 'No. 189, Grove St, Los Angeles',
  children: [
    {
      id: 31,
      date: '2016-05-01',
      name: 'wangxiaohu',
      address: 'No. 189, Grove St, Los Angeles',
    },
    {
      id: 32,
      date: '2016-05-01',
      name: 'wangxiaohu',
      address: 'No. 189, Grove St, Los Angeles',
      children: [
        {
          id: 321,
          date: '2016-05-01',
          name: 'wangxiaohu',
          address: 'No. 189, Grove St, Los Angeles',
        },
        {
          id: 322,
          date: '2016-05-01',
          name: 'wangxiaohu',
          address: 'No. 189, Grove St, Los Angeles',
        },
      ]
    },
  ]
}
],
相关推荐
泯泷1 小时前
那段文字是谁删的?Yjs 14 正式版之前,一套删除归属方案的实现与边界
前端·javascript·算法
hold?fish:palm1 小时前
34 合并K个升序链表
javascript·算法·链表
幸运小圣4 小时前
PointerEvent 常用属性与事件整理【JavaScript】
开发语言·javascript·ecmascript
志尊宝5 小时前
Vue3 零基础每日笔记(038):亲手封装 useDebounceFn 与 useThrottleFn——高频事件的流量阀
前端·javascript·vue·html·vue3
默_笙7 小时前
🚅 地铁的"回头路、存档点与人工闸机"(下):LangGraph 的循环、持久化与中断
前端·javascript
flash俊杰7 小时前
Zod Schema 驱动的 IPC 契约:从入参校验到状态机一致性的三层防御
javascript·typescript
一条溺水的鱼10 小时前
一次讲透 JS 原型链 —— prototype、__proto__ 和 constructor 到底啥关系
javascript
三乐22810 小时前
一文搞懂 JS 事件流:捕获、冒泡、事件委托
javascript·html
愛芳芳12 小时前
基于 Electron + Vue3 的仿 PC 微信客户端项目实战
前端·javascript·css·elementui·typescript·electron·vue
阿虎儿13 小时前
论 JavaScript 的怪异之处
javascript