elmentui中table组件中父子结构勾选的相关问题

elmentui中table组件中父子结构勾选的相关问题

业务场景

在使用 element-ui 中的 table 组件并以父子结构展示数据时,有勾选的需求,需要在勾选父数据时,将子数据一起勾选,取消勾选父数据也会将子数据取消勾选;但是在 element-ui 中并没有提供现成的方法;

实现

思路:使用 table 组件中的 select 方法(每次勾选或者取消勾选时都会触发该方法),并以 isCheck 字段存储数据的勾选状态,便于后续操作中有回显勾选数据的操作;

例子(使用的是 vue):
// vue
<el-table
    ref="districtTable"
    :data="tableData"
    row-key="id"
    @select="handleSelectionChange"
    :tree-props="{children: 'children', hasChildren: 'hasChildren'}">
    <el-table-column
      type="selection"
      width="55">
    </el-table-column>
    ...
</el-table>
<button @click="getTargetData">获取表格数据</button>
handleSelectionChange(select, row) {
    let dataArr = [row]; // 将数据改造为数组,便于封装后的方法 changeRow 进行操作
    // 如果当前的数据的 isCheck 没有被勾选过,则该字段的值应该为 false/undefined
    // 给该数据定义后续操作是需要勾选还是取消勾选
    if (row.isCheck) {
      row.isCheck = false
    } else {
      row.isCheck = true
    }
    this.changeRow(dataArr, row.isCheck)
},
  
// data - 需要进行操作的数据
// type - 要进行的操作类型(true-需要被勾选,false-需要取消勾选)
changeRow(data, type) {
    Array.from(data).forEach((row) => {
      row.isCheck = type;
      this.$refs.districtTable.toggleRowSelection(row, type); // element-ui 自带的方法,用于改变传入参数 row 的勾选状态
      if (row.children && row.children.length > 0) { // 判断当前数据是否有子数据,如果有则进行递归操作
        this.changeRow(row.children, type);
      }
    });
},
getTargetData() { // 获取 table 数据
  console.log(this.$refs.districtTable.selection)
},
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现表单翻页后回显已经勾选过的数据,可以采用以下步骤: 1. 在每个表格行上添加一个复选框,用来记录用户的选择状态。 2. 在翻页时,记录当前页已经勾选的数据,可以使用数组或者对象来存储。 3. 在翻页后,根据记录的已勾选数据,重新勾选表格的复选框。 4. 如果用户在翻页后修改了勾选状态,需要更新记录的已勾选数据。 下面是一个简单的示例代码: ```html <template> <div> <el-table :data="tableData" :row-key="row => row.id" @selection-change="handleSelectionChange" > <el-table-column type="selection" /> <el-table-column prop="name" label="Name" /> <el-table-column prop="age" label="Age" /> </el-table> <el-pagination :current-page="currentPage" :page-size="pageSize" :total="total" @current-change="handlePageChange" /> </div> </template> <script> export default { data() { return { tableData: [], currentPage: 1, pageSize: 10, total: 0, selectedData: {} // 记录已勾选的数据 } }, mounted() { this.fetchData() }, methods: { fetchData() { // 发送请求获取当前页的数据 // ... // 假设数据格式如下 const data = { list: [ { id: 1, name: 'Alice', age: 18 }, { id: 2, name: 'Bob', age: 20 }, // ... ], total: 100 } this.tableData = data.list this.total = data.total // 根据已勾选数据重新勾选复选框 this.$nextTick(() => { for (const [key, value] of Object.entries(this.selectedData)) { if (value) { const row = this.tableData.find(item => item.id === parseInt(key)) if (row) { this.$refs.table.toggleRowSelection(row, true) } } } }) }, handleSelectionChange(selection) { // 更新已勾选数据 for (const row of selection) { this.$set(this.selectedData, row.id, true) } for (const [key, value] of Object.entries(this.selectedData)) { if (!selection.find(row => row.id === parseInt(key))) { this.$set(this.selectedData, key, false) } } }, handlePageChange(page) { // 更新当前页码并重新获取数据 this.currentPage = page this.fetchData() } } } </script> ``` 在这个示例,我们使用了 Element UI 的表格组件和分页组件。在表格上添加了一个复选框列,并监听了 `selection-change` 事件,在事件回调更新了已勾选数据。 在分页组件上监听了 `current-change` 事件,在事件回调更新了当前页码并重新获取数据。在获取数据后,通过 `$refs.table.toggleRowSelection` 方法重新勾选了表格的复选框。 这个示例的 `selectedData` 对象用来记录已经勾选的数据,它的 key 是数据的 id,value 是一个布尔值,表示该数据是否已经勾选。在勾选或取消勾选时,我们使用了 `$set` 方法来更新这个对象,这样才能触发 Vue 的响应式更新。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值