element UI表格绑定动态数据与selection复选操作的坑

本文介绍如何在使用分页和批量删除功能的Vue项目中解决表格复选功能重复执行的问题,通过调整事件处理和数据绑定策略,确保批量删除按钮的状态正确反映用户选择。

案例介绍:此案例是要求完成对客户的批量删除功能,因为客户有多条数据所以要结合分页组件来实现,并且批量删除按钮默认是禁用的,当有数据被选中时变为可用状态。
在这里插入图片描述

<el-table></el-table>的数据:data是一个动态数据时(分页功能导致),若表格具备selection列,且对当前操作的事件(例如selection-change)也具备对变量的操作时:表格的复选功能会执行两次

示例代码:

<!--批量删除按钮-->
<el-button type="danger" :disabled="isDisabled"
@click="btnDelMultiple">批量删除</el-button>

<!--表格-->
<el-table @selection-change="selectionChange"
	:data="clientData.slice((currentPage-1)*sizePerPage,currentPage*sizePerPage)">
	<el-table-column type="selection" align="center"></el-table-column>
	<el-table-column label="客户姓名" prop="name" align="center"></el-table-column>
	... ...
</el-table>

<!--分页组件-->
<el-row class="pagination">
	<el-col :span="14" :offset="5">
		<el-pagination @current-change="currentChange" :total="clientData.length" :page-size="sizePerPage"></el-pagination>
	</el-col>
</el-row>
data(){
	return {
		clientData:[], //所有客户信息
		isDisabled:true, //批量删除按钮是否被禁用
		userClients:[], //要删除的客户组成的数组
		sizePerPage:5,  //分页中每页数据的个数
		currentPage:1,  //当前页面
	}
},
mounted(){
	let url = '/api/staff/clientQueryByWid.jsp';
	let data = {
		wid:this.workerId
	};
	this.$axios.post(url,this.qs.stringify(data)).then(res=>{
		// console.log(res.data);
		this.clientData = res.data
	})
}
//checkbox多选操作
selectionChange(selection){
	console.log(selection);	//所有被选中的元素的集合,组成的数组
	this.userClients = selection;	//把删除的客户组成的数组赋值给数据区变量
	if(selection.length > 0){
		this.isDisabled = false;
		console.log('批量删除按钮可用');
	}else{
		this.isDisabled = true;
		console.log('批量删除按钮不可用');
	}
},

此时,由下图看出表格的复选功能会连着执行两次
在这里插入图片描述

解决方案:

(1)让事件不具备对变量的操作。

可以让批量删除按钮一直处于可用状态,当点击按钮时判断有没有数据被选中,如果没有提示弹框让用户选择要删除数据,如果有就接着执行下面的操作。

(2)让表格的数据不再是一个动态数据。

首先定义一个currentData作为当前分页的数据在表格中用:data动态绑定,分析一下currentData和哪些数据有关系?
之前:data绑定的数据是:data=clientData.slice((currentPage-1)*sizePerPage,currentPage*sizePerPage)
所以当clientData(所有客户信息)或者currentPage(当前页面)发生变化时currentData都会发生改变。

可以在计算属性(computed)中将currentData作为计算属性,将clientData(所有客户信息)于currentPage(当前页面)作为计算属性的依赖变量实现,当计算属性的依赖变量发生变化时计算属性也随之改变。
但是在此案例中,所有客户信息在mounted()钩子函数中获取,由于计算属性先于mounted()执行。当操作所有客户信息数据时,所有客户信息数据还没有获取到,所以会报错,因此此方案不可取。
想更多了解计算属性,可以看小编之前写的文章:Vue计算属性和侦听属性

可以在watch侦听属性中将clientData(所有客户信息)于currentPage(当前页面)作为被侦听的变量,当被侦听的变量发生变化时执行侦听属性所对应的函数也随之发生变化。
如下代码:

<!--表格-->
<el-table @selection-change="selectionChange" :data="currentData">

</el-table>
data(){
	return {
		currentData:[], //当前页面的数据
	}
},
watch:{
	clientData(newValue,oldValue){
		this.currentData = newValue.slice((this.currentPage-1)*this.sizePerPage,this.currentPage*this.sizePerPage);
	},
	currentPage(newValue,oldValue){
		this.currentData = this.clientData.slice((newValue-1)*this.sizePerPage,newValue*this.sizePerPage);
	}
}
Element UI 的 `el-table` 表格组件中实现复选框已选项的回显,关键在于如何正确设置和维护表格的多选状态。以下是一个完整的实现方案: ### 1. 使用 `reserve-selection` 属性保留选中状态 Element UI 提供了一个属性 `reserve-selection`,用于在数据更新时保留之前选中的行。该属性必须作用于 `el-table-column` 上,并且该列是类型为 `type="selection"` 的列。 示例代码如下: ```html <el-table :data="tableData" style="width: 100%"> <el-table-column type="selection" reserve-selection></el-table-column> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> </el-table> ``` 通过设置 `reserve-selection="true"`,即使表格数据刷新或分页切换,用户之前勾选的行仍会保持选中状态[^1]。 --- ### 2. 初始化时回显默认选中项 若需要在页面加载或数据初始化时默认选中某些行,可以通过调用 `toggleRowSelection` 方法实现。该方法允许程序控制某一行是否被选中。 示例代码如下: ```javascript export default { data() { return { tableData: [ { id: 1, name: '张三', age: 25 }, { id: 2, name: '李四', age: 30 }, { id: 3, name: '王五', age: 28 } ], selectedRows: [] }; }, mounted() { // 假设希望默认选中 id 为 1 的行 const rowToSelect = this.tableData.find(row => row.id === 1); this.$refs.multipleTable.toggleRowSelection(rowToSelect, true); } }; ``` 在模板中引用表格: ```html <el-table ref="multipleTable" :data="tableData" style="width: 100%"> <el-table-column type="selection"></el-table-column> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> </el-table> ``` 此方式适用于在数据加载完成后主动触发选中行为,从而实现“回显”效果[^2]。 --- ### 3. 自定义表头复选框状态同步 如果使用了自定义表头(例如添加额外的复选框作为全选控件),则需要注意手动管理选中状态表格内部状态的同步。可以通过监听 `@selection-change` 事件并结合 `toggleRowSelection` 实现。 示例代码如下: ```html <el-table :data="tableData" @selection-change="handleSelectionChange"> <el-table-column type="selection"></el-table-column> <el-table-column prop="name" label="姓名"> <template slot="header"> <span>姓名</span> <el-checkbox v-model="checkAll" @change="handleCheckAll"></el-checkbox> </template> </el-table-column> </el-table> ``` 对应的逻辑处理: ```javascript methods: { handleSelectionChange(selection) { this.selectedRows = selection; this.checkAll = selection.length === this.tableData.length; }, handleCheckAll(val) { this.tableData.forEach(row => { this.$refs.multipleTable.toggleRowSelection(row, val); }); } } ``` 这种方式可以增强交互体验,使表头复选表格内部状态保持一致[^3]。 --- ### 总结 - 使用 `reserve-selection` 可以在数据更新时保留已选中项。 - 使用 `toggleRowSelection` 可以实现初始化时默认选中特定行。 - 对于自定义表头,需手动绑定和同步复选框状态。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值