一键展开或折叠树形表格

一键展开或折叠树形表格

问题场景

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

目前我们用的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',
        },
      ]
    },
  ]
}
],
相关推荐
王六岁3 分钟前
🐍 前端开发 0 基础学 Python 入门指南:f-strings 篇
前端·javascript·python
一道雷8 分钟前
🚀 Vue Router 插件系统:让路由扩展变得简单优雅
前端·javascript·vue.js
wgb040917 分钟前
vxe table 升级之后页面数据不显示解决方法
java·前端·javascript
集成显卡22 分钟前
Bun.js + Elysia 框架实现基于 SQLITE3 的简单 CURD 后端服务
开发语言·javascript·sqlite·bun.js
im_AMBER1 小时前
JavaScript 03 【基础语法学习】
javascript·笔记·学习
半桶水专家2 小时前
Vue 3 插槽(Slot)详解
前端·javascript·vue.js
一枚前端小能手2 小时前
🏗️ JavaScript类深度解析 - 从构造函数到现代特性的完整指南
前端·javascript
浏览器API调用工程师_Taylor2 小时前
日报自动化实战:告别手动复制粘贴
前端·javascript·node.js
晴殇i3 小时前
JavaScript还能这样写?!ES2025新语法让代码优雅到极致
前端·javascript·程序员
浏览器API调用工程师_Taylor3 小时前
我是如何将手动的日报自动化的☺️☺️☺️
前端·javascript·爬虫