el-table 树形数据 tree-props 多层级使用避坑

 更新时间:2023年08月30日 10:31:54   作者:蓝胖子的多啦A梦  
本文主要介绍了el-table 树形数据 tree-props 多层级使用避坑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

实现效果:

element官网提示设置tree-props为{children: ‘children’,hasChildren: ‘hasChildren’},data数据需要设置children和hasChildren属性,row-key也绑定了数据的唯一值变量id,但是树形结构的第三级就是出不来

如图

可以看到只有第二级,第三级并没有,于是查看了数据格式,和官方要求的也是一样的呢,但是第三层级就是不展示

最后发现

在el-table中,支持树类型的数据的显示。row 中包含 children 字段时,被视为树形数据。渲染树形数据时,必须要指定 row-key 支持子节点数据异步加载

设置 Table 的 lazy 属性为 true 与加载函数 load 。通过指定 row 中的 hasChildren 字段来指定哪些行是包含子节点。 children hasChildren 都可以通过 tree-props 配置。

default-expand-all 属性表示默认展开,不需要展开可以删除。 row-key="id" row 里面的属性有 children 字段(即数据里面需要有 children 字段) 是必须的,:tree-props="{children: ‘children’,hasChildren: ‘hasChildren’}可有可无。

如果不是 懒加载 的话,后端不要设置 hasChildren 这个属性,要不然树形不能显示; 如果是懒加载,则需要设置 hasChildren 字段。

错误代码:

因为我的数据不是懒加载,所以不需要添加后面的 hasChildren: 'hasChildren' 配置

并且在组装数据格式时,也不需要加上 hasChildren=true / hasChildren=false 的字段

完整代码:

  <!--表格渲染-->
    <el-table
      :header-cell-style="{ color: '#FFF', background: '#333' }"
      :cell-style="{ color: '#FFF', background: '#333' }"
      row-key="id"
      :data="tableData"
      style="width: 100%"
      :default-sort="{ prop: '', order: '' }"
      @sort-change="sortChange"
      :tree-props="{ children: 'children' }"
    >
      <template slot="empty">
        <span style="color: #969799">{{ $t("NeoLight.empty") }}</span>
      </template>
      <el-table-column
        prop="barcode"
        :sortable="true"
        :label="$t('NeoLight.barcodeNo')"
        width="180"
      />
      <el-table-column
        prop="partNumber"
        :sortable="true"
        label="料号"
        width="150"
      />
      <el-table-column
        prop="warehouseCode"
        :sortable="true"
        label="库别"
        width="150"
      />
      <el-table-column
        prop="batch"
        :sortable="true"
        :label="$t('barcode.batch')"
      />
      <el-table-column
        prop="provider"
        :sortable="true"
        :label="$t('storagePos.providerNumber')"
      />
      <el-table-column
        prop="posName"
        :sortable="true"
        :label="$t('NeoLight.storageNo')"
      />
      <el-table-column prop="dateCode" :sortable="true" label="DC" />
      <el-table-column prop="reelAmount" :sortable="true" label="卷数" />
      <el-table-column
        prop="amount"
        :sortable="true"
        :label="$t('NeoLight.amount')"
      />
      <el-table-column
        prop="firstPutInDate"
        :sortable="true"
        :label="$t('NeoLight.firstPutInDate')"
      />
      <el-table-column
        prop="putInDate"
        :sortable="true"
        :label="$t('NeoLight.putInDate')"
      />
    </el-table>

