vue+element-树形table子节点数据实现实时刷新(亲测可用)

一、问题描述:

vue-element 使用树形结构的table,即可收缩的table时,由于设置lazy懒加载,导致无法在修改或删除child子列表后实时刷新。

二、问题分析:

由于官方文档并没有提供相关刷新方法,需要我们自己来实现。

实现刷新的关键点在于resolve方法

于是我们在load绑定的方法中需要将resolve保存下来,

三、具体实现:

第一步:首先在data中定义一个map

 maps: new Map(),

第二步:在load绑定的方法中保存,通过父级id作为key,将节点的数据,和resolve保存在map中

this.maps.set(row.id, { row, treeNode, resolve })

第三步:定义一个刷新子列表的方法

refresh(parentId) {

// 根据父级id取出对应节点数据

const { row, treeNode, resolve } = this.maps.get(parentId)

this.$set(this.$refs.multipleTable.store.states.lazyTreeNodeMap, parentId, [])

if (row) {

this.loadTree(row, treeNode, resolve)

}

},

第四步:注意一个变量名称 this.$refs.multipleTable需要配置到table中

  <el-table
        ref="multipleTable"
        :data="tableData"
        style="width: 100%"
        row-key="id"
        border
        lazy
        :load="loadTree"
        :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
      >

第五步:在删除或修改成功后,根据实际情况调用fresh方法刷新子列表,或调用其他方法刷新父列表

完美收工,亲测可用

 

Vue Element-UI的树形Table组件可以通过设置show-checkbox属性来显示复选框,但是默认情况下只会在非叶子节点上显示复选框,如果需要在最后一层也显示复选框,可以通过以下两种方式实现: 1. 使用slot-scope自定义单元格内容 在template中使用slot-scope自定义单元格内容,通过判断当前行是否为最后一层来显示复选框。 ```html <el-table :data="data" style="width: 100%"> <el-table-column type="selection" width="55"></el-table-column> <el-table-column prop="name" label="名称"></el-table-column> <el-table-column label="操作"> <template slot-scope="{ row }"> <el-checkbox v-if="isLastLevel(row)" v-model="checkedNodes" :label="row.id"></el-checkbox> </template> </el-table-column> </el-table> ``` 在methods中定义isLastLevel方法来判断当前行是否为最后一层: ```javascript methods: { isLastLevel(row) { return !row.children || row.children.length === 0; } } ``` 2. 使用tree-node-key属性指定叶子节点的key值 在使用树形数据时,可以通过tree-node-key属性指定叶子节点的key值,然后在show-checkbox属性中使用leaf-only来显示所有叶子节点的复选框。 ```html <el-table :data="data" :tree-props="{children: 'children', hasChildren: 'hasChildren', id: 'id', label: 'name', key: 'id'}" :tree-node-key="'id'" :show-checkbox="true" :leaf-only="true" style="width: 100%"> <el-table-column prop="name" label="名称"></el-table-column> <el-table-column label="操作"> <template slot-scope="{ row }"> <el-checkbox v-model="checkedNodes" :label="row.id"></el-checkbox> </template> </el-table-column> </el-table> ``` 在这种方式下,只需要在template中直接显示复选框即可,不需要判断当前行是否为最后一层。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值