<el-table>构建树形结构

发布于:2025-06-06 ⋅ 阅读:(12) ⋅ 点赞:(0)

最佳实践

el-table实现树形结构主要依靠row-keytree-props来实现的。
💫 无论是el-table实现的树形结构还是el-tree组件都是绑定的树形结构的数据,因此如果数据是扁平的话,需要进行树化。

代码

<template>
  <div>
    <el-table
      :data="tableData"
      style="width: 100%;margin-bottom: 20px;"
      row-key="id"
      border
      default-expand-all
      :tree-props="{children: 'children', hasChildren: 'hasChildren'}">
      <el-table-column
        prop="date"
        label="日期"
        sortable
        width="180">
      </el-table-column>
      <el-table-column
        prop="name"
        label="姓名"
        sortable
        width="180">
      </el-table-column>
      <el-table-column
        prop="address"
        label="地址">
      </el-table-column>
    </el-table>
  </div>
  </template>
  <script>
    export default {
      data() {
        return {
          tableData: [{
            id: 1,
            date: '2016-05-02',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1518 弄'
          }, 
          {
            id: 2,
            date: '2016-05-04',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1517 弄'
          }, 
          {
            id: 3,
            date: '2016-05-01',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1519 弄',
            children: [{
                id: 31,
                date: '2016-05-01',
                name: '王小虎',
                address: '上海市普陀区金沙江路 1519 弄'
              }, 
              {
                id: 32,
                date: '2016-05-01',
                name: '王小虎',
                address: '上海市普陀区金沙江路 1519 弄'
            }]
          }, {
            id: 4,
            date: '2016-05-03',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1516 弄'
          }]
        }
      },
      methods: {
      },
    }
  </script>
当前视图

可以看到树形结构默认是打开的

在这里插入图片描述

核心属性

  • default-expand-all:树形结构打开还是关闭。
    关闭可以通过删除default-expand-all:default-expand-all = 'false'对属性值进行动态绑定,并将值置为false
  • children:指定子节点数据在父节点对象中的字段名,这里是 children 。
    也可以修改为其它名称,但是两处都需要进行修改
  • hasChildren:这个属性是非必须的,需要进行懒加载的时候才需要用到它。
    hasChildren需要和lazy属性、load属性来实现懒加载,lazy为true时,load方法才会生效。hasChildren属性和children属性相同,也可以修改名称。

懒加载

只加载需要展示的数据,其它数据等用户主动点击才会请求后端拿取。

代码

<template>
  <div>
    <el-table 
    :data="tableData1" 
    style="width: 100%" 
    row-key="id" 
    border 
    lazy 
    :load="load"
      :tree-props="{ children: 'children', hasChildren: 'hasChildren' }">
      <el-table-column prop="date" label="日期" width="180">
      </el-table-column>
      <el-table-column prop="name" label="姓名" width="180">
      </el-table-column>
      <el-table-column prop="address" label="地址">
      </el-table-column>
    </el-table>
  </div>
</template>
<script>
export default {
  data() {
    return {
      tableData: [{
        id: 1,
        date: '2016-05-02',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄'
      },
      {
        id: 2,
        date: '2016-05-04',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1517 弄'
      },
      {
        id: 3,
        date: '2016-05-01',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1519 弄',
        children: [{
          id: 31,
          date: '2016-05-01',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1519 弄'
        },
        {
          id: 32,
          date: '2016-05-01',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1519 弄'
        }]
      }, {
        id: 4,
        date: '2016-05-03',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1516 弄'
      }],
      tableData1: [{
        id: 1,
        date: '2016-05-02',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄'
      }, {
        id: 2,
        date: '2016-05-04',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1517 弄'
      }, {
        id: 3,
        date: '2016-05-01',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1519 弄',
        hasChildren: true
      }, {
        id: 4,
        date: '2016-05-03',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1516 弄'
      }]
    }
  },
  methods: {
    load(row, treeNode, resolve) {
      // 查找对应的父节点
      const findChildren = (data, id) => {
        for (let item of data) {
          console.log(item.id);
          if (item.id === id) {
            console.log(item.id);
            return item.children || [];
          }
        }
        return [];
      };

      if (treeNode) {
        const children = findChildren(this.tableData, row.id);
        resolve(children);
      } else {
        resolve([]);
      }
    }
  },
}
</script>

效果图

在这里插入图片描述

到这里el-table加载树形结构就结束了。☺️


网站公告

今日签到

点亮在社区的每一天
去签到