接口返回的数据 为 二级 数据格式 但是table表格中要展示 三个层级 需要前端自己来处理 组装需要的格式有和我一样的小伙伴,可以让后端组装好格式返回噢

 let list = [
 {
	canCheckOutTime: 1669613688280
	enabled: true
	groupId: ""
	groupName: ""
	h: 8
	humidity: ""
	id: "21"
	labelId: ""
	labelName: ""
	posName: "C1"
	priority: 1
	storageId: "1"
	temperature: ""
	used: true
	w: 7
	warmPos: false
},
    {
          barcode: {
            amount: 23000,
            barcode: "CS0004",
            batch: "",
            children: [
              {
                amount: 3000,
                barcode: "M150171314022J1RV",
                batch: "A436105244",
                createDate: "2022-12-01 15:55:32",
                dateCode: "2209",
                firstPutInDate: "2022-12-01 15:55:33",
                fullCode:
                  "152S01563-017131|A436105244-2209|3000|M150171314022J1RV|TAIYO|4101546111011J1007FS",
                height: 8,
                id: "92",
                initialAmount: 0,
                labelAmount: 3000,
                maxStorageTime: 0,
                mixTime: 0,
                onlySingleOut: false,
                partNumber: "152S01563",
                partitionCount: 1,
                plateSize: 7,
                posName: "CS0004-1",
                provider: "TAIYO",
                providerNumber: "017131",
                putInDate: "2022-12-01 15:55:33",
                putInTime: 1669881333306,
                putInTimeStr: "2022-12-01 15:55:306",
                reelAmount: 1,
                relationCodes: [],
                size: "7X8",
                solder: false,
                solderStatus: 0,
                startWarmTime: -1,
                status: 0,
                thickness: "",
                type: 0,
                updateDate: "2022-12-01 15:55:33",
                used: false,
                usedCount: 0,
                warehouseCode: "W10B",
                warmTime: 0,
              },
              {
                amount: 10000,
                barcode: "A1179700142220JB6S",
                batch: "TPA2233000KP",
                createDate: "2022-12-01 15:56:01",
                dateCode: "2022080",
                firstPutInDate: "2022-12-01 15:56:02",
                fullCode:
                  "118S0176-797001|TPA2233000KP-20220807|10000|A1179700142220JB6S|CYNTEC|TPA2233000KP0000JB6S",
                height: 8,
                id: "95",
                initialAmount: 0,
                labelAmount: 10000,
                maxStorageTime: 0,
                mixTime: 0,
                onlySingleOut: false,
                partNumber: "118S0176",
                partitionCount: 2,
                plateSize: 7,
                posName: "CS0004-2",
                provider: "CYNTEC",
                providerNumber: "797001",
                putInDate: "2022-12-01 15:56:02",
                putInTime: 1669881362306,
                putInTimeStr: "2022-12-01 15:56:306",
                reelAmount: 1,
                relationCodes: [],
                size: "7X8",
                solder: false,
                solderStatus: 0,
                startWarmTime: -1,
                status: 0,
                thickness: "",
                type: 0,
                updateDate: "2022-12-01 15:56:02",
                used: false,
                usedCount: 0,
                warehouseCode: "W10B",
                warmTime: 0,
              },
              {
                amount: 10000,
                barcode: "A1179700142220JB7L",
                batch: "TPA2233000KP",
                createDate: "2022-12-01 15:56:06",
                dateCode: "2022080",
                firstPutInDate: "2022-12-01 15:56:07",
                fullCode:
                  "118S0176-797001|TPA2233000KP-20220807|10000|A1179700142220JB7L|CYNTEC|TPA2233000KP0000JB7L",
                height: 8,
                id: "96",
                initialAmount: 0,
                labelAmount: 10000,
                maxStorageTime: 0,
                mixTime: 0,
                onlySingleOut: false,
                partNumber: "118S0176",
                partitionCount: 2,
                plateSize: 7,
                posName: "CS0004-2",
                provider: "CYNTEC",
                providerNumber: "797001",
                putInDate: "2022-12-01 15:56:07",
                putInTime: 1669881367304,
                putInTimeStr: "2022-12-01 15:56:304",
                reelAmount: 1,
                relationCodes: [],
                size: "7X8",
                solder: false,
                solderStatus: 0,
                startWarmTime: -1,
                status: 0,
                thickness: "",
                type: 0,
                updateDate: "2022-12-01 15:56:07",
                used: false,
                usedCount: 0,
                warehouseCode: "W10B",
                warmTime: 0,
              },
            ],
            createDate: "2022-12-01 15:55:05",
            firstPutInDate: "2022-12-01 16:29:47",
            fullCode: "CS0004-1",
            height: 8,
            id: "90",
            initialAmount: 0,
            labelAmount: 0,
            maxStorageTime: 0,
            mixTime: 0,
            onlySingleOut: false,
            outOpor: "",
            partNumber: "CS",
            partitionCount: 0,
            plateSize: 7,
            posName: "B19",
            putInDate: "2022-12-02 14:05:57",
            putInTime: 1669883387333,
            putInTimeStr: "2022-12-01 16:29:333",
            reelAmount: 3,
            relationCodes: [],
            size: "7X8",
            solder: false,
            solderStatus: 0,
            startWarmTime: -1,
            status: 0,
            subCodeList: [
            ],
            thickness: "",
            type: 0,
            updateDate: "2022-12-02 14:05:57",
            used: true,
            usedCount: 4,
            usedDate: "2022-12-01 17:03:30",
            warmTime: 0,
          },
          canCheckOutTime: 1669961157870,
          enabled: true,
          groupId: "",
          groupName: "",
          h: 8,
          humidity: "",
          id: "59",
          labelId: "",
          labelName: "",
          posName: "B19",
          priority: 19,
          storageId: "3",
          temperature: "",
          used: true,
          w: 7,
          warmPos: false,
        },
      ];

可以看出

