结合组件库实现table组件树状数据的增删改

如图所示,可以实现树状数据的新增子项,新增平级,删除。主要用到了递归

代码:

<template>
  <el-table :data="tableData" style="width: 100%; margin-bottom: 20px" row-key="id" border default-expand-all>
    <el-table-column prop="date" label="Date" />
    <el-table-column prop="name" label="Name" />
    <el-table-column prop="address" label="Address" />
    <el-table-column label="Operations">
      <template #default="scope">
        <el-button size="small" @click="add(scope.row)">新增平级</el-button>
        <el-button size="small" @click="addSon(scope.row)">新增子级</el-button>
        <el-button size="small" type="danger" @click="delItem(scope.row)">删除</el-button>
      </template>
    </el-table-column>
  </el-table>
</template>

<script lang="ts" setup>
import { ref } from 'vue'

const tableData = ref([
  {
    id: 1,
    date: '2016-05-02',
    name: 'wangxiaohu',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    id: 2,
    date: '2016-05-04',
    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',
      },
    ],
  },
  {
    id: 4,
    date: '2016-05-03',
    name: 'wangxiaohu',
    address: 'No. 189, Grove St, Los Angeles',
  },
])

// 平级新增递归的方法
const addLeaveLoop = (arr: any[], id: number | string) => {
  for (let i = 0; i < arr.length; i++) {
    if (arr[i].id === id) {
      arr.splice(i + 1, 0, { id: +new Date(), date: '2023-11-03', name: '辉辉', address: 'dashjdsakljdl' })
    } else if (arr[i].children) {
      arr[i].children = addLeaveLoop(arr[i].children, id)
    }
  }
  return arr
}
// 新增平级
const add = (row: any) => {
  addLeaveLoop(tableData.value, row.id)
}

// 新增一个子节点的方法
const addSonLoop = (arr: any[], id: number | string) => {
  for (let i = 0; i < arr.length; i++) {
    if (arr[i].id === id) {
      // 判断有没有children,有就前面新增,没有就创建
      if (arr[i].children && arr[i].children.length) {
        arr[i].children.unshift({ id: +new Date(), date: '2023-11-03', name: '张三', address: 'dashjdsakljdl' })
      } else {
        arr[i].children = [{ id: +new Date(), date: '2023-11-03', name: '李四', address: 'dashjdsakljdl' }]
      }
    } else if (arr[i].children) {
      arr[i].children = addSonLoop(arr[i].children, id)
    }
  }
  return arr
}
// 新增子级
const addSon = (row: any) => {
  addSonLoop(tableData.value, row.id)
}

// 删除递归的方法
const delLoop = (arr: any[], id: number | string) => {
  for (let i = 0; i < arr.length; i++) {
    if (arr[i].id === id) {
      arr.splice(i, 1)
    } else if (arr[i].children) {
      arr[i].children = delLoop(arr[i].children, id)
    }
  }
  return arr
}
// 删除
const delItem = (row: any) => {
  delLoop(tableData.value, row.id)
}
</script>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要在 Element Plus 的 el-table 组件实现表头合并,可以使用 el-table-column 组件的属性:`colspan` 和 `rowspan`。其中,`colspan` 表示列合并数,`rowspan` 表示行合并数。 具体实现步骤如下: 1. 在 el-table 中定义表头,使用 el-table-column 定义每一列的表头,需要合并的单元格设置 `colspan` 和 `rowspan` 属性。 2. 在表格数据中,需要将需要合并的单元格的值设置为 null。 下面是一个示例代码,用来展示如何在 Element Plus 中实现表头合并: ```html <el-table :data="tableData"> <el-table-column prop="name" label="姓名" rowspan="2"></el-table-column> <el-table-column prop="age" label="年龄" colspan="2"></el-table-column> <el-table-column prop="address" label="地址" rowspan="2"></el-table-column> <el-table-column prop="date" label="日期" rowspan="2"></el-table-column> <el-table-column prop="status" label="状态" rowspan="2"></el-table-column> <el-table-column prop="score" label="分数" colspan="3"></el-table-column> </el-table> ``` ```js tableData: [ { name: '张三', age: 18, address: '北京市', date: '2021-06-01', status: '通过', score: [80, 90, 85] }, { name: '李四', age: 20, address: '上海市', date: '2021-06-02', status: '未通过', score: [70, 65, 80] }, { name: null, age: '平均值', address: null, date: null, status: null, score: [75, 77.5, 82.5] }, ], ``` 在上面的代码中,第一列的表头“姓名”需要合并两行,使用 `rowspan="2"` 实现。第二列的表头“年龄”需要合并两列,使用 `colspan="2"` 实现。最后一列的表头“分数”需要合并三列,使用 `colspan="3"` 实现。在表格数据中,第一个数据行的第一列和第三列需要合并,将其值设置为 null。 注意:`rowspan` 和 `colspan` 的值必须是正整数,不能为 0 或负数。同时,合并单元格时需要保证数据的正确性,否则可能会出现显示错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值