一键展开或折叠树形表格

一键展开或折叠树形表格

问题场景

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

目前我们用的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 小时前
写给初学者的React Native 全栈开发实战班
javascript·react native·react.js
我不当帕鲁谁当帕鲁1 小时前
arcgis for js实现FeatureLayer图层弹窗展示所有field字段
前端·javascript·arcgis
那一抹阳光多灿烂1 小时前
工程化实战内功修炼测试题
前端·javascript
红中马喽4 小时前
JS学习日记(webAPI—DOM)
开发语言·前端·javascript·笔记·vscode·学习
Black蜡笔小新5 小时前
网页直播/点播播放器EasyPlayer.js播放器OffscreenCanvas这个特性是否需要特殊的环境和硬件支持
前端·javascript·html
Dread_lxy6 小时前
vue 依赖注入(Provide、Inject )和混入(mixins)
前端·javascript·vue.js
奔跑草-7 小时前
【前端】深入浅出 - TypeScript 的详细讲解
前端·javascript·react.js·typescript
羡与8 小时前
echarts-gl 3D柱状图配置
前端·javascript·echarts
前端郭德纲8 小时前
浏览器是加载ES6模块的?
javascript·算法
JerryXZR8 小时前
JavaScript核心编程 - 原型链 作用域 与 执行上下文
开发语言·javascript·原型模式