有的数据中没有 children 字段,有的有 children 字段后端返回的树形结构数据一个 二级数据格式 ,还需要前端处理,将 children 中每一条数据里的 posName 字段值取出来 并赋值给一个 barcode 的新字段 加上id 组成第二级数据,后端返回的 第二层级数据 作为 树形结构的 第三层级数据 使用

js代码

  methods: {
  //从接口中获取数据
    getList() {
      let data = this.query;
      outerInventory(data).then((res) => {
        this.pageLength = res.totalElements;
        this.changeTableJson(res.content); //调用组装数据方法
      });
    },
    // 组装表格需要的数据格式
    changeTableJson(listArray) {
      if (!this.isLoading) {
        const list2 = [];
        for (let jsonElement of listArray) {
          if (!jsonElement.barcode || !jsonElement.barcode.children) {
            list2.push(jsonElement);
            continue;
          }
          jsonElement.barcode.children = jsonElement.barcode.children.map(
            (item) => {
              if (item.barcode) {
                let temp = JSON.parse(JSON.stringify(item));
                return {
                  id: Math.floor(Math.random() * 1000) + "",
                  barcode: item.posName,
                  children: [temp],
                };
              }
            }
          );
          list2.push(jsonElement.barcode);
        }
        this.tableData = list2;
        this.isLoading = true;
        console.log(list2);
      }
    },
}

三级树形结构 官方例子

<el-table
      :data="tableData1"
      style="width: 100%"
      row-key="id"
      :tree-props="{children: 'children'}">
      <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>
data() {
    return {
      tableData1: [{
        id: 1,
        date: '2016-05-02',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄'
      },
      {
        id: 2,
        date: '2016-05-04',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1517 弄',
        children: [
          {
            id: 31,
            date: '2020-05-01',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1519 弄',
            children: [
              {
                id: 33,
                date: '2020-05-32',
                name: '王小虎',
                address: '上海市普陀区金沙江路 1519 弄'
              }
            ]
          },
          {
            id: 32,
            date: '2020-05-32',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1519 弄',
            children: [
              {
                id: 34,
                date: '2020-05-32',
                name: '王小虎',
                address: '上海市普陀区金沙江路 1519 弄'
              }
            ]
          }
        ]
      },
      {
        id: 3,
        date: '2016-05-01',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1519 弄',
      },
      {
        id: 4,
        date: '2016-05-03',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1516 弄'
      }]
    }
  },

实现效果

到此这篇关于el-table 树形数据 tree-props 多层级使用避坑的文章就介绍到这了,更多相关el-table tree-props 多层级使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue关于Element UI中的文本域换行问题

    Vue关于Element UI中的文本域换行问题

    这篇文章主要介绍了Vue关于Element UI中的文本域换行问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • vue 使用el-table循环生成表格的过程

    vue 使用el-table循环生成表格的过程

    这篇文章主要介绍了vue 使用el-table循环生成表格的过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • vue-cli3+typescript新建一个项目的思路分析

    vue-cli3+typescript新建一个项目的思路分析

    这篇文章主要介绍了vue-cli3+typescript新建一个项目的思路,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • Vue利用Mixin轻松实现代码复用

    Vue利用Mixin轻松实现代码复用

    Mixin,中文翻译为"混入",在Vue中是一种非常有用的功能,可以解决许多开发中的常见问题,下面就让我们一起深入了解一下Mixin在Vue中解决了哪些问题吧
    2023-06-06
  • vite结合electron构建前端桌面应用程序

    vite结合electron构建前端桌面应用程序

    本文主要介绍了vite结合electron构建前端桌面应用程序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Vue3+Vite项目使用mockjs随机模拟数据

    Vue3+Vite项目使用mockjs随机模拟数据

    这篇文章主要介绍了Vue3+Vite项目使用mockjs随机模拟数据,需要的朋友可以参考下
    2023-01-01
  • vue-cil之axios的二次封装与proxy反向代理使用说明

    vue-cil之axios的二次封装与proxy反向代理使用说明

    这篇文章主要介绍了vue-cil之axios的二次封装与proxy反向代理使用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • vue中使用Animate.css的教程详解

    vue中使用Animate.css的教程详解

    Animate.css这个动画库,很多的动画在这个库里面都定义好了,我们用的时候可以直接使用里面的类名就可以,下面我们就来看看如何在vue项目中使用Animate.css吧
    2023-08-08
  • vue-openlayers实现地图坐标弹框效果

    vue-openlayers实现地图坐标弹框效果

    这篇文章主要为大家详细介绍了vue-openlayers实现地图坐标弹框效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • Vue2为何能通过this访问到data与methods的属性

    Vue2为何能通过this访问到data与methods的属性

    这篇文章主要介绍了Vue2为何能通过this访问到data与methods的属性,文章围绕主题展开详细的内容戒杀,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09

最新评论